[
https://issues.apache.org/jira/browse/BCEL-161?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Emmanuel Bourg resolved BCEL-161.
---------------------------------
Resolution: Duplicate
Fix Version/s: 6.0
> 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
> Fix For: 6.0
>
> 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)