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.
        

-- 
Best regards,
 Konstantin                            mailto:[EMAIL PROTECTED]


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

Reply via email to