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: