[ 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)