[Vm-dev] Interpreter>>signed32BitValueOf: and signed64BitValueOf: broken

John M McIntosh johnmci at smalltalkconsulting.com
Mon Nov 24 07:27:14 UTC 2008


Er is this still broken?

I was writing some Sunits for the Alien stuff and found

alien signedLongAt: 1 put: -1*16r80000000.  " -2147483648"
failed.
triggered by   value < 0 ifTrue:[^self primitiveFail].
as coded below
since value is -2147483648

range is Signed: −2,147,483,648 to +2,147,483,647
http://en.wikipedia.org/wiki/Integer_(computer_science)



On 19-Mar-08, at 8:44 PM, Andreas Raab wrote:

> Hi -
>
> I just noticed hat Interpreter>>signed32BitValueOf: and  
> signed64BitValueOf: are broken for edge cases. The following example  
> will illustrate the problem:
>
> array := IntegerArray new: 1.
> array at: 1 put: 16rFFFFFFFF. "should fail but doesn't"
> array at: 1. "answers -1 incorrectly"
>
> array := IntegerArray new: 1.
> array at: 1 put: -16rFFFFFFFF. "should fail but doesn't"
> array at: 1. "answers 1 incorrectly"
>
> The problem is that both signed32BitValueOf: as well as  
> signed64BitValueOf: do not test whether the high bit of the  
> magnitude is set (which it mustn't to fit into a signed integer).  
> The fix is trivial in both cases - basically all that's needed at  
> the end of both functions is this:
>
>  "Filter out values out of range for the signed interpretation such as
>  16rFFFFFFFF (positive w/ bit 32 set) and -16rFFFFFFFF (negative w/  
> bit
>  32 set). Since the sign is implicit in the class we require that the
>  high bit of the magnitude is not set which is a simple test here"
>  value < 0 ifTrue:[^self primitiveFail].
>  negative
>    ifTrue:[^0 - value]
>    ifFalse:[^value]
>
> Cheers,
>  - Andreas

--
= 
= 
= 
========================================================================
John M. McIntosh <johnmci at smalltalkconsulting.com>
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
= 
= 
= 
========================================================================





More information about the Vm-dev mailing list