[squeak-dev] Bug in BytecodeGenerator>>#jump:if:
Mathieu Suen
mathk.sue at gmail.com
Tue Jun 24 09:54:32 UTC 2008
Cool
On Jun 24, 2008, at 10:51 AM, Marcus Denker wrote:
>
>
> 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.
> ].
> ]
> ! !
>
>
>
>
>
Mth
More information about the Squeak-dev
mailing list
|