1 cananian 1.1.4.1 // HClassArray.java, created Wed Dec 29 22:24:55 1999 by cananian
 2 cananian 1.1.4.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.4.1 package harpoon.ClassFile;
 5 cananian 1.1.4.1 
 6 cananian 1.3     import java.lang.reflect.Modifier;
 7 cananian 1.1.4.1 
 8 cananian 1.3     import net.cscott.jutil.Util;
 9 cananian 1.1.4.1 /**
10 cananian 1.1.4.1  * <code>HClassArray</code> is a simple <code>HClass</code> implementation
11 cananian 1.1.4.1  * representing array types.
12 cananian 1.1.4.1  * 
13 cananian 1.1.4.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
14 cananian 1.3      * @version $Id: HClassArray.java,v 1.3 2004/02/08 01:58:03 cananian Exp $
15 cananian 1.1.4.1  */
16 cananian 1.1.4.1 class HClassArray extends HClassImpl {
17 cananian 1.1.4.1   HClass baseType;
18 cananian 1.1.4.1   int dims;
19 cananian 1.1.4.1   HField lengthField;
20 cananian 1.1.4.1   HMethod cloneMethod;
21 cananian 1.1.4.1 
22 cananian 1.1.4.1   HClassArray(Linker linker, HClass baseType, int dims) {
23 cananian 1.1.4.1     super(linker);
24 cananian 1.1.4.1     this.baseType = baseType; this.dims = dims;
25 cananian 1.1.4.1     this.lengthField = new HArrayField(this, "length", HClass.Int,
26 cananian 1.1.4.1                                        Modifier.PUBLIC | Modifier.FINAL);
27 cananian 1.1.4.1     this.cloneMethod = new HArrayMethod(this, "clone",
28 cananian 1.1.4.1                                         Modifier.PUBLIC | Modifier.NATIVE,
29 cananian 1.1.4.4                                         linker.forName("java.lang.Object"),
30 cananian 1.1.4.4                                         new HClass[0], new String[0],
31 cananian 1.1.4.1                                         new HClass[0], false);
32 cananian 1.1.4.1   }
33 cananian 1.1.4.1   public HClass getComponentType() {
34 cananian 1.1.4.1     return getLinker().forDescriptor(getDescriptor().substring(1));
35 cananian 1.1.4.1   }
36 cananian 1.1.4.1   public String getName() {
37 cananian 1.1.4.1     // handle arrays.
38 cananian 1.1.4.1     return getDescriptor(); // this is how sun's implementation works.
39 cananian 1.1.4.1   }
40 cananian 1.1.4.1   public String getDescriptor() {
41 cananian 1.1.4.1     return Util.repeatString("[", dims) + baseType.getDescriptor();
42 cananian 1.1.4.1   }
43 cananian 1.1.4.1   public HField [] getDeclaredFields () { 
44 cananian 1.1.4.1     return new HField[] { lengthField };
45 cananian 1.1.4.1   }
46 cananian 1.1.4.1   public HMethod[] getDeclaredMethods() {
47 cananian 1.1.4.1     return new HMethod[] { cloneMethod };
48 cananian 1.1.4.1   }
49 cananian 1.1.4.3   public int getModifiers() {
50 cananian 1.1.4.3     // this is what java.lang.Class returns.
51 cananian 1.1.4.3     return Modifier.PUBLIC | Modifier.ABSTRACT | Modifier.FINAL;
52 cananian 1.1.4.3   }
53 cananian 1.1.4.4   public HClass getSuperclass() {
54 cananian 1.1.4.4     return getLinker().forName("java.lang.Object");
55 cananian 1.1.4.4   }
56 cananian 1.1.4.1   public HClass[] getInterfaces() {
57 cananian 1.1.4.1     // see http://java.sun.com/docs/books/jls/clarify.html
58 cananian 1.1.4.4     return new HClass[] {
59 cananian 1.1.4.4       getLinker().forName("java.lang.Cloneable"),
60 cananian 1.1.4.4       getLinker().forName("java.io.Serializable"),
61 cananian 1.1.4.4     };
62 cananian 1.1.4.1   }
63 cananian 1.1.4.1   public boolean isArray() { return true; }
64 cananian 1.1.4.1 }
65 cananian 1.1.4.1 
66 cananian 1.1.4.1 // set emacs indentation style.
67 cananian 1.1.4.1 // Local Variables:
68 cananian 1.1.4.1 // c-basic-offset:2
69 cananian 1.2     // End: