In Smalltalk, one knows at compile-time at which class to begin lookup for super sends. In Newspeak, we do not know this as all methods are defined by mixins, and the superclass of a mixin application is not known until runtime. Hence /dynamic/ super send.<div>
<br></div><div>In Newspeak&#39;s as-yet-unimplemented access control, super sends can activate protected members, but normal sends cannot. An /absent receiver/ send means that the receiver of the message is not on stack beneath the arguments like a normal send. This will allow the VM to implement access control without having to check whether the receiver is allowed for types of sends that access protected or private members, because the VM will provide the receiver during the send itself.<br>
<br><div class="gmail_quote">On Sat, Jan 12, 2013 at 3:35 AM, stephane ducasse <span dir="ltr">&lt;<a href="mailto:stephane.ducasse@gmail.com" target="_blank">stephane.ducasse@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Hi eliot<br>
<br>
I&#39;m curious: what is a absent receiver dynamic super send?<br>
<br>
Stef<br>
<div class="HOEnZb"><div class="h5">On Jan 10, 2013, at 11:27 PM, <a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a> wrote:<br>
<br>
&gt;<br>
&gt; Eliot Miranda uploaded a new version of VMMaker to project VM Maker:<br>
&gt; <a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.253.mcz" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-eem.253.mcz</a><br>
&gt;<br>
&gt; ==================== Summary ====================<br>
&gt;<br>
&gt; Name: VMMaker.oscog-eem.253<br>
&gt; Author: eem<br>
&gt; Time: 10 January 2013, 3:26:03.577 pm<br>
&gt; UUID: 4a3ac3fb-d367-478b-ad95-ad3bb8b6216f<br>
&gt; Ancestors: VMMaker.oscog-eem.252<br>
&gt;<br>
&gt; Implement absent receiver dynamic super send bytecode in the JIT.<br>
&gt; This was an oversight from implementing absent receiver send.<br>
&gt; Refactor the dynamic super send code to accomodate the new send.<br>
&gt;<br>
&gt; =============== Diff against VMMaker.oscog-eem.252 ===============<br>
&gt;<br>
&gt; Item was changed:<br>
&gt;  ----- Method: SimpleStackBasedCogit&gt;&gt;genDynamicSuperSendBytecode (in category &#39;bytecode generators&#39;) -----<br>
&gt;  genDynamicSuperSendBytecode<br>
&gt; +     ^self genSendDynamicSuper: (coInterpreter literal: byte2 ofMethod: methodObj) numArgs: byte1!<br>
&gt; -     | numArgs selector |<br>
&gt; -     numArgs := byte1.<br>
&gt; -     selector := coInterpreter literal: byte2 ofMethod: methodObj.<br>
&gt; -     (objectMemory isYoung: selector) ifTrue:<br>
&gt; -             [hasYoungReferent := true].<br>
&gt; -     self assert: needsFrame.<br>
&gt; -     self MoveMw: numArgs * BytesPerWord r: SPReg R: ReceiverResultReg.<br>
&gt; -     numArgs &gt; 2 ifTrue:<br>
&gt; -             [self MoveCq: numArgs R: SendNumArgsReg].<br>
&gt; -     self MoveCw: selector R: ClassReg.<br>
&gt; -     self CallNewspeakSend: (dynamicSuperSendTrampolines at: (numArgs min: NumSendTrampolines - 1)).<br>
&gt; -     self flag: &#39;currently caller pushes result&#39;.<br>
&gt; -     self PushR: ReceiverResultReg.<br>
&gt; -     ^0!<br>
&gt;<br>
&gt; Item was changed:<br>
&gt;  ----- Method: SimpleStackBasedCogit&gt;&gt;genExtSendAbsentDynamicSuperBytecode (in category &#39;bytecode generators&#39;) -----<br>
&gt;  genExtSendAbsentDynamicSuperBytecode<br>
&gt;       &quot;241            11110001        i i i i i j j j Send To Absent Dynamic Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments&quot;<br>
&gt; +     | litIndex nArgs |<br>
&gt; +     litIndex := (byte1 &gt;&gt; 3) + (extA &lt;&lt; 5).<br>
&gt; +     extA := 0.<br>
&gt; +     nArgs := (byte1 bitAnd: 7) + (extB &lt;&lt; 3).<br>
&gt; +     extB := 0.<br>
&gt; +     ^self genSendAbsentDynamicSuper: (coInterpreter literal: litIndex ofMethod: methodObj) numArgs: nArgs!<br>
&gt; -     self shouldBeImplemented.<br>
&gt; -     ^EncounteredUnknownBytecode!<br>
&gt;<br>
&gt; Item was added:<br>
&gt; + ----- Method: SimpleStackBasedCogit&gt;&gt;genSendAbsentDynamicSuper:numArgs: (in category &#39;bytecode generators&#39;) -----<br>
&gt; + genSendAbsentDynamicSuper: selector numArgs: numArgs<br>
&gt; +     &quot;Shuffle arguments if necessary and push receiver.<br>
&gt; +      Then send.&quot;<br>
&gt; +     &lt;inline: false&gt;<br>
&gt; +     numArgs = 0<br>
&gt; +             ifTrue:<br>
&gt; +                     [self PushR: ReceiverResultReg]<br>
&gt; +             ifFalse:<br>
&gt; +                     [self MoveMw: 0 r: SPReg R: TempReg.<br>
&gt; +                     self PushR: TempReg.<br>
&gt; +                     2 to: numArgs do:<br>
&gt; +                             [:index|<br>
&gt; +                             self MoveMw: index * BytesPerWord r: SPReg R: TempReg.<br>
&gt; +                             self MoveR: TempReg Mw: index - 1 * BytesPerWord r: SPReg].<br>
&gt; +                     &quot;if we copied the code in genSendDynamicSuper: we could save an instruction.<br>
&gt; +                     But we care not; the smarts are in StackToRegisterMappingCogit et al&quot;<br>
&gt; +                     self MoveR: ReceiverResultReg Mw: numArgs * BytesPerWord r: SPReg].<br>
&gt; +     ^self genSendDynamicSuper: selector numArgs: numArgs!<br>
&gt;<br>
&gt; Item was added:<br>
&gt; + ----- Method: SimpleStackBasedCogit&gt;&gt;genSendDynamicSuper:numArgs: (in category &#39;bytecode generators&#39;) -----<br>
&gt; + genSendDynamicSuper: selector numArgs: numArgs<br>
&gt; +     (objectMemory isYoung: selector) ifTrue:<br>
&gt; +             [hasYoungReferent := true].<br>
&gt; +     self assert: needsFrame.<br>
&gt; +     self MoveMw: numArgs * BytesPerWord r: SPReg R: ReceiverResultReg.<br>
&gt; +     numArgs &gt; 2 ifTrue:<br>
&gt; +             [self MoveCq: numArgs R: SendNumArgsReg].<br>
&gt; +     self MoveCw: selector R: ClassReg.<br>
&gt; +     self CallNewspeakSend: (dynamicSuperSendTrampolines at: (numArgs min: NumSendTrampolines - 1)).<br>
&gt; +     self flag: &#39;currently caller pushes result&#39;.<br>
&gt; +     self PushR: ReceiverResultReg.<br>
&gt; +     ^0!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: StackToRegisterMappingCogit&gt;&gt;genDynamicSuperSendBytecode (in category &#39;bytecode generators&#39;) -----<br>
&gt; - genDynamicSuperSendBytecode<br>
&gt; -     | numArgs selector |<br>
&gt; -     numArgs := byte1.<br>
&gt; -     selector := coInterpreter literal: byte2 ofMethod: methodObj.<br>
&gt; -     self marshallSendArguments: numArgs.<br>
&gt; -     ^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!<br>
&gt;<br>
&gt; Item was added:<br>
&gt; + ----- Method: StackToRegisterMappingCogit&gt;&gt;genSendAbsentDynamicSuper:numArgs: (in category &#39;bytecode generators&#39;) -----<br>
&gt; + genSendAbsentDynamicSuper: selector numArgs: numArgs<br>
&gt; +     &quot;OK, we could do better and avoid spilling ReceiverResultReg if we refactored<br>
&gt; +      marshallImplicitReceiverSendArguments: to take a flag saying whether the<br>
&gt; +      receiver was in ReceiverResultReg (absent receiver send) or on the stack<br>
&gt; +      (absent dynamic super send) and in the latter case loading ReceiverResultReg<br>
&gt; +      from the stack after marshalling.  But this is a rare bytecode so for the moment<br>
&gt; +      don&#39;t bother.&quot;<br>
&gt; +     self ssAllocateCallReg: ReceiverResultReg.<br>
&gt; +     self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.<br>
&gt; +     self marshallImplicitReceiverSendArguments: numArgs.<br>
&gt; +     ^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!<br>
&gt;<br>
&gt; Item was added:<br>
&gt; + ----- Method: StackToRegisterMappingCogit&gt;&gt;genSendDynamicSuper:numArgs: (in category &#39;bytecode generators&#39;) -----<br>
&gt; + genSendDynamicSuper: selector numArgs: numArgs<br>
&gt; +     self marshallSendArguments: numArgs.<br>
&gt; +     ^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div>