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 }