<br><br><div class="gmail_quote">On Tue, Jul 1, 2008 at 2:23 PM, tim Rowledge &lt;<a href="mailto:tim@rowledge.org">tim@rowledge.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
I did primitive error codes at Cadence and they&#39;ll very probably b making it into Cog real soon now. &nbsp;They&#39;re simpler than VisualWorks&#39;, being only symbols. &nbsp;So extracting more information, such as a related error code requires a subsequent call. &nbsp;But I think the work I&#39;m doing right now on eliminating pushRemappableOop:/popRemappableOop will enable me to have a structured object with a name and parameters, which is more generally useful.<br>

</blockquote>
<br>
So.... what is the anticipated way that will work? I&#39;m not sure I see the need for a two step process anyway.<br>
<br>
The version we did at Interval in 98 was very simple, providing a call for prims to stuff some object (we used SmallInts in prcatice, but anything was allowed) into the first slot in the context that got activated on the fail. We extended the primitive declaration pragma to allow optional naming of the tempvar - default was &#39;errorValue&#39; I think - and that was it. Code following the prim call could use or ignore the temp.</blockquote>
<div><br>The compiler is modified to recognise &lt;primitive: integer errorCode: identifier&gt; and &lt;primitive:&nbsp;identifier&nbsp;module:&nbsp;identifier&nbsp;errorCode: identifier&gt; and convert this into one additional temp and generate a long storeTemp as the first instruction of the method.<br>
<br>The VM is modified to, on primitive failure, check for the&nbsp;&nbsp;long storeTemp and stores the error code if it sees it.<br><br>Old images lack the storeTemp so the VM does not store the value. &nbsp;Old VMs do perform the storeTemp, but because the storeTemp is storing into the stack top it is effectively a noop. &nbsp;e.g. if the primitive looks like:<br>
<br><span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><b>primitiveAdoptInstance:</b><font color="#000000">&nbsp;</font><font color="#00007F"><i>anObject</i></font><i></i><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">&lt;</font><font color="#007F00"><b>primitive:</b></font><b></b><font color="#000000">&nbsp;</font><font color="#7F0000">160</font><font color="#000000">&nbsp;error:&nbsp;</font><font color="#6B6B6B"><i>ec</i></font><i></i><font color="#000000">&gt;</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>ec</i></font><i></i><font color="#000000">&nbsp;</font><font color="#00007F">==</font><font color="#000000">&nbsp;</font><font color="#00007F"><b>#&#39;no modification&#39;</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">ifTrue:</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">[</font><font color="#7F0000"><b>^</b></font><b></b><font color="#000000"><b>NoModificationError</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">signal:</font><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">message:</font><font color="#000000">&nbsp;</font><font color="#007F00">(</font><font color="#000000"><b>Message</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">selector:</font><font color="#000000">&nbsp;</font><font color="#00007F"><b>#primitiveAdoptInstance:</b></font><b></b><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">arguments:</font><font color="#000000">&nbsp;</font><font color="#000000">{</font><font color="#00007F"><i>anObject</i></font><i></i><font color="#000000">}</font><font color="#007F00">)</font><font color="#000000">]</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">primitiveFailed</font></span><br><br>then the header says the method has 2 temps (anObject &amp; ec). &nbsp;The VM initializes the context with stackp pointing at the second temp (ec). &nbsp;The merthod starts with a long storeTemp: 2. &nbsp;So the nil ec gets stored into itself. &nbsp;The compiler generates a long storeTemp to make it quicker to check for the method starting with a storeTemp.<br>
<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
A nice thing is that the code is forwards and backewards compatible. &nbsp;One can use the VM to run older images. &nbsp;One can run images that contain the primitive error code on older VMs, where one simply gets a nil error code on primitive failure.<br>

<br>
</blockquote>
Sure, if the temp is used by return-code-unaware methods in an older image then it can&#39;t make much difference because it would be assumed nil as normal. Running new images on older VMs isn&#39;t something we&#39;ve ever much bothered with for Squeak so don&#39;t worry about it.<br>

<br>
I&#39;m going to guess that &quot;work I&#39;m doing right now on eliminating pushRemappableOop:/popRemappableOop&quot; relates to getting allocations out of primitives as much as possible, right? &nbsp;That would be nice.</blockquote>
<div><br>No. &nbsp;This relates to not having to use pushRemappableOop:/popRemappableOop because it is extremely error-prone. &nbsp;For example can you spot the bug in this:<br><br><span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><b>primitivePerform</b><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F7F7F">|</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performSelector</i></font><i></i><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>newReceiver</i></font><i></i><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>lookupClass</i></font><i></i><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performMethod</i></font><i></i><font color="#000000">&nbsp;</font><font color="#7F7F7F">|</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>performSelector</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>performMethod</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">stackValue:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">-</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>newReceiver</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">stackValue:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007F00"><i>&quot;NOTE: the following lookup may fail and be converted to #doesNotUnderstand:, so we must adjust argumentCount and slide args now, so that would work.&quot;</i></font><i></i><font color="#000000"><br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007F00"><i>&quot;Slide arguments down over selector&quot;</i></font><i></i><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">-</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">stackPointerIndex</font><font color="#000000">&nbsp;</font><font color="#00007F">-</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transfer:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">fromIndex:</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000">&nbsp;</font><font color="#00007F">+</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ofObject:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>activeContext</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">toIndex:</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ofObject:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>activeContext</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">pop:</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>lookupClass</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">fetchClassOf:</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>newReceiver</i></font><i></i><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">findNewMethodInClass:</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>lookupClass</i></font><i></i><font color="#000000">.</font><font color="#000000"><br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007F00"><i>&quot;Only test CompiledMethods for argument count - other objects will have to take their chances&quot;</i></font><i></i><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">(</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">isCompiledMethod:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#000000">)</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ifTrue:</font><font color="#000000">&nbsp;</font><font color="#000000">[</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">success:</font><font color="#000000">&nbsp;</font><font color="#007F00">(</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">argumentCountOf:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#007F00">)</font><font color="#000000">&nbsp;</font><font color="#00007F">=</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">]</font><font color="#000000">.</font><font color="#000000"><br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">successful</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ifTrue:</font><font color="#000000">&nbsp;</font><font color="#000000">[</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">executeNewMethodFromCache</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007F00"><i>&quot;Recursive xeq affects successFlag&quot;</i></font><i></i><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">initPrimCall</font><font color="#000000">]</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ifFalse:</font><font color="#000000">&nbsp;</font><font color="#000000">[</font><font color="#007F00"><i>&quot;Slide the args back up (sigh) and re-insert the&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selector. &quot;</i></font><i></i><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">1</font><font color="#000000">&nbsp;</font><font color="#00007F">to:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">do:</font><font color="#000000">&nbsp;</font><font color="#007F00">[</font><font color="#000000">:</font><font color="#00007F"><i>i</i></font><i></i><font color="#000000">&nbsp;</font><font color="#7F7F7F">|</font><font color="#000000">&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">storePointer:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">-</font><font color="#000000">&nbsp;</font><font color="#00007F"><i>i</i></font><i></i><font color="#000000">&nbsp;</font><font color="#00007F">+</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">&nbsp;</font><font color="#00007F">+</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ofObject:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>activeContext</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">withValue:</font><font color="#000000">&nbsp;</font><font color="#7F007F">(</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">fetchPointer:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">-</font><font color="#000000">&nbsp;</font><font color="#00007F"><i>i</i></font><i></i><font color="#000000">&nbsp;</font><font color="#00007F">+</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000">&nbsp;</font><font color="#00007F">ofObject:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>activeContext</b></font><b></b><font color="#7F007F">)</font><font color="#007F00">]</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">unPop:</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000"><b>self</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">storePointer:</font><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>selectorIndex</i></font><i></i><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ofObject:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>activeContext</b></font><b></b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">withValue:</font><font color="#000000">&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>argumentCount</b></font><b></b><font color="#000000">&nbsp;</font><font color="#00007F">+</font><font color="#000000">&nbsp;</font><font color="#7F0000">1</font><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performMethod</i></font><i></i><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performSelector</i></font><i></i><font color="#000000">]</font></span><br>
<br><br>Don&#39;t look further. &nbsp;try and spot the bug first.<br><br><br><br><br><br><br><br>It starts with<br><span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><font color="#000000">&nbsp;&nbsp; &nbsp;</font><font color="#6B6B6B"><i>performSelector</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#6B6B6B"><i>performMethod</i></font><i></i><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#000000">.<br></font><font color="#000000"><span class="Apple-style-span" style="font-family: arial, sans-serif;"><span class="Apple-style-span" style="font-size: small;">and ends with</span></span></font></span></div>
<span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>newMethod</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performMethod</i></font><i></i><font color="#000000">.</font><font color="#000000"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000"><b>messageSelector</b></font><b></b><font color="#000000">&nbsp;</font><b>:=</b><font color="#000000">&nbsp;</font><font color="#6B6B6B"><i>performSelector<br><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial; font-size: 13px; font-style: normal; ">which is only executed if there is a doesNotUnderstand:.</span></i></font></span><div>
<br>A doesNotUnderstand: may cause a GC in createActualMessage as it creates the message argument for doesNotUnderstand:. &nbsp;So this bug only bytes if a perform is not understood when memory is on the verge of exhaustion.<br>
<br>In the context-to-stack-mapping VM I&#39;m working on the VM may do up to a page worth of context allocations on e.g. trying to store the sender of a context. &nbsp;Rather than try and plug all the holes it is much safer to restrict garbage collection to happening between bytecodes (probably on sends and backward branches). &nbsp;To do this the GC has to maintain a reserve for the VM which is about the size of two stack pages, or probably 2k bytes, and the VM has to defer incremental collections from allocations until the send or backward branch following.<br>
<br><br></div></div>