<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2016-02-24 1:35 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1696.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1696.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-eem.1696<br>
Author: eem<br>
Time: 23 February 2016, 4:35:02.71435 pm<br>
UUID: 4db47df6-c329-44ca-a255-7483a9cac28f<br>
Ancestors: VMMaker.oscog-tfel.1695<br>
<br>
Fix serious bug in jitted perform: primitive.  Thanks to Stéphane Ducasse for finding and to Levente Uzoni for diagnosing </blockquote><div><br></div><div>Rendons à Stéphane Rollandin ce qui n&#39;est pas à César...<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">the bug.  If the argument count is one greater than the max number of register aerguments (2 in Spur, hence perform:with:with:) then the code to remove the receiver and arguments from the stack forgot to remove the receiver and selector.<br>
<br>
=============== Diff against VMMaker.oscog-tfel.1695 ===============<br>
<br>
Item was changed:<br>
  ----- Method: StackToRegisterMappingCogit&gt;&gt;adjustArgumentsForPerform: (in category &#39;primitive generators&#39;) -----<br>
  adjustArgumentsForPerform: numArgs<br>
        &quot;Generate code to adjust the possibly stacked arguments immediately<br>
         before jumping to a method looked up by a perform primitive.&quot;<br>
        self assert: self numRegArgs &lt;= 2.<br>
        self assert: numArgs &gt;= 1.<br>
        numArgs &lt;= self numRegArgs ifTrue:<br>
                [numArgs = 2 ifTrue:<br>
                        [self MoveR: Arg1Reg R: Arg0Reg].<br>
                 ^self].<br>
<br>
+       &quot;If the arity is one more than the max numRegArgs, the receiver and all arguments have to be removed from the stack.&quot;<br>
        self numRegArgs + 1 = numArgs ifTrue:<br>
                [backEnd hasLinkRegister<br>
                        ifTrue:<br>
+                               [self numRegArgs = 2<br>
+                                       ifTrue:<br>
+                                               [self MoveMw: 0 r: SPReg R: Arg1Reg.<br>
+                                                self MoveMw: objectMemory wordSize r: SPReg R: Arg0Reg]<br>
+                                       ifFalse:<br>
+                                               [self MoveMw: 0 r: SPReg R: Arg0Reg].<br>
+                                self AddCq: numArgs + 1 * objectMemory wordSize R: SPReg]<br>
-                               [self numRegArgs = 2 ifTrue:<br>
-                                       [self PopR: Arg1Reg].<br>
-                                self PopR: Arg0Reg]<br>
                        ifFalse:<br>
+                               [self MoveMw: 0 r: SPReg R: TempReg. &quot;save retpc&quot;<br>
+                                self numRegArgs = 2<br>
+                                       ifTrue:<br>
+                                               [self MoveMw: objectMemory wordSize r: SPReg R: Arg1Reg.<br>
+                                                self MoveMw: objectMemory wordSize * 2 r: SPReg R: Arg0Reg]<br>
+                                       ifFalse:<br>
+                                               [self MoveMw: objectMemory wordSize r: SPReg R: Arg0Reg].<br>
+                                self AddCq: numArgs + 1 * objectMemory wordSize R: SPReg.<br>
+                                self MoveR: TempReg Mw: 0 r: SPReg &quot;Overwrite pushed receiver; ReceiverResultReg already contains receiver.&quot;].<br>
-                               [self PopR: TempReg. &quot;save retpc&quot;<br>
-                                self numRegArgs = 2 ifTrue:<br>
-                                       [self PopR: Arg1Reg].<br>
-                                self MoveMw: 0 r: SPReg R: Arg0Reg.<br>
-                                self MoveR: TempReg Mw: 0 r: SPReg].<br>
                 ^self].<br>
<br>
        &quot;e.g.   Receiver                                Receiver<br>
                        Selector/Arg0   =&gt;              Arg1<br>
                        Arg1                                    Arg2<br>
                        Arg2                    sp-&gt;    Arg3<br>
         sp-&gt;   Arg3&quot;<br>
        super adjustArgumentsForPerform: numArgs!<br>
<br>
</blockquote></div><br></div></div>