1 cananian 1.3.2.1 // HFieldSyn.java, created Fri Oct 16 2:21:03 1998 by cananian 2 cananian 1.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1 package harpoon.ClassFile; 5 cananian 1.1 6 cananian 1.1 import java.lang.reflect.Modifier; 7 cananian 1.1 8 cananian 1.3.2.5 import harpoon.Util.Util; 9 cananian 1.1 /** 10 cananian 1.1 * A <code>HFieldSyn</code> provides information about a single field of a 11 cananian 1.1 * class 12 cananian 1.1 * or an interface. The reflected field may be a class (static) field or 13 cananian 1.1 * an instance field. 14 cananian 1.1 * 15 cananian 1.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 16 cananian 1.6 * @version $Id: HFieldSyn.java,v 1.6 2002/04/10 03:04:15 cananian Exp $ 17 cananian 1.1 * @see HMember 18 cananian 1.1 * @see HClass 19 cananian 1.1 */ 20 cananian 1.3.2.3 class HFieldSyn extends HFieldImpl implements HFieldMutator { 21 cananian 1.3.2.3 22 cananian 1.3 /** Create a new field like the <code>template</code>, 23 cananian 1.3.2.3 * but in class <code>parent</code> and named <code>name</code>. */ 24 cananian 1.3.2.3 public HFieldSyn(HClassSyn parent, String name, HField template) { 25 cananian 1.3 this.parent = parent; 26 cananian 1.1 this.type = template.getType(); 27 cananian 1.3.2.3 this.name = name; 28 cananian 1.1 this.modifiers = template.getModifiers(); 29 cananian 1.1 this.constValue = template.getConstant(); 30 cananian 1.1 this.isSynthetic = template.isSynthetic(); 31 cananian 1.3.2.5 // ensure linker information is consistent. 32 cananian 1.5.2.1 assert checkLinker((HClass)type); 33 cananian 1.3 } 34 cananian 1.3 /** Create a new field with the specified name, class and descriptor. */ 35 cananian 1.3 public HFieldSyn(HClassSyn parent, String name, String descriptor) { 36 cananian 1.3.2.3 this(parent, name, parent.getLinker().forDescriptor(descriptor)); 37 cananian 1.2 } 38 cananian 1.2 /** Create a new field of the specified name, class, and type. */ 39 cananian 1.3.2.7 public HFieldSyn(HClassSyn parent, String name, HPointer type) { 40 cananian 1.2 this.parent = parent; 41 cananian 1.2 this.type = type; 42 cananian 1.3.2.3 this.name = name; 43 cananian 1.2 this.modifiers = 0; 44 cananian 1.2 this.constValue = null; 45 cananian 1.2 this.isSynthetic = false; 46 cananian 1.3.2.5 // ensure linker information is consistent. 47 cananian 1.5.2.1 if (type instanceof HClass) assert checkLinker((HClass)type); 48 cananian 1.1 } 49 cananian 1.1 50 cananian 1.3.2.3 public HFieldMutator getMutator() { return this; } 51 cananian 1.3.2.3 52 cananian 1.3.2.3 public void addModifiers(int m) { setModifiers(getModifiers()|m); } 53 cananian 1.3.2.3 public void removeModifiers(int m) { setModifiers(getModifiers()&(~m)); } 54 cananian 1.3.2.3 public void setModifiers(int m) { 55 cananian 1.3.2.3 if (this.modifiers != m) parent.hasBeenModified = true; 56 cananian 1.3.2.3 this.modifiers = m; 57 cananian 1.1 } 58 cananian 1.1 59 cananian 1.3.2.3 public void setType(HClass type) { 60 cananian 1.3.2.3 if (this.type != type) parent.hasBeenModified = true; 61 cananian 1.3.2.3 this.type = type; 62 cananian 1.5.2.1 assert checkLinker(type); 63 cananian 1.3.2.3 } 64 cananian 1.3.2.3 public void setConstant(Object co) { 65 cananian 1.3.2.3 if ((co!=null) ? (!co.equals(this.constValue)) : (this.constValue!=null)) 66 cananian 1.3.2.3 parent.hasBeenModified = true; 67 cananian 1.3.2.3 this.constValue=co; 68 cananian 1.3.2.3 } 69 cananian 1.3.2.3 public void setSynthetic(boolean isSynthetic) { 70 cananian 1.3.2.3 if (this.isSynthetic != isSynthetic) parent.hasBeenModified = true; 71 cananian 1.3.2.3 this.isSynthetic=isSynthetic; 72 cananian 1.3.2.6 } 73 cananian 1.3.2.6 74 cananian 1.3.2.6 // assertion helper. 75 cananian 1.3.2.6 private boolean checkLinker(HClass hc) { 76 cananian 1.3.2.6 return hc.isPrimitive() || hc.getLinker()==parent.getLinker(); 77 cananian 1.3.2.2 } 78 cananian 1.1 } 79 cananian 1.1 // set emacs indentation style. 80 cananian 1.1 // Local Variables: 81 cananian 1.1 // c-basic-offset:2 82 cananian 1.1 // End: