commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sebb (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (BCEL-144) Branch target offset too large for short
Date Wed, 19 Aug 2015 23:35:48 GMT

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

Sebb commented on BCEL-144:
---------------------------

Looks OK, but needs unit tests.

> Branch target offset too large for short
> ----------------------------------------
>
>                 Key: BCEL-144
>                 URL: https://issues.apache.org/jira/browse/BCEL-144
>             Project: Commons BCEL
>          Issue Type: Bug
>          Components: Main
>            Reporter: cfeldmann
>            Assignee: Apache Commons Developers
>              Labels: PatchAvailable
>         Attachments: large_branch_target_fix.patch
>
>
> When BCEL encounters a BranchInstruction offset that is >= 32767, it throws the following
exception:
> {code}
> com.sitraka.pas.sandbox.org.apache.bcel.generic.ClassGenException: Branch target offset
too large for short
> at com.sitraka.pas.sandbox.org.apache.bcel.generic.BranchInstruction.dump(BranchInstruction.java:99)
> at com.sitraka.pas.sandbox.org.apache.bcel.generic.InstructionList.getByteCode(InstructionList.java:993)
> at com.sitraka.pas.sandbox.org.apache.bcel.generic.MethodGen.getMethod(MethodGen.java:616)
> {code}
> BCEL-66 was previously filed about this exception and closed because the class that was
causing the error and the suggested solution were both violating the rules of the language.
My situation is a little different, so I am filing a new bug. 
> I am inserting bytecodes into a method that is large, but within the limits defined by
the language. Due to the size of the method, a number of the branch targets are large, but
still small enough to fit in a short. After I insert bytecodes, the method size is still smaller
than the method size limit but the large branch targets increase enough so that they no longer
fit in a short and the exception occurs. 
> I have solved the problem and am including a patch. My solution is to check the InstructionList
for any branch targets that are too large to fit in a short and append a goto and a goto_w
after every such instruction. I set the goto's target to the instruction that followed the
branch instruction before I did my append so that the default behaviour is to maintain the
original path of execution and jump over the goto_w. I set the goto_w's target to the branch
instruction's target, then I set the branch instruction's target to the goto_w. I am doing
this only for IfInstructions because JSRs, GOTOs and Selects seem to handle large branch targets
in their implementations of updatePosition. This works and is within the rules defined by
the language as far as I can tell.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message