[squeak-dev] Bug in BytecodeGenerator>>#jump:if:

Marcus Denker denker at iam.unibe.ch
Tue Jun 24 08:51:33 UTC 2008


On Sun, Jun 22, 2008 at 6:11 PM, stephane ducasse <stephane.ducasse at free.fr>
wrote:

> Normally there is a mailing-list for the newcompiler but indeed we should
> have a bugtracker.
>

I have now set up a google code bugtracker for the NewCompiler:

   http://code.google.com/p/squeaknewcompiler/issues/

   Marcus



>
> Stef
>
> On Jun 22, 2008, at 12:54 PM, André Wendt wrote:
>
>  Hi all,
>>
>> apologies if this doesn't belong here. Mantis is a usability-nightmare
>> and I didn't know where else to report a bug in the NewCompiler. The
>> corresponding ML on squeakfoundation.org hasn't been posted to in over
>> six months.
>>
>> I've noticed that BytecodeGenerator>>#jump:if: has a bug when given a
>> distance >= 1024.
>>
>> It states
>>
>> hi := distance // 256.
>>
>> and then goes on checking if hi < 8. If that's false, the jump is
>> assumed to be too big. However, the check should be hi < 4.
>>
>> Assume the method gets an argument of 1024, and hi is 4. The following
>>
>> self nextPut: (Bytecodes at: #longJumpIfFalse) first + hi.
>>
>> generates bytecode 176, which is an arithmetic message send instead of a
>> conditional jump.
>>
>> I've attached a changeset that checks both jump conditions for hi < 4.
>>
>> Regards,
>> André
>> 'From Squeak3.10.1 of ''26 May 2008'' [latest update: #7175] on 22 June
>> 2008 at 12:36:17 pm'!
>>
>> !BytecodeGenerator methodsFor: 'private' stamp: 'awe 6/22/2008 12:35'!
>> jump: distance if: condition
>>
>>        | hi |
>>        distance = 0 ifTrue: [
>>                "jumps to fall through, no-op"
>>                ^ self nextPut: (Bytecodes at: #popStackBytecode)].
>>        condition ifTrue: [
>>                hi := distance // 256.
>>                hi < 4 ifFalse: [self error: 'true jump too big'].
>>                self nextPut: (Bytecodes at: #longJumpIfTrue) first + hi.
>>                self nextPut: distance \\ 256.
>>        ] ifFalse: [
>>                distance <= 8 ifTrue: [
>>                        self nextPut: (Bytecodes at: #shortConditionalJump)
>> first + distance - 1.
>>                ] ifFalse: [
>>                        hi := distance // 256.
>>                        hi < 4 ifFalse: [self error: 'false jump too big'].
>>                        self nextPut: (Bytecodes at: #longJumpIfFalse)
>> first + hi.
>>                        self nextPut: distance \\ 256.
>>                ].
>>        ]
>> ! !
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20080624/af8c573a/attachment.htm


More information about the Squeak-dev mailing list