Hi all,,
This is my first question in bcel-mailing list. I have the following problem:
I write a simple code to transform a method code such that it should invoke
another method providing its parameters as an argument to this new method. for
example:
// original method
public void orgMethod(String A, int B, Object C) {...}
//should be transformed to:
public void orgMethod(String A, int B, Object C)
{
Object[] args = new Object[]{A, B, C};
anotherMethod("origMethod", args);
}
The funny thing at this point is that I use the BCEL library to weave the new
method's code as follow:
////////////////////////////////////////////////////////////////////////////////////////////
LocalVariableGen selfArgs = mg2.addLocalVariable("args", new
ArrayType(Type.OBJECT, 1), null, null);
// mg2 is an MethodGen instance that is initiated from
origMethod .. :)
LocalVariableGen for_q = mg2.addLocalVariable("indx", Type.INT, null, null);
int methodNameIndex = cpg.addString(mg2.getName());
il2.append(new ICONST(mg2.getArgumentNames().length));
il2.append(new ANEWARRAY(objectType_Index));
il2.append(new ASTORE(selfArgs.getIndex()));
il2.append(new ICONST(-1));
il2.append(new ISTORE(for_q.getIndex()));
for(int i = 1; i<= mg2.getArgumentNames().length; i++)
{
il2.append(new IINC(for_q.getIndex(), 1));
il2.append(new ALOAD(selfArgs.getIndex()));
il2.append(new ILOAD(for_q.getIndex()));
il2.append(InstructionFactory.createLoad(mg2.getArgumentTypes()[i-1], i));
il2.append(InstructionFactory.createArrayStore(Type.OBJECT));
}
il2.append(new ALOAD(0));
il2.append(new LDC(methodNameIndex));
il2.append(new ALOAD(selfArgs.getIndex()));
il2.append(ifact.createInvoke(fullQualifiedClassName,
"anotherMethod", Type.OBJECT, new Type[]{Type.STRING, new
ArrayType(Type.OBJECT,1)}, Constants.INVOKEVIRTUAL));
////////////////////////////////////////////////////////////////////////////////////////////
which produces a nice code!!.
public void orgMethod(String A, int B, Object C)
{
Object[] args = new Object[3];
int indx = -1;
indx ++;
args[indx] = A;
indx ++;
args[indx] = B;
indx ++;
args[indx] = C;
anotherMethod("origMethod", args);
}
But an exception is thrown after the new origMethod.
Exception in thread "main" java.lang.VerifyError: (class: pkg/C, method:
origMethod signature: (Ljava.lang.String;ILjava.lang.Object;)V) Expecting to
find object/array on stack
any help will be so much appreciated.
Abdullah