<div dir="ltr">Hi Eliot, there's the same code in primitiveFFIIntegerAt<br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-11-04 20:15 GMT+01:00 Esteban Lorenzano <span dir="ltr"><<a href="mailto:estebanlm@gmail.com" target="_blank">estebanlm@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
will this fix the problem I reported a couple of hours ago? (It looks like, but I’m in a train and I cannot test it right now)<br>
<span class="HOEnZb"><font color="#888888"><br>
Esteban<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> On 4 Nov 2016, at 20:11, <a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a> wrote:<br>
><br>
><br>
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:<br>
> <a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1977.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/<wbr>VMMaker/VMMaker.oscog-eem.<wbr>1977.mcz</a><br>
><br>
> ==================== Summary ====================<br>
><br>
> Name: VMMaker.oscog-eem.1977<br>
> Author: eem<br>
> Time: 4 November 2016, 12:11:15.657943 pm<br>
> UUID: e12daf50-ab4d-4d62-9c65-<wbr>18cd20e5c0fe<br>
> Ancestors: VMMaker.oscog-eem.1976<br>
><br>
> Fix bounds check for unsigned store in primitiveFFIIntegerAtPut.  Must use an unsigned long long comparison.<br>
><br>
> =============== Diff against VMMaker.oscog-eem.1976 ===============<br>
><br>
> Item was changed:<br>
>  ----- Method: ThreadedFFIPlugin>><wbr>primitiveFFIIntegerAtPut (in category 'primitives') -----<br>
>  primitiveFFIIntegerAtPut<br>
>       "Store a (signed or unsigned) n byte integer at the given byte offset<br>
>        in the receiver, using the platform's endianness."<br>
>       | isSigned byteSize byteOffset rcvr addr value max valueOop |<br>
>       <var: 'value' type: #sqLong><br>
>       <var: 'max' type: #sqLong><br>
>       <export: true><br>
>       <inline: false><br>
>       isSigned := interpreterProxy booleanValueOf: (interpreterProxy stackValue: 0).<br>
>       byteSize := interpreterProxy stackIntegerValue: 1.<br>
>       valueOop := interpreterProxy stackValue: 2.<br>
>       byteOffset := interpreterProxy stackIntegerValue: 3.<br>
>       rcvr := interpreterProxy stackObjectValue: 4.<br>
>       interpreterProxy failed ifTrue:[^0].<br>
>       (byteOffset > 0<br>
>        and: [(byteSize between: 1 and: 8)<br>
>        and: [(byteSize bitAnd: byteSize - 1) = 0 "a.k.a. isPowerOfTwo"]]) ifFalse:<br>
>               [^interpreterProxy primitiveFail].<br>
>       addr := self ffiAddressOf: rcvr startingAt: byteOffset size: byteSize.<br>
>       interpreterProxy failed ifTrue:[^0].<br>
>       isSigned<br>
>               ifTrue:[value := interpreterProxy signedMachineIntegerValueOf: valueOop]<br>
>               ifFalse:[value := interpreterProxy positiveMachineIntegerValueOf: valueOop].<br>
>       interpreterProxy failed ifTrue:[^0].<br>
>       byteSize < BytesPerWord ifTrue:<br>
>               [isSigned<br>
>                       ifTrue:<br>
> +                             [max := 1 asUnsignedLongLong << (8 * byteSize - 1).<br>
> -                             [max := 1 << (8 * byteSize - 1).<br>
>                               (value >= (0 - max) and: [value < max]) ifFalse: [^interpreterProxy primitiveFail]]<br>
>                       ifFalse:<br>
> +                             [value asUnsignedLongLong < (1 asUnsignedLongLong << (8 * byteSize)) ifFalse: [^interpreterProxy primitiveFail]]].<br>
> -                             [value asUnsignedLongLong < (1 << (8*byteSize)) ifFalse: [^interpreterProxy primitiveFail]]].<br>
>       byteSize <= 2<br>
>               ifTrue:<br>
>                       [byteSize = 1<br>
>                               ifTrue: [interpreterProxy byteAt: addr put: value]<br>
>                               ifFalse: [interpreterProxy shortAt: addr put: value]]<br>
>               ifFalse:<br>
>                       [byteSize = 4<br>
>                               ifTrue: [interpreterProxy long32At: addr put: value]<br>
>                               ifFalse: [interpreterProxy long64At: addr put: value]].<br>
>       ^interpreterProxy pop: 5 thenPush: valueOop!<br>
><br>
<br>
</div></div></blockquote></div><br></div>