baliuka 02/03/04 14:51:16 Modified: simplestore/src/java/org/apache/commons/simplestore/tools Enhancer.java Log: bug fixes for Enhancer Revision Changes Path 1.8 +34 -56 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Enhancer.java 4 Mar 2002 22:11:40 -0000 1.7 +++ Enhancer.java 4 Mar 2002 22:51:16 -0000 1.8 @@ -63,7 +63,7 @@ /** *@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]"> * [EMAIL PROTECTED]</a> - *@version $Id: Enhancer.java,v 1.7 2002/03/04 22:11:40 baliuka Exp $ + *@version $Id: Enhancer.java,v 1.8 2002/03/04 22:51:16 baliuka Exp $ */ public class Enhancer implements org.apache.bcel.Constants{ @@ -140,7 +140,6 @@ result = (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)); @@ -150,14 +149,9 @@ } return result.getConstructor(new Class[]{ MethodInterceptor.class} ). newInstance(new Object[]{ih}); - - - } - - private static void addConstructor(ClassGen cg ){ String parentClass = cg.getSuperclassName(); @@ -172,7 +166,6 @@ }, null, // arg names 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)); @@ -192,10 +185,17 @@ } - private static ClassGen getClassGen( String class_name, Class parentClass){ + private static ClassGen getClassGen( String class_name, Class parentClass,Class [] interfaces){ - return new ClassGen( class_name , parentClass.getName(), + ClassGen gen = 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()); + } + } + + return gen; } private static JavaClass enhance( Class parentClass,Class interfaces [],java.util.HashMap methodTable ) { @@ -203,8 +203,8 @@ String class_name = parentClass.getName() + ENHAVCED_CLASS_SUFIX; if(class_name.startsWith("java")){ class_name = ENHAVCED_CLASS_PREFIX + class_name; - } - ClassGen cg = getClassGen(class_name,parentClass); + } + ClassGen cg = getClassGen(class_name,parentClass,interfaces); ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool addHandlerField(cg); addConstructor(cg); @@ -213,7 +213,7 @@ int invokeSuper = addInvokeSupperRef(cp); java.util.Set methodSet = new java.util.HashSet(); - for(int j = 0; j <= (interfaces == null ? 0 : interfaces.length); j++ ) { + for(int j = (interfaces == null ? 0 : interfaces.length); j == 0 ; j-- ) { java.lang.reflect.Method methods[]; if( j == 0 ){ methods = parentClass.getMethods(); @@ -222,10 +222,10 @@ } 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)) ){ + 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)) ){ methodSet.add(methods[i]); } @@ -238,16 +238,13 @@ cg.addMethod( generateMethod( method,fieldName,cg, before,after,invokeSuper ) ); methodTable.put(fieldName,method); } - - - JavaClass jcl = cg.getJavaClass(); return jcl; - } private static void addMethodField(String fieldName, ClassGen cg ){ + ConstantPoolGen cp = cg.getConstantPool(); FieldGen fg = new FieldGen( ACC_PUBLIC | ACC_STATIC , METHOD_OBJECT , fieldName , cp); cg.addField(fg.getField()); @@ -255,6 +252,7 @@ } private static int createArgArray(InstructionList il, InstructionFactory factory, ConstantPoolGen cp, Type[] args ){ + int argCount = args.length; if( argCount > 5 ) il.append( new BIPUSH((byte)argCount) ); @@ -312,11 +310,7 @@ il.append( new INVOKESPECIAL(cp.addMethodref(Float.class.getName(),CONSTRUCTOR_NAME, "(F)V")) ); } - - - il.append( new AASTORE() ); - // il.append( new DUP() ); }else{ il.append( new ALOAD( load++ ) ); @@ -341,8 +335,8 @@ il.append( new ASTORE( stack ) ); il.append( new ALOAD( stack ) ); if( returnType instanceof ObjectType ) { - if(!returnType.equals(Type.OBJECT)) - il.append( new CHECKCAST( cp.addClass( (ObjectType)returnType ) ) ); + if(!returnType.equals(Type.OBJECT)) + il.append( new CHECKCAST( cp.addClass( (ObjectType)returnType ) ) ); return il.append( new ARETURN() ); }else if ( returnType instanceof BasicType ){ if ( returnType.equals( Type.BOOLEAN ) ){ @@ -388,8 +382,6 @@ return il.append( new IRETURN()); } - - } return null; } @@ -446,16 +438,9 @@ } return null; - - - - } - - private static int loadArg(InstructionList il, Type t, int index,int pos ){ - if( t instanceof BasicType ){ if( t.equals( Type.LONG )) { @@ -476,8 +461,6 @@ }else{ il.append(new ALOAD(pos)); return ++pos; - - } } @@ -514,12 +497,12 @@ }else return new ObjectType(cls.getName()); throw new java.lang.InternalError(cls.getName()); - } private static MethodGen toMethodGen( java.lang.reflect.Method mtd,String className, InstructionList il ,ConstantPoolGen cp){ + Class args [] = mtd.getParameterTypes(); Type arg_types [] = new Type[ args.length ]; for( int i = 0; i < arg_types.length; i++){ @@ -528,9 +511,6 @@ return new MethodGen(ACC_PUBLIC, toType( mtd.getReturnType() ) , arg_types , null, mtd.getName(), className , il, cp); - - - } private static Method generateMethod( java.lang.reflect.Method method, @@ -561,7 +541,7 @@ int loaded = createArgArray(il,factory,cp,mg.getArgumentTypes()); int argArray = loaded; int resutFromBefore = ++loaded ; - + il.append( new ASTORE(argArray) ); if(!abstractM){// invoke before il.append( new ALOAD(0) ); @@ -571,10 +551,10 @@ il.append( new ALOAD( argArray ) ); il.append( new INVOKEINTERFACE(before,4) ); il.append( new ASTORE( resutFromBefore ) ); - + }else { - il.append( new ACONST_NULL() ); - il.append( new ASTORE( resutFromBefore ) ); + il.append( new ACONST_NULL() ); + il.append( new ASTORE( resutFromBefore ) ); } //locals il.append( new ACONST_NULL() ); @@ -615,15 +595,15 @@ if( wrapper != null ){ il.append( initWrapper(mg.getReturnType(),cp) ); } - if( returnsValue ){ - ehEnd = il.append( new ASTORE(resultFromSuper) ); - } + if( returnsValue ){ + ehEnd = il.append( new ASTORE(resultFromSuper) ); + } gotoHandled = new GOTO(null); - if(!returnsValue ){ - ehEnd = il.append( gotoHandled ); - }else{ - il.append( gotoHandled ); - } + if(!returnsValue ){ + ehEnd = il.append( gotoHandled ); + }else{ + il.append( gotoHandled ); + } ehHandled = il.append( new ASTORE(error ) ); } @@ -644,7 +624,6 @@ il.append( new ALOAD(error) ); il.append( new INVOKEINTERFACE(after,8) ); - InstructionHandle exitMethod = generateReturnValue(il,factory,cp,mg.getReturnType(),++loaded); if( !abstractM ){ @@ -662,7 +641,6 @@ return result; } - static class MethodWrapper{ java.lang.reflect.Method method;
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>