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 }