> The method has a max stack size parameter somewhere. I
> forget the name.
> It doesn't verify if the max size is exceeded. You can
> update the size.
Hi Erik,
If i call MethodGen#getMaxStack() before and after instrumenting the
method both values are the same.
If i call MethodGen#setMaxStack() i get following Exception:
java.lang.NullPointerException
at
org.apache.bcel.generic.FieldOrMethod.getSignature(FieldOrMethod.java:54
)
at
org.apache.bcel.generic.InvokeInstruction.getReturnType(InvokeInstructio
n.java:109)
at
org.apache.bcel.generic.InvokeInstruction.produceStack(InvokeInstruction
.java:88)
at
org.apache.bcel.generic.MethodGen.getMaxStack(MethodGen.java:928)
at
org.apache.bcel.generic.MethodGen.setMaxStack(MethodGen.java:814)
at test.BCELRewriter.main(BCELRewriter.java:34)
I post my two test classes - Sample.class is insrumented by class
BCELRewriter:
package test;
public class Sample
{
protected int protectedField;
Sample()
{
protectedField++;
}
}
package test;
import org.apache.bcel.*;
import org.apache.bcel.classfile.*;
import org.apache.bcel.generic.*;
public class BCELRewriter
{
public static void main( String[] args )
throws Exception
{
JavaClass clazz = Repository.lookupClass( "test.Sample" );
ConstantPoolGen cp = new ConstantPoolGen(
clazz.getConstantPool() );
ClassGen cg = new ClassGen( clazz );
InstructionFactory instrFactory = new InstructionFactory( cg );
Method[] methods = clazz.getMethods();
for( int i=0; i < methods.length; i++ )
{
MethodGen mg = new MethodGen(methods[i], cg.getClassName(),
cp);
InstructionList instrList = mg.getInstructionList();
Instruction preReturnInstr =
instrList.getEnd().getPrev().getInstruction();
System.out.println( "MaxStackSize before: " +
mg.getMaxStack() );
System.out.println( mg.getInstructionList() );
instrList.append(preReturnInstr,
buildStaticInvoke(instrFactory) );
System.out.println( "MaxStackSize after: " +
mg.getMaxStack() );
System.out.println( mg.getInstructionList() );
mg.setMaxStack();
methods[i] = mg.getMethod();
}
cg.setMethods( methods );
cg.getJavaClass().dump( "C:\\test\\Sample.class" );
}
private static InstructionList buildStaticInvoke(InstructionFactory
instrFactory)
{
InstructionList il = new InstructionList();
InvokeInstruction invokeLog = instrFactory.createInvoke(
"test.Logger",
"log",
Type.VOID,
new Type[] { Type.STRING, Type.STRING,
Type.STRING, Type.STRING },
Constants.INVOKESTATIC);
ConstantPoolGen constPoolGen = instrFactory.getConstantPool();
il.append(new PUSH(constPoolGen, "arg1"));
il.append(new PUSH(constPoolGen, "arg2"));
il.append(new PUSH(constPoolGen, "arg3"));
il.append(new PUSH(constPoolGen, "arg4"));
il.append( invokeLog );
return il;
}
}
When running "java test.Sample" i get following error:
java.lang.VerifyError: (class: test/Sample, method: <init> signature:
()V) Stack size too large
Exception in thread "main"
If you only use three arguments everything works fine...?!
Kind Regards,
Patrick
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]