You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ba...@apache.org on 2002/04/29 13:50:24 UTC
cvs commit: jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools Enhancer.java
baliuka 02/04/29 04:50:24
Modified: simplestore/src/java/org/apache/commons/simplestore/tools
Enhancer.java
Log:
Fixed bug
Revision Changes Path
1.21 +304 -291 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java
Index: Enhancer.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- Enhancer.java 14 Apr 2002 19:43:45 -0000 1.20
+++ Enhancer.java 29 Apr 2002 11:50:24 -0000 1.21
@@ -102,59 +102,60 @@
import org.apache.bcel.generic.Type;
import org.apache.bcel.generic.ArrayType;
/**
-* this code returns Enhanced Vector to intercept all methods for tracing
-* <pre>
-* java.util.Vector vector = (java.util.Vector)Enhancer.enhance(
-* java.util.Vector.class,
-* new Class[]{java.util.List.class},
-*
-* new MethodInterceptor(){
-*
-* public Object beforeInvoke( Object obj,java.lang.reflect.Method method,
-* Object args[] )
-* throws java.lang.Throwable{
-* return null;
-* }
-*
-* public boolean invokeSuper( Object obj,java.lang.reflect.Method method,
-* Object args[], Object retValFromBefore )
-* throws java.lang.Throwable{
-* return true;
-* }
-*
-*
-* public Object afterReturn( Object obj, java.lang.reflect.Method method,
-* Object args[], Object retValFromBefore,
-* boolean invokedSuper, Object retValFromSuper,
-* java.lang.Throwable e )throws java.lang.Throwable{
-* System.out.println(method);
-* return retValFromSuper;//return the same as supper
-* }
-*
-* });
-* </pre>
-*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
+ * this code returns Enhanced Vector to intercept all methods for tracing
+ * <pre>
+ * java.util.Vector vector = (java.util.Vector)Enhancer.enhance(
+ * java.util.Vector.class,
+ * new Class[]{java.util.List.class},
+ *
+ * new MethodInterceptor(){
+ *
+ * public Object beforeInvoke( Object obj,java.lang.reflect.Method method,
+ * Object args[] )
+ * throws java.lang.Throwable{
+ * return null;
+ * }
+ *
+ * public boolean invokeSuper( Object obj,java.lang.reflect.Method method,
+ * Object args[], Object retValFromBefore )
+ * throws java.lang.Throwable{
+ * return true;
+ * }
+ *
+ *
+ * public Object afterReturn( Object obj, java.lang.reflect.Method method,
+ * Object args[], Object retValFromBefore,
+ * boolean invokedSuper, Object retValFromSuper,
+ * java.lang.Throwable e )throws java.lang.Throwable{
+ * System.out.println(method);
+ * return retValFromSuper;//return the same as supper
+ * }
+ *
+ * });
+ * </pre>
+ *@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: Enhancer.java,v 1.20 2002/04/14 19:43:45 baliuka Exp $
+ *@version $Id: Enhancer.java,v 1.21 2002/04/29 11:50:24 baliuka Exp $
*/
-public class Enhancer implements org.apache.bcel.Constants , Constants{
+public class Enhancer implements org.apache.bcel.Constants ,
+Constants{
+
-
static final String INTERCEPTOR_CLASS = MethodInterceptor.class.getName();
static final ObjectType BOOLEAN_OBJECT =
- new ObjectType(Boolean.class.getName());
+ new ObjectType(Boolean.class.getName());
static final ObjectType INTEGER_OBJECT =
- new ObjectType(Integer.class.getName());
+ new ObjectType(Integer.class.getName());
static final ObjectType CHARACTER_OBJECT =
- new ObjectType(Character.class.getName());
+ new ObjectType(Character.class.getName());
static final ObjectType BYTE_OBJECT = new ObjectType(Byte.class.getName());
static final ObjectType SHORT_OBJECT = new ObjectType(Short.class.getName());
static final ObjectType LONG_OBJECT = new ObjectType(Long.class.getName());
static final ObjectType DOUBLE_OBJECT = new ObjectType(Double.class.getName());
static final ObjectType FLOAT_OBJECT = new ObjectType(Float.class.getName());
static final ObjectType METHOD_OBJECT =
- new ObjectType(java.lang.reflect.Method.class.getName());
+ new ObjectType(java.lang.reflect.Method.class.getName());
static final ObjectType NUMBER_OBJECT = new ObjectType(Number.class.getName());
static final String CONSTRUCTOR_NAME = "<init>";
static final String FIELD_NAME = "h";
@@ -164,40 +165,40 @@
static int index = 0;
private static int addAfterConstructionRef(ConstantPoolGen cp) {
return cp.addMethodref(
- Enhancer.class.getName(),
- "handleConstruction",
- "(Ljava/lang/Object;[Ljava/lang/Object;)V");
+ Enhancer.class.getName(),
+ "handleConstruction",
+ "(Ljava/lang/Object;[Ljava/lang/Object;)V");
}
private static int addAfterRef(ConstantPoolGen cp) {
return cp.addInterfaceMethodref(
- INTERCEPTOR_CLASS,
- "afterReturn",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;");
+ INTERCEPTOR_CLASS,
+ "afterReturn",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;");
}
private static int addInvokeSupperRef(ConstantPoolGen cp) {
return cp.addInterfaceMethodref(
- INTERCEPTOR_CLASS,
- "invokeSuper",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z");
+ INTERCEPTOR_CLASS,
+ "invokeSuper",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z");
}
private static int addBeforeRef(ConstantPoolGen cp) {
return cp.addInterfaceMethodref(
- INTERCEPTOR_CLASS,
- "beforeInvoke",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
+ INTERCEPTOR_CLASS,
+ "beforeInvoke",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
}
private static java.util.List costructionHandlers = new java.util.Vector();
private static java.util.Map cache = new java.util.WeakHashMap();
/** Creates a new instance of Enchancer */
protected Enhancer() {}
public static void setMethodInterceptor(Object enhanced, MethodInterceptor ih)
- throws Throwable {
+ throws Throwable {
enhanced.getClass().getField(FIELD_NAME).set(enhanced, ih);
}
public static MethodInterceptor getMethodInterceptor(Object enhanced)
- throws Throwable {
+ throws Throwable {
return (MethodInterceptor) enhanced.getClass().getField(FIELD_NAME).get(
- enhanced);
+ enhanced);
}
public static void addConstructionHandler(ConstructionHandler ch) {
costructionHandlers.add(ch);
@@ -206,76 +207,88 @@
costructionHandlers.remove(ch);
}
public static synchronized void handleConstruction(Object obj, Object args[])
- throws Throwable {
+ throws Throwable {
for (java.util.Iterator i = costructionHandlers.iterator(); i.hasNext();) {
((ConstructionHandler) i.next()).afterConstruction(obj, args);
}
}
public static Object enhance(
- Class cls,
- Class interfaces[],
- MethodInterceptor ih)
- throws Throwable {
+ Class cls,
+ Class interfaces[],
+ MethodInterceptor ih)
+ throws Throwable {
return enhance(
- cls,
- null,
- interfaces,
- ih,
- Thread.currentThread().getContextClassLoader());
+ cls,
+ interfaces,
+ ih,
+ Thread.currentThread().getContextClassLoader());
}
public synchronized static Object enhance(
- Class cls,
- String class_name,
- Class interfaces[],
- MethodInterceptor ih,
- ClassLoader loader)
- throws Throwable {
+ Class cls,
+ /* String class_name, */ //it was not good idea
+ Class interfaces[],
+ MethodInterceptor ih,
+ ClassLoader loader)
+ throws Throwable {
if (cls == null) {
- cls = Enhancer.class;
+ cls = Object.class;
}
- if (class_name == null) {
- class_name = cls.getName() + CLASS_SUFIX;
- if (class_name.startsWith("java")) {
- class_name = CLASS_PREFIX + class_name;
+
+ StringBuffer key = new StringBuffer(cls.getName() + ";");
+ if(interfaces != null){
+ for(int i = 0; i< interfaces.length; i++ ){
+ key.append(interfaces[i].getName());
}
- if( cls == Enhancer.class )
- class_name += index;
}
+
+
java.util.Map map = (java.util.Map) cache.get(loader);
if ( map == null ) {
map = new java.util.HashMap();
cache.put(loader, map);
}
- Class result = (Class) map.get(class_name);
+
+ Class result = (Class) map.get(key);
+
+
+
if (result == null) {
+
+ String class_name = cls.getName() + CLASS_SUFIX;
+ if (class_name.startsWith("java")) {
+ class_name = CLASS_PREFIX + class_name;
+ }
+ class_name += index++;
+
+
java.util.HashMap methods = new java.util.HashMap();
JavaClass clazz = enhance(cls, class_name, interfaces, methods);
byte b[] = clazz.getBytes();
java.lang.reflect.Method m =
- ClassLoader.class.getDeclaredMethod(
- "defineClass",
- new Class[] { String.class, byte[].class, int.class, int.class });
+ ClassLoader.class.getDeclaredMethod(
+ "defineClass",
+ new Class[] { String.class, byte[].class, int.class, int.class });
// protected method invocaton
boolean flag = m.isAccessible();
m.setAccessible(true);
result =
- (Class) m.invoke(
- loader,
- new Object[] { clazz.getClassName(), b, new Integer(0), new Integer(b.length)});
+ (Class) m.invoke(
+ loader,
+ new Object[] { clazz.getClassName(), b, new Integer(0), new Integer(b.length)});
m.setAccessible(flag);
for (java.util.Iterator i = methods.keySet().iterator(); i.hasNext();) {
String name = (String) i.next();
result.getField(name).set(null, methods.get(name));
}
- map.put(class_name, result);
+ map.put(key, result);
}
return result
- .getConstructor(
- new Class[] { Class.forName(MethodInterceptor.class.getName(), true, loader)})
- .newInstance(new Object[] { ih });
+ .getConstructor(
+ new Class[] { Class.forName(MethodInterceptor.class.getName(), true, loader)})
+ .newInstance(new Object[] { ih });
}
private static void addConstructors(ClassGen cg, Class superClass)
- throws Throwable {
+ throws Throwable {
addConstructor(cg); //default
java.lang.reflect.Constructor constructors[] = superClass.getConstructors();
String parentClass = cg.getSuperclassName();
@@ -284,8 +297,8 @@
for (int i = 0; i < constructors.length; i++) {
Class parmTypes[] = constructors[i].getParameterTypes();
if (parmTypes.length == 1
- && parmTypes[0].equals(
- org.apache.commons.simplestore.tools.MethodInterceptor.class)) {
+ && parmTypes[0].equals(
+ org.apache.commons.simplestore.tools.MethodInterceptor.class)) {
continue;
}
InstructionList il = new InstructionList();
@@ -296,11 +309,11 @@
il.append(new ASTORE(argArray));
il.append(new ALOAD(0));
il.append(
- factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- GETFIELD));
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
il.append(new ALOAD(0));
il.append(new ALOAD(argArray));
il.append(new INVOKESTATIC(addAfterConstructionRef(cp)));
@@ -315,55 +328,55 @@
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool
InstructionList il = new InstructionList();
- MethodGen costructor = new MethodGen(ACC_PUBLIC, // access flags
+ MethodGen costructor = new MethodGen(ACC_PUBLIC, // access flags
Type.VOID, // return type
- new Type[] { // argument types
+ new Type[] { // argument types
new ObjectType(INTERCEPTOR_CLASS)}, null, // arg names
- CONSTRUCTOR_NAME, cg.getClassName(), il, cp);
- il.append(new ALOAD(0));
- il.append(
+ CONSTRUCTOR_NAME, cg.getClassName(), il, cp);
+ il.append(new ALOAD(0));
+ il.append(
factory.createInvoke(
- parentClass,
- CONSTRUCTOR_NAME,
- Type.VOID,
- new Type[] {},
- INVOKESPECIAL));
- il.append(new ALOAD(0));
- il.append(new ALOAD(1));
- il.append(
+ parentClass,
+ CONSTRUCTOR_NAME,
+ Type.VOID,
+ new Type[] {},
+ INVOKESPECIAL));
+ il.append(new ALOAD(0));
+ il.append(new ALOAD(1));
+ il.append(
factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- PUTFIELD));
- Type argTypes[] = new Type[] { new ObjectType(INTERCEPTOR_CLASS)};
- int argArray = createArgArray(il, factory, cp, argTypes);
- il.append(new ASTORE(argArray));
- il.append(new ALOAD(0));
- il.append(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ PUTFIELD));
+ Type argTypes[] = new Type[] { new ObjectType(INTERCEPTOR_CLASS)};
+ int argArray = createArgArray(il, factory, cp, argTypes);
+ il.append(new ASTORE(argArray));
+ il.append(new ALOAD(0));
+ il.append(
factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- GETFIELD));
- il.append(new ALOAD(0));
- il.append(new ALOAD(argArray));
- il.append(new INVOKESTATIC(addAfterConstructionRef(cp)));
- il.append(new RETURN());
- cg.addMethod(getMethod(costructor));
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0));
+ il.append(new ALOAD(argArray));
+ il.append(new INVOKESTATIC(addAfterConstructionRef(cp)));
+ il.append(new RETURN());
+ cg.addMethod(getMethod(costructor));
}
private static void addHandlerField(ClassGen cg) {
ConstantPoolGen cp = cg.getConstantPool();
FieldGen fg =
- new FieldGen(ACC_PUBLIC, new ObjectType(INTERCEPTOR_CLASS), FIELD_NAME, cp);
+ new FieldGen(ACC_PUBLIC, new ObjectType(INTERCEPTOR_CLASS), FIELD_NAME, cp);
cg.addField(fg.getField());
}
private static ClassGen getClassGen(
- String class_name,
- Class parentClass,
- Class[] interfaces) {
+ String class_name,
+ Class parentClass,
+ Class[] interfaces) {
ClassGen gen =
- new ClassGen(class_name, parentClass.getName(), SOURCE_FILE, ACC_PUBLIC, null);
+ new ClassGen(class_name, parentClass.getName(), SOURCE_FILE, ACC_PUBLIC, null);
if (interfaces != null) {
for (int i = 0; i < interfaces.length; i++) {
gen.addInterface(interfaces[i].getName());
@@ -372,11 +385,11 @@
return gen;
}
private static JavaClass enhance(
- Class parentClass,
- String class_name,
- Class interfaces[],
- java.util.HashMap methodTable)
- throws Throwable {
+ Class parentClass,
+ String class_name,
+ Class interfaces[],
+ java.util.HashMap methodTable)
+ throws Throwable {
ClassGen cg = getClassGen(class_name, parentClass, interfaces);
ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool
addHandlerField(cg);
@@ -396,13 +409,13 @@
for (int i = 0; i < methods.length; i++) {
int mod = methods[i].getModifiers();
if (!java.lang.reflect.Modifier.isStatic(mod)
- && !java.lang.reflect.Modifier.isFinal(mod)
- && (java.lang.reflect.Modifier.isPublic(mod)
- || java.lang.reflect.Modifier.isProtected(mod))) {
-
+ && !java.lang.reflect.Modifier.isFinal(mod)
+ && (java.lang.reflect.Modifier.isPublic(mod)
+ || java.lang.reflect.Modifier.isProtected(mod))) {
+
methodSet.add(new MethodWrapper(methods[i]));
if( DEBUG ){
- System.out.println("added:" + methods[i]);
+ System.out.println("added:" + methods[i]);
}
}
}
@@ -420,14 +433,14 @@
private static void addMethodField(String fieldName, ClassGen cg) {
ConstantPoolGen cp = cg.getConstantPool();
FieldGen fg =
- new FieldGen(ACC_PUBLIC | ACC_STATIC, METHOD_OBJECT, fieldName, cp);
+ new FieldGen(ACC_PUBLIC | ACC_STATIC, METHOD_OBJECT, fieldName, cp);
cg.addField(fg.getField());
}
private static int createArgArray(
- InstructionList il,
- InstructionFactory factory,
- ConstantPoolGen cp,
- Type[] args) {
+ InstructionList il,
+ InstructionFactory factory,
+ ConstantPoolGen cp,
+ Type[] args) {
int argCount = args.length;
if (argCount > 5)
il.append(new BIPUSH((byte) argCount));
@@ -447,59 +460,59 @@
il.append(new DUP());
il.append(new ILOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V")));
} else if (args[i].equals(Type.INT)) {
il.append(new NEW(cp.addClass(INTEGER_OBJECT)));
il.append(new DUP());
il.append(new ILOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V")));
} else if (args[i].equals(Type.CHAR)) {
il.append(new NEW(cp.addClass(CHARACTER_OBJECT)));
il.append(new DUP());
il.append(new ILOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V")));
} else if (args[i].equals(Type.BYTE)) {
il.append(new NEW(cp.addClass(BYTE_OBJECT)));
il.append(new DUP());
il.append(new ILOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V")));
} else if (args[i].equals(Type.SHORT)) {
il.append(new NEW(cp.addClass(SHORT_OBJECT)));
il.append(new DUP());
il.append(new ILOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V")));
} else if (args[i].equals(Type.LONG)) {
il.append(new NEW(cp.addClass(LONG_OBJECT)));
il.append(new DUP());
il.append(new LLOAD(load));
load += 2;
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V")));
} else if (args[i].equals(Type.DOUBLE)) {
il.append(new NEW(cp.addClass(DOUBLE_OBJECT)));
il.append(new DUP());
il.append(new DLOAD(load));
load += 2;
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V")));
} else if (args[i].equals(Type.FLOAT)) {
il.append(new NEW(cp.addClass(FLOAT_OBJECT)));
il.append(new DUP());
il.append(new FLOAD(load++));
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V")));
+ new INVOKESPECIAL(
+ cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V")));
}
il.append(new AASTORE());
} else {
@@ -516,11 +529,11 @@
return mg.getMethod();
}
private static InstructionHandle generateReturnValue(
- InstructionList il,
- InstructionFactory factory,
- ConstantPoolGen cp,
- Type returnType,
- int stack) {
+ InstructionList il,
+ InstructionFactory factory,
+ ConstantPoolGen cp,
+ Type returnType,
+ int stack) {
if (returnType.equals(Type.VOID)) {
return il.append(new RETURN());
}
@@ -528,108 +541,108 @@
il.append(new ALOAD(stack));
if ((returnType instanceof ObjectType) || ( returnType instanceof ArrayType) ) {
if (returnType instanceof ArrayType){
- il.append(new CHECKCAST(cp.addArrayClass((ArrayType)returnType)));
- return il.append(new ARETURN());
+ il.append(new CHECKCAST(cp.addArrayClass((ArrayType)returnType)));
+ return il.append(new ARETURN());
}
if (!returnType.equals(Type.OBJECT)){
- il.append(new CHECKCAST(cp.addClass((ObjectType) returnType)));
- return il.append(new ARETURN());
+ il.append(new CHECKCAST(cp.addClass((ObjectType) returnType)));
+ return il.append(new ARETURN());
}else {
- return il.append(new ARETURN());
+ return il.append(new ARETURN());
}
- }
+ }
if (returnType instanceof BasicType) {
if (returnType.equals(Type.BOOLEAN)) {
IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new ICONST(0) );
- il.append(new IRETURN());
+ il.append(new IRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
il.append(new CHECKCAST(cp.addClass(BOOLEAN_OBJECT)));
il.append(
- factory.createInvoke(
- Boolean.class.getName(),
- "booleanValue",
- Type.BOOLEAN,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ Boolean.class.getName(),
+ "booleanValue",
+ Type.BOOLEAN,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new IRETURN());
} else if (returnType.equals(Type.CHAR)) {
- IFNONNULL ifNNull = new IFNONNULL(null);
+ IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new ICONST(0) );
- il.append(new IRETURN());
+ il.append(new IRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
il.append(new CHECKCAST(cp.addClass(CHARACTER_OBJECT)));
il.append(
- factory.createInvoke(
- Character.class.getName(),
- "charValue",
- Type.CHAR,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ Character.class.getName(),
+ "charValue",
+ Type.CHAR,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new IRETURN());
} else if (returnType.equals(Type.LONG)) {
IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new LCONST(0) );
- il.append(new LRETURN());
+ il.append(new LRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
il.append(
- factory.createInvoke(
- Number.class.getName(),
- "longValue",
- Type.LONG,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ Number.class.getName(),
+ "longValue",
+ Type.LONG,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new LRETURN());
} else if (returnType.equals(Type.DOUBLE)) {
IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new DCONST(0) );
- il.append(new DRETURN());
+ il.append(new DRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
-
+
il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
il.append(
- factory.createInvoke(
- Number.class.getName(),
- "doubleValue",
- Type.DOUBLE,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ Number.class.getName(),
+ "doubleValue",
+ Type.DOUBLE,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new DRETURN());
} else if (returnType.equals(Type.FLOAT)) {
IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new FCONST(0) );
- il.append(new FRETURN());
+ il.append(new FRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
il.append(
- factory.createInvoke(
- java.lang.Number.class.getName(),
- "floatValue",
- Type.FLOAT,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ java.lang.Number.class.getName(),
+ "floatValue",
+ Type.FLOAT,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new FRETURN());
} else {
IFNONNULL ifNNull = new IFNONNULL(null);
il.append(ifNNull);
il.append(new ICONST(0) );
- il.append(new IRETURN());
+ il.append(new IRETURN());
ifNNull.setTarget(il.append(new ALOAD(stack)));
il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
il.append(
- factory.createInvoke(
- Number.class.getName(),
- "intValue",
- Type.INT,
- new Type[] {},
- INVOKEVIRTUAL));
+ factory.createInvoke(
+ Number.class.getName(),
+ "intValue",
+ Type.INT,
+ new Type[] {},
+ INVOKEVIRTUAL));
return il.append(new IRETURN());
}
}
@@ -661,28 +674,28 @@
if (type instanceof BasicType) {
if (type.equals(Type.BOOLEAN)) {
return new INVOKESPECIAL(
- cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V"));
+ cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V"));
} else if (type.equals(Type.INT)) {
return new INVOKESPECIAL(
- cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V"));
+ cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V"));
} else if (type.equals(Type.CHAR)) {
return new INVOKESPECIAL(
- cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V"));
+ cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V"));
} else if (type.equals(Type.BYTE)) {
return new INVOKESPECIAL(
- cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V"));
+ cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V"));
} else if (type.equals(Type.SHORT)) {
return new INVOKESPECIAL(
- cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V"));
+ cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V"));
} else if (type.equals(Type.LONG)) {
return new INVOKESPECIAL(
- cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V"));
+ cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V"));
} else if (type.equals(Type.DOUBLE)) {
return new INVOKESPECIAL(
- cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V"));
+ cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V"));
} else if (type.equals(Type.FLOAT)) {
return new INVOKESPECIAL(
- cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V"));
+ cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V"));
}
}
return null;
@@ -739,7 +752,7 @@
return Type.BOOLEAN;
}
} else if (cls.isArray()) {
- return new ArrayType( toType(cls.getComponentType()),cls.getName().lastIndexOf('[') + 1);
+ return new ArrayType( toType(cls.getComponentType()),cls.getName().lastIndexOf('[') + 1);
} else
return new ObjectType(cls.getName());
throw new java.lang.InternalError(cls.getName());
@@ -753,47 +766,47 @@
pos = loadArg(il, args[i], i, pos);
}
il.append(
- new INVOKESPECIAL(
- cp.addMethodref(cg.getSuperclassName(), mg.getName(), mg.getSignature())));
+ new INVOKESPECIAL(
+ cp.addMethodref(cg.getSuperclassName(), mg.getName(), mg.getSignature())));
}
private static MethodGen toMethodGen(
- java.lang.reflect.Method mtd,
- String className,
- InstructionList il,
- ConstantPoolGen cp) {
+ java.lang.reflect.Method mtd,
+ String className,
+ InstructionList il,
+ ConstantPoolGen cp) {
return new MethodGen(
- ACC_PUBLIC,
- toType(mtd.getReturnType()),
- toType(mtd.getParameterTypes()),
- null,
- mtd.getName(),
- className,
- il,
- cp);
+ ACC_PUBLIC,
+ toType(mtd.getReturnType()),
+ toType(mtd.getParameterTypes()),
+ null,
+ mtd.getName(),
+ className,
+ il,
+ cp);
}
private static MethodGen toMethodGen(
- java.lang.reflect.Constructor mtd,
- String className,
- InstructionList il,
- ConstantPoolGen cp) {
+ java.lang.reflect.Constructor mtd,
+ String className,
+ InstructionList il,
+ ConstantPoolGen cp) {
return new MethodGen(
- ACC_PUBLIC,
- Type.VOID,
- toType(mtd.getParameterTypes()),
- null,
- CONSTRUCTOR_NAME,
- className,
- il,
- cp);
+ ACC_PUBLIC,
+ Type.VOID,
+ toType(mtd.getParameterTypes()),
+ null,
+ CONSTRUCTOR_NAME,
+ className,
+ il,
+ cp);
}
private static Method generateMethod(
- java.lang.reflect.Method method,
- String fieldName,
- ClassGen cg,
- int before,
- int after,
- int invokeSuper) {
-
+ java.lang.reflect.Method method,
+ String fieldName,
+ ClassGen cg,
+ int before,
+ int after,
+ int invokeSuper) {
+
InstructionList il = new InstructionList();
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cp = cg.getConstantPool();
@@ -804,7 +817,7 @@
addMethodField(fieldName, cg);
boolean returnsValue = !mg.getReturnType().equals(Type.VOID);
boolean abstractM =
- java.lang.reflect.Modifier.isAbstract(method.getModifiers());
+ java.lang.reflect.Modifier.isAbstract(method.getModifiers());
InstructionHandle ehEnd = null;
GOTO gotoHandled = null;
IFEQ ifInvoke = null;
@@ -819,11 +832,11 @@
if (!abstractM) { // invoke before
il.append(new ALOAD(0));
il.append(
- factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- GETFIELD));
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
il.append(new ALOAD(0));
il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
il.append(new ALOAD(argArray));
@@ -846,11 +859,11 @@
if (!abstractM) { //test before invoke super
il.append(new ALOAD(0)); //this.handler
il.append(
- factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- GETFIELD));
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
il.append(new ALOAD(0)); //this
il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
il.append(new ALOAD(argArray));
@@ -888,11 +901,11 @@
gotoHandled.setTarget(endif);
}
il.append(
- factory.createFieldAccess(
- cg.getClassName(),
- FIELD_NAME,
- new ObjectType(INTERCEPTOR_CLASS),
- GETFIELD));
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
il.append(new ALOAD(0)); //this
il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
il.append(new ALOAD(argArray));
@@ -902,7 +915,7 @@
il.append(new ALOAD(error));
il.append(new INVOKEINTERFACE(after, 8));
InstructionHandle exitMethod =
- generateReturnValue(il, factory, cp, mg.getReturnType(), ++loaded);
+ generateReturnValue(il, factory, cp, mg.getReturnType(), ++loaded);
if (!abstractM) {
mg.addExceptionHandler(ehStart, ehEnd, ehHandled, Type.THROWABLE);
}
@@ -934,10 +947,10 @@
}
}
- public static boolean equals(
- java.lang.reflect.Method m1,
- java.lang.reflect.Method m2) {
-
+ public static boolean equals(
+ java.lang.reflect.Method m1,
+ java.lang.reflect.Method m2) {
+
if (m1 == m2) {
return true;
@@ -948,21 +961,21 @@
if (params1.length == params2.length) {
for (int i = 0; i < params1.length; i++) {
if (!params1[i].getName().equals( params2[i].getName() ) ) {
- return false;
+ return false;
}
}
-
- if(!m1.getReturnType().getName().
- equals(m2.getReturnType().getName()) ){
- throw new java.lang.IllegalStateException(
- "Can't implement:\n" + m1.getDeclaringClass().getName() +
- "\n and\n" + m2.getDeclaringClass().getName() + "\n"+
- m1.toString() + "\n" + m2.toString());
- }
+
+ if(!m1.getReturnType().getName().
+ equals(m2.getReturnType().getName()) ){
+ throw new java.lang.IllegalStateException(
+ "Can't implement:\n" + m1.getDeclaringClass().getName() +
+ "\n and\n" + m2.getDeclaringClass().getName() + "\n"+
+ m1.toString() + "\n" + m2.toString());
+ }
return true;
}
}
-
+
return false;
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>