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

John M McIntosh johnmci at smalltalkconsulting.com
Wed Nov 26 04:17:42 UTC 2008


Ok, well I wrote some SUnit first, to check for byte, short, long.
signed and unsigned.
For byte, and short we can check the entire range of -255 to 255 and  
-65,535 to 65,535  for valid at:put: results
I have a fix for the −2,147,483,648 issue
Now tackling 64bit ones, but first I need to alter the alien ffi logic  
to add get/put longlong since we don't seem to actually have an API in  
say FFI to access the values.


On 25-Nov-08, at 7:03 PM, Andreas Raab wrote:

> It shouldn't fail; it's a bug. Unfortunately, I have no time to fix  
> it.
>
> Cheers,
>  - Andreas
>
> John M McIntosh wrote:
>> Just to clarify with the current VMMaker source code and the FFI  
>> plugin if I do
>> | foo |
>> foo := ByteArray new: 4.
>> foo signedLongAt:1 put:  -2147483648
>> that fails, should it?
>> Begin forwarded message:
>>> From: John M McIntosh <johnmci at smalltalkconsulting.com>
>>> Date: November 23, 2008 11:27:14 PM PST (CA)
>>> To: Squeak Virtual Machine Development Discussion <vm-dev at lists.squeakfoundation.org 
>>> >
>>> Cc: Andreas Raab <andreas.raab at qwaq.com>, "David T. Lewis" <lewis at mail.msen.com 
>>> >
>>> Subject: Re: [Vm-dev] Interpreter>>signed32BitValueOf: and  
>>> signed64BitValueOf: broken
>>> Reply-To: johnmci at smalltalkconsulting.com
>>>
>>> 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
>>> = 
>>> = 
>>> = 
>>> = 
>>> = 
>>> = 
>>> = 
>>> ====================================================================
>>>
>>>
>>>
>> -- 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> John M. McIntosh <johnmci at smalltalkconsulting.com>
>> Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================

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





More information about the Vm-dev mailing list