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 }