<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div></div><div>Hi all,</div><div><br></div><div>Do you know when this fix will be added in a new squeak vm release ?</div><div><br></div><div>I really need it for my thesis... So I tried to build the vm (without VMMaker since it doesn't want to be loaded...).</div><div><br></div><div>This is how I tried to fix the interp.c file (it's probably wrong since this doesn't fix anything) :</div><div><br></div><div><div>sqInt primitiveExecuteMethod(void) {</div><div>register struct foo * foo = &amp;fum;</div><div>&nbsp;&nbsp; &nbsp;sqInt top;</div><div>&nbsp;&nbsp; &nbsp;sqInt successValue;</div><div>&nbsp;&nbsp; &nbsp;sqInt primIdx;</div><div>&nbsp;&nbsp; &nbsp;sqInt nArgs;</div><div>&nbsp;&nbsp; &nbsp;sqInt delta;</div><div>&nbsp;&nbsp; &nbsp;sqInt primBits;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>/* begin popStack */</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>top = longAt(foo->stackPointer);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foo->stackPointer -= BytesPerWord;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foo->newMethod = top;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>/* begin primitiveIndexOf: */</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>primBits = (((usqInt) (longAt((foo->newMethod + BaseHeaderSize) + (HeaderIndex &lt;&lt; ShiftForWord)))) >> 1) &amp; 268435967;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foo->primitiveIndex = (primBits &amp; 511) + (((usqInt) primBits) >> 19);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>/* begin success: */</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>successValue = (foo->argumentCount - 1) == ((((usqInt) (longAt((foo->newMethod + BaseHeaderSize) + (HeaderIndex &lt;&lt; ShiftForWord)))) >> 25) &amp; 15);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foo->successFlag = successValue &amp;&amp; foo->successFlag;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (foo->successFlag) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>foo->argumentCount -= 1;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>/* begin executeNewMethod */</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (foo->primitiveIndex > 0) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* begin primitiveResponse */</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (DoBalanceChecks) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>nArgs = foo->argumentCount;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>delta = foo->stackPointer - foo->activeContext;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>primIdx = foo->primitiveIndex;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>foo->successFlag = 1;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>dispatchFunctionPointerOnin(primIdx, primitiveTable);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (DoBalanceChecks) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if (!(balancedStackafterPrimitivewithArgs(delta, primIdx, nArgs))) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>printUnbalancedStack(primIdx);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (foo->successFlag) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>goto l1;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>activateNewMethod();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>/* begin quickCheckForInterrupts */</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ((foo->interruptCheckCounter -= 1) &lt;= 0) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>checkForInterrupts();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>l1:<span class="Apple-tab-span" style="white-space:pre">        </span>/* end executeNewMethod */;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span><b>foo->successFlag = 1;</b></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>/* begin unPop: */</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>foo->stackPointer += 1 * BytesPerWord;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div></div><div><br></div><div>Basically, I just added "foo->successFlag = 1;" after&nbsp;/* end executeNewMethod */;.</div><div><br></div><div>Cheers,</div><div><br></div><div>Antoine</div><div><br></div><br><blockquote type="cite"><div>Date:&nbsp;Oct 28, 2008; 12:55am<br>Author:&nbsp;Eliot Miranda-2<br>Squeak - Dev&nbsp;(<a href="http://www.nabble.com/Squeak---Dev-f14154.html">http://www.nabble.com/Squeak---Dev-f14154.html</a>)<br></div>Well I actually wrote the fix as<div><br><div><div>primitiveExecuteMethod</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>"receiver, args, then method are on top of stack. Execute method against receiver and args"</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>newMethod := self popStack.</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>primitiveIndex := self primitiveIndexOf: newMethod.</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>self success: argumentCount - 1 = (self argumentCountOf: newMethod).</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>successFlag</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>ifTrue: [argumentCount := argumentCount - 1.</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>self executeNewMethod.</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>"Recursive xeq affects successFlag"</div><div><span class="Apple-tab-span" style="white-space: pre; ">                        </span>successFlag := true]</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>ifFalse: [self unPop: 1]</div><div><br></div><div>to agree with the perform code. &nbsp;The fix is to ensure that successFlag is true.</div><br></div></div></blockquote><div><div><div><br></div></div></div></body></html>