jakarta-bcel-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Felix Dorner <FDor...@zed.com>
Subject RE: Extract Constructor Code to new method
Date Thu, 02 Jul 2009 14:54:52 GMT
Hi Abdullah,

> InstructionList il = new InstructionList(); Method
> theOldConstructor = cg.containsMethod("<>", "()V"); MethodGen
> theNewConstructor = new MethodGen(Constants.ACC_PUBLIC,
> Type.VOID, Type.NO_ARGS, NO_STRINGS, "<init>",
> cg.getClassName(), il, cpg);
> il.append(ifact.createInvoke(cg.getSuperclassName(),
> "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
> il.append(InstructionConstants.RETURN);
> cg.replaceMethod(theOldConstructor,
> theNewConstructor.getMethod()); il.dispose(); cg.setConstantPool(cpg);

Wouldn't this just 'delete' the old constructor, and create a new 'default' one?
What misses is to move the code that's inside the old constructor into an ordinairy method.
What I came up with so far was to:

/* look up the default constructor */
Method constructor_method = getConstructors().get(0);
ConstantPoolGen cpgen = new ConstantPoolGen(jc.getConstantPool());

MethodGen constructor = new MethodGen(constructor_method, jc.getClassName(), new ConstantPoolGen(jc.getConstantPool()));
InstructionList constructor_code = constructor.getInstructionList();

/* a new method. Later I'd need to find a unique name.. I also copy the constructor's instruction
MethodGen newmethod = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, new Type[] {}, new String[]
{}, "xaxaxa", jc.getClassName(),  constructor_code.copy() , cpgen);

InstructionHandle[] newmethod_instructions = newmethod.getInstructionList().getInstructionHandles();

/* remove the first two instructions (the one that loads the object variable this,
And the invocation of the super-constructor... */
try {
        newmethod.getInstructionList().delete(newmethod_instructions[0], newmethod_instructions[1]);
} catch (TargetLostException e) {
        /* not only the target is lost here.. But me too.. :-)

... Now I'd probably need to handle
 * local variables
 * exception handlers

What I don't really pick up is the instruction target exceptions (which in fact get thrown
by several LineNumberGen's in my tests..)


To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-user-help@jakarta.apache.org

View raw message