commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Bourg (JIRA)" <>
Subject [jira] [Commented] (BCEL-161) InstructionTargeters not being properly cleaned up.
Date Fri, 20 Feb 2015 23:51:13 GMT


Emmanuel Bourg commented on BCEL-161:

Thank you very much for the report Thiago. I didn't notice this issue before fixing BCEL-207
with a very similar approach. I added a package private {{dispose()}} method to {{LocalVariableGen}}
which is called from {{MethodGen.removeLocalVariable}}.

You suggested adding a call to {{this.removeLocalVariables()}} in the {{MethodGen}} constructor,
but if I'm not mistaken this is not necessary since the method is already called bellow when
the attributes are parsed and the LocalVariableTable is encountered.

It seems the {{removeTargets()}} method in {{CodeExceptionGen}}, {{Select}} and {{BranchInstruction}}
aren't used so I'll pass on them for now, but I like the idea.

I applied your documentation improvements to InstructionTargeter.

> InstructionTargeters not being properly cleaned up.
> ---------------------------------------------------
>                 Key: BCEL-161
>                 URL:
>             Project: Commons BCEL
>          Issue Type: Bug
>          Components: Main
>    Affects Versions: 5.3
>            Reporter: Thiago
>            Assignee: Apache Commons Developers
>            Priority: Minor
>         Attachments: patch.diff
> It seems that InstructionTargeters are not being properly cleaned up when they are not
used anymore. That is, when a targeter is replaced or removed (e.g., a LocalVariableGen is
removed from a method), the targeter remains in the targeters list of its targets.
> For example, MethodGen's constructor which receives a Method uses its other constructor
to initialize the object:
> {code}
> public MethodGen(Method m, String class_name, ConstantPoolGen cp) {
>    this(
>        m.getAccessFlags(), 
>        Type.getReturnType(m.getSignature()),
>        Type.getArgumentTypes(m.getSignature()),
>        null /* may be overridden anyway */,
>        m.getName(), 
>        class_name,
>        ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) ==
0) ? new InstructionList(m.getCode().getCode()) : null, cp);
> ...
> }
> {code}
> Because this call passes null as its 4th argument, the constructor will create placeholder
LocalVariableGen for the arguments (like arg0, arg1, etc). Later in this constructor the arguments
will be overridden (as indicated by the comment). However, the LocalVariableGens of the placeholder
arguments (as well as the LocalVariableGen for the "this" variable) will remain in the targeter
lists of the first and last instructions of the instruction list.
> To avoid this problem I am submitting a patch in attachment. It adds a new method to
> {code}
>     /**
>      * Removes all targets of this targeter.
>      */
>     void removeTargets();
> {code}
> and implements it to remove the targeter from the target's lists. The patch also calls
removeTargets() when discarding targeters in MethodGen.

This message was sent by Atlassian JIRA

View raw message