1 cananian 1.1.4.1 // HMethodProxy.java, created Tue Jan 11 08:34:57 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>HMethodProxy</code> is a relinkable proxy for an
  8 cananian 1.1.4.1  * <code>HMethod</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: HMethodProxy.java,v 1.3 2003/03/18 02:27:02 cananian Exp $
 12 cananian 1.1.4.1  * @see HMethod
 13 cananian 1.1.4.1  */
 14 cananian 1.1.4.3 class HMethodProxy extends HMemberProxy
 15 cananian 1.1.4.3     implements HMethod, HMethodMutator, java.io.Serializable {
 16 cananian 1.1.4.1     HMethod proxy;
 17 cananian 1.1.4.1     HMethodMutator proxyMutator;
 18 cananian 1.1.4.1     
 19 cananian 1.1.4.1     /** Creates a <code>HMethodProxy</code>. */
 20 cananian 1.1.4.1     HMethodProxy(Relinker relinker, HMethod proxy) {
 21 cananian 1.1.4.5         super(relinker, proxy, proxy.hashCode());
 22 cananian 1.1.4.1         relink(proxy);
 23 cananian 1.1.4.1     }
 24 cananian 1.1.4.1     void relink(HMethod 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 HMethodMutator 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     // HMethod interface
 36 cananian 1.1.4.1     public HClass getReturnType() { return wrap(proxy.getReturnType()); }
 37 cananian 1.1.4.1     public HClass[] getParameterTypes() {
 38 cananian 1.1.4.1         return wrap(proxy.getParameterTypes());
 39 cananian 1.1.4.1     }
 40 cananian 1.1.4.1     public String[] getParameterNames() { return proxy.getParameterNames(); }
 41 cananian 1.1.4.1     public HClass[] getExceptionTypes() {
 42 cananian 1.1.4.1         return wrap(proxy.getExceptionTypes());
 43 cananian 1.1.4.1     }
 44 cananian 1.1.4.1     public boolean isInterfaceMethod() { return proxy.isInterfaceMethod(); }
 45 cananian 1.1.4.1     public boolean isStatic() { return proxy.isStatic(); }
 46 cananian 1.1.4.4     public String toString() { return HMethodImpl.toString(this); }
 47 cananian 1.1.4.4     public boolean equals(Object obj) { return HMethodImpl.equals(this, obj); }
 48 cananian 1.3         /* ------- JSR-14 extensions. ----------- */
 49 cananian 1.3         public HType[] getGenericParameterTypes() {
 50 cananian 1.3             // xxx need to be able to wrap HTypes.
 51 cananian 1.3             throw new RuntimeException("Unimplemented.");
 52 cananian 1.3         }
 53 cananian 1.3         public HType getGenericReturnType() {
 54 cananian 1.3             // xxx need to be able to wrap HTypes.
 55 cananian 1.3             throw new RuntimeException("Unimplemented.");
 56 cananian 1.3         }
 57 cananian 1.3         public HMethodTypeVariable[] getTypeParameters() {
 58 cananian 1.3             throw new RuntimeException("Unimplemented.");
 59 cananian 1.3         }
 60 cananian 1.1.4.1     // HMethodMutator interface
 61 cananian 1.1.4.6     // BE CAREFUL TO KEEP TRACK OF PROXY'S HASHCODE CHANGES.
 62 cananian 1.1.4.6     // flushMemberMap() and updateMemberMap() need to be called whenever the
 63 cananian 1.1.4.6     // underlying proxy's hashcode changes.  Things that may cause a
 64 cananian 1.1.4.6     // change: changing declaring class, name, or descriptor.
 65 cananian 1.1.4.1     public void addModifiers(int m) { proxyMutator.addModifiers(m); }
 66 cananian 1.1.4.1     public void setModifiers(int m) { proxyMutator.setModifiers(m); }
 67 cananian 1.1.4.1     public void removeModifiers(int m) { proxyMutator.removeModifiers(m); }
 68 cananian 1.1.4.1     public void setReturnType(HClass type) {
 69 cananian 1.1.4.1         flushMemberMap();
 70 cananian 1.1.4.6         try { proxyMutator.setReturnType(unwrap(type)); }
 71 cananian 1.1.4.6         finally { updateMemberMap(); }
 72 cananian 1.1.4.1     }
 73 cananian 1.1.4.1     public void setParameterTypes(HClass[] parameterTypes) {
 74 cananian 1.1.4.1         flushMemberMap();
 75 cananian 1.1.4.6         try { proxyMutator.setParameterTypes(unwrap(parameterTypes)); }
 76 cananian 1.1.4.6         finally { updateMemberMap(); }
 77 cananian 1.1.4.1     }
 78 cananian 1.1.4.1     public void setParameterType(int which, HClass type) {
 79 cananian 1.1.4.1         flushMemberMap();
 80 cananian 1.1.4.6         try { proxyMutator.setParameterType(which, unwrap(type)); }
 81 cananian 1.1.4.6         finally { updateMemberMap(); }
 82 cananian 1.1.4.1     }
 83 cananian 1.1.4.1     public void setParameterNames(String[] parameterNames) {
 84 cananian 1.1.4.1         proxyMutator.setParameterNames(parameterNames);
 85 cananian 1.1.4.1     }
 86 cananian 1.1.4.1     public void setParameterName(int which, String name) {
 87 cananian 1.1.4.1         proxyMutator.setParameterName(which, name);
 88 cananian 1.1.4.1     }
 89 cananian 1.1.4.1     public void addExceptionType(HClass exceptionType) {
 90 cananian 1.1.4.1         proxyMutator.addExceptionType(unwrap(exceptionType));
 91 cananian 1.1.4.1     }
 92 cananian 1.1.4.1     public void setExceptionTypes(HClass[] exceptionTypes) {
 93 cananian 1.1.4.1         proxyMutator.setExceptionTypes(unwrap(exceptionTypes));
 94 cananian 1.1.4.1     }
 95 cananian 1.1.4.1     public void removeExceptionType(HClass exceptionType) {
 96 cananian 1.1.4.1         proxyMutator.removeExceptionType(unwrap(exceptionType));
 97 cananian 1.1.4.1     }
 98 cananian 1.1.4.1     public void setSynthetic(boolean isSynthetic) {
 99 cananian 1.1.4.1         proxyMutator.setSynthetic(isSynthetic);
100 cananian 1.1.4.1     }
101 cananian 1.1.4.3     /** Serializable interface. */
102 cananian 1.1.4.3     public Object writeReplace() { return new HMethodImpl.HMethodStub(this); }
103 cananian 1.2     }