1 cananian 1.1.2.1 // ClassPointer.java, created Thu Dec 10 23:40:21 1998 by cananian
 2 cananian 1.1.2.2 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.2 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.ClassFile;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import harpoon.Util.Util;
 7 cananian 1.1.2.1 /**
 8 cananian 1.1.2.1  * A <code>ClassPointer</code> is a <i>pointer to</i> an HClass, without being
 9 cananian 1.1.2.1  * the HClass itself.
10 cananian 1.1.2.1  * 
11 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
12 cananian 1.4      * @version $Id: ClassPointer.java,v 1.4 2002/04/10 03:04:12 cananian Exp $
13 cananian 1.1.2.1  */
14 cananian 1.1.2.4 class ClassPointer extends HPointer implements java.io.Serializable {
15 cananian 1.1.2.3     final Linker linker;
16 cananian 1.1.2.1     final String descriptor;
17 cananian 1.1.2.3     ClassPointer(Linker linker, String descriptor) {
18 cananian 1.3.2.2         assert descriptor.indexOf('.')==-1 ; // slashes, not dots.
19 cananian 1.1.2.1         // trim descriptor.
20 cananian 1.1.2.1         int i;
21 cananian 1.1.2.1         for (i=0; i<descriptor.length(); i++) {
22 cananian 1.1.2.1             char c = descriptor.charAt(i);
23 cananian 1.1.2.1             if (c=='[') continue;
24 cananian 1.1.2.1             if (c=='L') i = descriptor.indexOf(';', i);
25 cananian 1.3.2.1             assert c!='(' && c!=')' && c!='/' && c!=';' : descriptor;
26 cananian 1.1.2.1             break;
27 cananian 1.1.2.1         }
28 cananian 1.1.2.1         descriptor = descriptor.substring(0,i+1);
29 cananian 1.1.2.1         // assign.
30 cananian 1.1.2.3         this.linker = linker;
31 cananian 1.1.2.1         this.descriptor = descriptor;
32 cananian 1.1.2.1     }
33 cananian 1.1.2.4     ClassPointer(HClass hc) { this(hc.getLinker(), hc.getDescriptor()); }
34 cananian 1.1.2.3     HClass actual() { return linker.forDescriptor(descriptor); }
35 cananian 1.1.2.1     String getDescriptor() { return descriptor; }
36 cananian 1.1.2.1     String getName() {
37 cananian 1.1.2.1         // yes, unfortunately we can have HPointers to primitives and arrays.
38 cananian 1.1.2.1         char first = descriptor.charAt(0);
39 cananian 1.1.2.1         if (first=='L')
40 cananian 1.1.2.1             return descriptor
41 cananian 1.1.2.1                 .substring(1, descriptor.indexOf(';'))
42 cananian 1.1.2.1                 .replace('/','.');
43 cananian 1.1.2.1         else if (first=='[')
44 cananian 1.1.2.1             return descriptor; // how sun's implementation works.
45 cananian 1.1.2.1         else if (first=='Z') return "boolean";
46 cananian 1.1.2.1         else if (first=='B') return "byte";
47 cananian 1.1.2.1         else if (first=='S') return "short";
48 cananian 1.1.2.1         else if (first=='I') return "int";
49 cananian 1.1.2.1         else if (first=='J') return "long";
50 cananian 1.1.2.1         else if (first=='F') return "float";
51 cananian 1.1.2.1         else if (first=='D') return "double";
52 cananian 1.1.2.1         else if (first=='C') return "char";
53 cananian 1.1.2.1         else if (first=='V') return "void";
54 cananian 1.3.2.1         else assert false : "Illegal descriptor.";
55 cananian 1.1.2.1         return null; // javac is stupid.
56 cananian 1.1.2.1     }
57 cananian 1.2     }