[ 
https://issues.apache.org/jira/browse/BCEL-161?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14329783#comment-14329783
 ] 

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: https://issues.apache.org/jira/browse/BCEL-161
>             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 InstructionTargeter:
> {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
(v6.3.4#6332)

Reply via email to