Hi Abdullah, Your anotherMethod probably returns something. This is inconsistent with the state of the stack after a call.
You can make it void or just add a POP instruction after the INVOKEVIRTUAL to discard the returned value. Hope that helps. Frederic. On Thu, Apr 30, 2009 at 2:18 PM, Abdullah Odeh Al-Zaghameem <[email protected]> wrote: > > 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 > > > > >
