<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2016-03-08 18:17 GMT+01:00  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1714.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1714.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-EstebanLorenzano.1714<br>
Author: EstebanLorenzano<br>
Time: 8 March 2016, 6:16:11.06581 pm<br>
UUID: e83d2c5f-76cd-47fc-ac29-6c4a25fa5deb<br>
Ancestors: VMMaker.oscog-nice.1713<br>
<br>
Remove wrong coertion. If coertion is present, this assertion fails:<br>
<br>
ref := ByteArray new: 4.<br>
ref integerAt: 1 put: -10 size: 4 signed: true.<br>
self assert: (ref integerAt: 1 size: 4 signed: true) = -10<br>
<br>
<br>
=============== Diff against VMMaker.oscog-nice.1713 ===============<br>
<br>
Item was changed:<br>
  ----- Method: ThreadedFFIPlugin&gt;&gt;primitiveFFIIntegerAt (in category &#39;primitives&#39;) -----<br>
  primitiveFFIIntegerAt<br>
        &quot;Answer a (signed or unsigned) n byte integer from the given byte offset<br>
         in the receiver, using the platform&#39;s endianness.&quot;<br>
        | isSigned byteSize byteOffset rcvr addr value mask valueOop |<br>
        &lt;var: &#39;value&#39; type: #usqLong&gt;<br>
        &lt;var: &#39;mask&#39; type: #usqLong&gt;<br>
        &lt;export: true&gt;<br>
        &lt;inline: false&gt;<br>
        isSigned := interpreterProxy booleanValueOf: (interpreterProxy stackValue: 0).<br>
        byteSize := interpreterProxy stackIntegerValue: 1.<br>
        byteOffset := interpreterProxy stackIntegerValue: 2.<br>
        rcvr := interpreterProxy stackObjectValue: 3.<br>
        interpreterProxy failed ifTrue:[^0].<br>
        (byteOffset &gt; 0<br>
         and: [(byteSize between: 1 and: 8)<br>
         and: [(byteSize bitAnd: byteSize - 1) = 0 &quot;a.k.a. isPowerOfTwo&quot;]]) ifFalse:<br>
                [^interpreterProxy primitiveFail].<br>
        addr := self ffiAddressOf: rcvr startingAt: byteOffset size: byteSize.<br>
        interpreterProxy failed ifTrue:[^0].<br>
        byteSize &lt;= 2<br>
                ifTrue:<br>
                        [byteSize = 1<br>
                                ifTrue: [value := self cCoerceSimple: (interpreterProxy byteAt: addr) to: #&#39;unsigned char&#39;]<br>
                                ifFalse: [value := self cCoerceSimple: (interpreterProxy shortAt: addr) to: #&#39;unsigned short&#39;]]<br>
                ifFalse:<br>
                        [byteSize = 4<br>
+                               ifTrue: [value := interpreterProxy long32At: addr]<br>
-                               ifTrue: [value := self cCoerceSimple: (interpreterProxy long32At: addr) to: #&#39;unsigned int&#39;]<br></blockquote><div><br><br></div><div>This will fix 32bits spur, but what will happen with 64bits?<br></div><div>It will happen that you&#39;ll break 32bits unsigned access...<br><br></div><div>0xFFFFFFFF will be interpreted as -1 (long32At:) then promoted to 0xFFFFFFFFFFFFFFFFULL then I don&#39;t know what integerObjectOf: will do of it... Probably not the right thing :(<br><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                                ifFalse: [value := interpreterProxy long64At: addr]].<br>
        byteSize &lt; BytesPerWord<br>
                ifTrue:<br>
                        [isSigned ifTrue: &quot;sign extend value&quot;<br>
                                [mask := 1 &lt;&lt; (byteSize * 8 - 1).<br>
                                value := (value bitAnd: mask-1) - (value bitAnd: mask)].<br>
                         &quot;note: byte/short (&amp;long if BytesPerWord=8) never exceed SmallInteger range&quot;<br>
                         valueOop := interpreterProxy integerObjectOf: value]<br>
                ifFalse: &quot;general 64 bit integer; note these never fail&quot;<br>
                        [valueOop := isSigned<br>
                                                        ifTrue:[interpreterProxy signed64BitIntegerFor: value]<br>
                                                        ifFalse:[interpreterProxy positive64BitIntegerFor: value]].<br>
        ^interpreterProxy pop: 4 thenPush: valueOop!<br>
<br>
</blockquote></div><br></div></div>