Hi,

I'm no BCEL guru, but I used it for a while a few weeks back, so maybe I can help you.

I think the problem must come from the few operations you says you do, but that don't show up on the listing you sent ... Maybe you could send the whole thing.

Maybe one thing, I think you need to call classGen.update() once you changed the method ... But I don't think this will be the cause of your problem.

Simon.

Konstantin Scheglov wrote:

 I use following code to instrument one class.
 But when I instrument some classes and try to print debug
information, I receive following exception.

org.apache.bcel.classfile.ClassFormatException: Invalid constant pool reference: 
28088. Constant pool size is: 1024
       at org.apache.bcel.classfile.ConstantPool.getConstant(ConstantPool.java:242)
       at org.apache.bcel.classfile.Utility.codeToString(Utility.java:369)
       at org.apache.bcel.classfile.Utility.codeToString(Utility.java:166)
       at org.apache.bcel.classfile.Code.toString(Code.java:326)
       at org.apache.bcel.classfile.Code.toString(Code.java:352)
       at java.lang.String.valueOf(String.java:2131)
       at java.io.PrintStream.print(PrintStream.java:462)
       at java.io.PrintStream.println(PrintStream.java:599)
       at ru.nlmk.eclipse.plugins.profiler.trace.Trace.instrumentClass(Trace.java:1190)
       at ru.nlmk.eclipse.plugins.profiler.trace.test.TestBCEL.main(TestBCEL.java:23)


As you can see, I just copy code from one method to another (in real application I change code a little). And when I try to load this class in real application I receive exception like this from JVM: "VerifyError: Illegal constant pool index".


public static JavaClass instrumentClass(JavaClass clazz) throws Exception { ClassGen classGen = new ClassGen(clazz); ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); classGen.setConstantPool(cp); // for (int i = 0; i < clazz.getMethods().length; i++) { Method method = clazz.getMethods()[i]; if (method.isAbstract() || method.isNative()) continue; if (method.getName().equals("finalize")) continue; MethodGen mg = new MethodGen(method, clazz.getClassName(), cp); mg.setConstantPool(cp); Method newMethod = mg.getMethod(); if (m_Debug) { System.out.println(method.getCode()); System.out.println(newMethod.getCode()); } classGen.replaceMethod(method, newMethod); } // JavaClass newClazz = classGen.getJavaClass(); newClazz.setConstantPool(cp.getFinalConstantPool()); return newClazz; }

What I do wrong?
I see such exception only on few classes (methods).
I have example of such class.






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to