1 cananian 1.2.2.4 // OpField.java, created Sun Sep 13 22:49:23 1998 by cananian
 2 cananian 1.2     // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.2     // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1     package harpoon.IR.Bytecode;
 5 cananian 1.1     
 6 cananian 1.2.2.3 import harpoon.ClassFile.HClass;
 7 cananian 1.2.2.3 import harpoon.ClassFile.HField;
 8 cananian 1.2.2.2 import harpoon.IR.RawClass.Constant;
 9 cananian 1.2.2.2 import harpoon.IR.RawClass.ConstantFieldref;
10 cananian 1.1     
11 cananian 1.1     /**
12 cananian 1.1      * <code>OpField</code> represents a field reference operand of a
13 cananian 1.1      * java bytecode instruction.  It is generated from a
14 cananian 1.1      * <code>CONSTANT_Fieldref</code> constant pool entry.
15 cananian 1.1      *
16 cananian 1.1      * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
17 cananian 1.3      * @version $Id: OpField.java,v 1.3 2002/02/25 21:04:17 cananian Exp $
18 cananian 1.2.2.2  * @see harpoon.IR.RawClass.ConstantFieldref
19 cananian 1.1      */
20 cananian 1.2.2.1 public final class OpField extends Operand {
21 cananian 1.2.2.1   final HField hfield;
22 cananian 1.1       /** Create an <code>OpField</code> from the <code>CONSTANT_Fieldref</code>
23 cananian 1.1        *  at the given index in the constant pool. */
24 cananian 1.1       public OpField(Code parent, int constant_pool_index) {
25 cananian 1.1         Constant c = parent.getConstant(constant_pool_index);
26 cananian 1.1         if (!(c instanceof ConstantFieldref))
27 cananian 1.1           throw new Error("OpField not given CONSTANT_Fieldref");
28 cananian 1.1         ConstantFieldref cf = (ConstantFieldref) c;
29 cananian 1.1     
30 cananian 1.2.2.5     HClass cls = parent.linker.forName(cf.class_index().name().replace('/','.'));
31 cananian 1.1         hfield = cls.getField(cf.name_and_type_index().name());
32 cananian 1.1         if (!hfield.getDescriptor().equals(cf.name_and_type_index().descriptor()))
33 cananian 1.1           throw new Error("Field does not resolve to proper type.");
34 cananian 1.1       }
35 cananian 1.1       /** Return the field referenced by this operand. */
36 cananian 1.1       public HField value() { return hfield; }
37 cananian 1.1       /** Return the canonical name of this field.
38 cananian 1.1        *  @see harpoon.ClassFile.HField#toString */
39 cananian 1.1       public String toString() { return hfield.toString(); }
40 cananian 1.1     }