[jboss-cvs] javassist/src/main/javassist/util/proxy ...
Shigeru Chiba
chiba at is.titech.ac.jp
Thu Sep 18 13:32:08 EDT 2008
User: chiba
Date: 08/09/18 13:32:08
Modified: src/main/javassist/util/proxy RuntimeSupport.java
ProxyFactory.java
Log:
for fixing JASSIST-66
Revision Changes Path
1.7 +20 -0 javassist/src/main/javassist/util/proxy/RuntimeSupport.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: RuntimeSupport.java
===================================================================
RCS file: /cvsroot/jboss/javassist/src/main/javassist/util/proxy/RuntimeSupport.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- RuntimeSupport.java 11 Mar 2008 11:00:28 -0000 1.6
+++ RuntimeSupport.java 18 Sep 2008 17:32:08 -0000 1.7
@@ -39,6 +39,26 @@
};
/**
+ * Finds two methods specified by the parameters and stores them
+ * into the given array.
+ *
+ * @throws RuntimeException if the methods are not found.
+ * @see javassist.util.proxy.ProxyFactory
+ */
+ public static void find2Methods(Object self, String superMethod,
+ String thisMethod, int index,
+ String desc, java.lang.reflect.Method[] methods)
+ {
+ synchronized (methods) {
+ if (methods[index] == null) {
+ methods[index + 1] = thisMethod == null ? null
+ : findMethod(self, thisMethod, desc);
+ methods[index] = findSuperMethod(self, superMethod, desc);
+ }
+ }
+ }
+
+ /**
* Finds a method with the given name and descriptor.
* It searches only the class of self.
*
1.30 +28 -5 javassist/src/main/javassist/util/proxy/ProxyFactory.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ProxyFactory.java
===================================================================
RCS file: /cvsroot/jboss/javassist/src/main/javassist/util/proxy/ProxyFactory.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- ProxyFactory.java 17 Jul 2008 04:17:08 -0000 1.29
+++ ProxyFactory.java 18 Sep 2008 17:32:08 -0000 1.30
@@ -827,7 +827,7 @@
/*
* if (methods[index * 2] == null) {
* methods[index * 2]
- * = RuntimeSupport.findMethod(this, <overridden name>, <desc>);
+ * = RuntimeSupport.findSuperMethod(this, <overridden name>, <desc>);
* methods[index * 2 + 1]
* = RuntimeSupport.findMethod(this, <delegator name>, <desc>);
* or = null // the original method is abstract.
@@ -840,7 +840,10 @@
int arrayVar = args + 1;
code.addGetstatic(thisClassName, HOLDER, HOLDER_TYPE);
code.addAstore(arrayVar);
- code.addAload(arrayVar);
+
+ callFind2Methods(code, meth.getName(), delegatorName, origIndex, desc, arrayVar);
+
+ /* code.addAload(arrayVar);
code.addIconst(origIndex);
code.addOpcode(Opcode.AALOAD);
code.addOpcode(Opcode.IFNONNULL);
@@ -851,7 +854,8 @@
callFindMethod(code, "findMethod", arrayVar, delIndex, delegatorName, desc);
int pc2 = code.currentPc();
- code.write16bit(pc, pc2 - pc + 1);
+ code.write16bit(pc, pc2 - pc + 1);*/
+
code.addAload(0);
code.addGetfield(thisClassName, HANDLER, HANDLER_TYPE);
code.addAload(0);
@@ -874,10 +878,10 @@
CodeAttribute ca = code.toCodeAttribute();
forwarder.setCodeAttribute(ca);
- StackMapTable.Writer writer = new StackMapTable.Writer(32);
+ /*StackMapTable.Writer writer = new StackMapTable.Writer(32);
writer.appendFrame(pc2, new int[] { StackMapTable.OBJECT },
new int[] { cp.addClassInfo(HOLDER_TYPE) });
- ca.setAttribute(writer.toStackMapTable(cp));
+ ca.setAttribute(writer.toStackMapTable(cp));*/
return forwarder;
}
@@ -1010,6 +1014,25 @@
code.addOpcode(Opcode.AASTORE);
}
+ private static void callFind2Methods(Bytecode code, String superMethod, String thisMethod,
+ int index, String desc, int arrayVar) {
+ String findClass = RuntimeSupport.class.getName();
+ String findDesc
+ = "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V";
+
+ code.addAload(0);
+ code.addLdc(superMethod);
+ if (thisMethod == null)
+ code.addOpcode(Opcode.ACONST_NULL);
+ else
+ code.addLdc(thisMethod);
+
+ code.addIconst(index);
+ code.addLdc(desc);
+ code.addAload(arrayVar);
+ code.addInvokestatic(findClass, "find2Methods", findDesc);
+ }
+
private static void addUnwrapper(Bytecode code, Class type) {
if (type.isPrimitive()) {
if (type == Void.TYPE)
More information about the jboss-cvs-commits
mailing list