1 cananian 1.1.4.1 // HFieldProxy.java, created Tue Jan 11 08:14:00 2000 by cananian
 2 cananian 1.1.4.2 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.4.1 package harpoon.ClassFile;
 5 cananian 1.1.4.1 
 6 cananian 1.1.4.1 /**
 7 cananian 1.1.4.1  * An <code>HFieldProxy</code> is a relinkable proxy for an
 8 cananian 1.1.4.1  * <code>HField</code>.
 9 cananian 1.1.4.1  * 
10 cananian 1.1.4.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
11 cananian 1.3      * @version $Id: HFieldProxy.java,v 1.3 2003/03/18 02:27:02 cananian Exp $
12 cananian 1.1.4.1  * @see HField
13 cananian 1.1.4.1  */
14 cananian 1.1.4.3 class HFieldProxy extends HMemberProxy
15 cananian 1.1.4.3     implements HField, HFieldMutator, java.io.Serializable {
16 cananian 1.1.4.1     HField proxy;
17 cananian 1.1.4.1     HFieldMutator proxyMutator;
18 cananian 1.1.4.1     
19 cananian 1.1.4.1     /** Creates a <code>HFieldProxy</code>. */
20 cananian 1.1.4.1     HFieldProxy(Relinker relinker, HField proxy) {
21 cananian 1.1.4.5         super(relinker, proxy, HFieldImpl.hashCode(proxy));
22 cananian 1.1.4.1         relink(proxy);
23 cananian 1.1.4.1     }
24 cananian 1.1.4.1     void relink(HField proxy) {
25 cananian 1.1.4.1         super.relink(proxy);
26 cananian 1.1.4.1         this.proxy = proxy;
27 cananian 1.1.4.1         this.proxyMutator = (proxy==null) ? null : proxy.getMutator();
28 cananian 1.1.4.1     }
29 cananian 1.1.4.1 
30 cananian 1.1.4.1     public HFieldMutator getMutator() {
31 cananian 1.1.4.1         if (proxyMutator==null)
32 cananian 1.1.4.1             ((HClassProxy)getDeclaringClass()).getMutator();
33 cananian 1.1.4.1         return (proxyMutator==null) ? null : this;
34 cananian 1.1.4.1     }
35 cananian 1.1.4.1     // HField interface
36 cananian 1.1.4.1     public HClass getType() { return wrap(proxy.getType()); }
37 cananian 1.1.4.1     public Object getConstant() { return proxy.getConstant(); }
38 cananian 1.1.4.1     public boolean isConstant() { return proxy.isConstant(); }
39 cananian 1.1.4.1     public boolean isStatic() { return proxy.isStatic(); }
40 cananian 1.1.4.4     public String toString() { return HFieldImpl.toString(this); }
41 cananian 1.1.4.4     public boolean equals(Object obj) { return HFieldImpl.equals(this, obj); }
42 cananian 1.3         public HType getGenericType() {
43 cananian 1.3             // xxx need to be able to wrap generic types.
44 cananian 1.3             throw new RuntimeException("Unimplemented");
45 cananian 1.3         }
46 cananian 1.1.4.1     // HFieldMutator interface
47 cananian 1.1.4.6     // BE CAREFUL TO KEEP TRACK OF PROXY'S HASHCODE CHANGES.
48 cananian 1.1.4.6     // flushMemberMap() and updateMemberMap() need to be called whenever the
49 cananian 1.1.4.6     // underlying proxy's hashcode changes.  Things that may cause a
50 cananian 1.1.4.6     // change: changing declaring class, name, or descriptor.
51 cananian 1.1.4.1     public void addModifiers(int m) { proxyMutator.addModifiers(m); }
52 cananian 1.1.4.1     public void setModifiers(int m) { proxyMutator.setModifiers(m); }
53 cananian 1.1.4.1     public void removeModifiers(int m) { proxyMutator.removeModifiers(m); }
54 cananian 1.1.4.1     public void setConstant(Object co) { proxyMutator.setConstant(co); }
55 cananian 1.1.4.1     public void setSynthetic(boolean is) { proxyMutator.setSynthetic(is); }
56 cananian 1.1.4.6     public void setType(HClass type) {
57 cananian 1.1.4.6         flushMemberMap();
58 cananian 1.1.4.6         try { proxyMutator.setType(unwrap(type)); }
59 cananian 1.1.4.6         finally { updateMemberMap(); }
60 cananian 1.1.4.6     }
61 cananian 1.1.4.3     /** Serializable interface. */
62 cananian 1.1.4.3     public Object writeReplace() { return new HFieldImpl.HFieldStub(this); }
63 cananian 1.2     }