1 cananian 1.1.2.2 // ConstantNameAndType.java, created Mon Jan 18 22:44:37 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.IR.RawClass;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 /**
 7 cananian 1.1.2.1  * The <code>CONSTANT_NameAndType_info</code> structure is used to
 8 cananian 1.1.2.1  * represent a field or method, without indicating which class or
 9 cananian 1.1.2.1  * interface type it belongs to.
10 cananian 1.1.2.1  *
11 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
12 cananian 1.2      * @version $Id: ConstantNameAndType.java,v 1.2 2002/02/25 21:05:27 cananian Exp $
13 cananian 1.1.2.1  * @see "The Java Virtual Machine Specification, section 4.4.6"
14 cananian 1.1.2.1  * @see Constant
15 cananian 1.1.2.1  */
16 cananian 1.1.2.1 public class ConstantNameAndType extends Constant {
17 cananian 1.1.2.1   /** The value of the <code>name_index</code> must be a valid index
18 cananian 1.1.2.1       into the <code>constant_pool</code> table.  The
19 cananian 1.1.2.1       <code>constant_pool</code> entry at that index must be a
20 cananian 1.1.2.1       <code>CONSTANT_Utf8_info</code> structure representing a valid
21 cananian 1.1.2.1       Java field name or method name stored as a simple (not fully
22 cananian 1.1.2.1       qualified) name, that is, as a Java identifier. */
23 cananian 1.1.2.1   public int name_index;
24 cananian 1.1.2.1   /** the value of the <code>descriptor_index</code> must be a valid
25 cananian 1.1.2.1       index into the <code>constant_pool</code> table.  The
26 cananian 1.1.2.1       <code>constant_pool</code> entry at that index must be a
27 cananian 1.1.2.1       <code>CONSTANT_Utf8_info</code> structure representing a valid
28 cananian 1.1.2.1       Java field descriptor or method descriptor. */
29 cananian 1.1.2.1   public int descriptor_index;
30 cananian 1.1.2.1 
31 cananian 1.1.2.1   /** Constructor. */
32 cananian 1.1.2.1   ConstantNameAndType(ClassFile parent, ClassDataInputStream in) 
33 cananian 1.1.2.1     throws java.io.IOException {
34 cananian 1.1.2.1     super(parent);
35 cananian 1.1.2.1     name_index = in.read_u2();
36 cananian 1.1.2.1     descriptor_index = in.read_u2();
37 cananian 1.1.2.1   }
38 cananian 1.1.2.1   /** Constructor. */
39 cananian 1.1.2.1   public ConstantNameAndType(ClassFile parent, 
40 cananian 1.1.2.1                              int name_index, int descriptor_index) {
41 cananian 1.1.2.1     super(parent);
42 cananian 1.1.2.1     this.name_index = name_index;
43 cananian 1.1.2.1     this.descriptor_index = descriptor_index;
44 cananian 1.1.2.1   }
45 cananian 1.1.2.1 
46 cananian 1.1.2.1   /** Write to a bytecode file. */
47 cananian 1.1.2.1   public void write(ClassDataOutputStream out) throws java.io.IOException {
48 cananian 1.1.2.1     out.write_u1(CONSTANT_NameAndType);
49 cananian 1.1.2.1     out.write_u2(name_index);
50 cananian 1.1.2.1     out.write_u2(descriptor_index);
51 cananian 1.1.2.1   }
52 cananian 1.1.2.1 
53 cananian 1.1.2.1   // convenience.
54 cananian 1.1.2.1   public ConstantUtf8 name_index()
55 cananian 1.1.2.1   { return (ConstantUtf8) parent.constant_pool[name_index]; }
56 cananian 1.1.2.1   public ConstantUtf8 descriptor_index()
57 cananian 1.1.2.1   { return (ConstantUtf8) parent.constant_pool[descriptor_index]; }
58 cananian 1.1.2.1 
59 cananian 1.1.2.1   public String name() { return name_index().val; }
60 cananian 1.1.2.1   public String descriptor() { return descriptor_index().val; }
61 cananian 1.1.2.1 
62 cananian 1.1.2.1   /** Create a human-readable representation of this constant. */
63 cananian 1.1.2.1   public String toString() {
64 cananian 1.1.2.1     return "CONSTANT_NameAndType: " + 
65 cananian 1.1.2.1       name()+" {"+name_index+"} " +
66 cananian 1.1.2.1       descriptor()+" {"+descriptor_index+"}";
67 cananian 1.1.2.1   }
68 cananian 1.2     }