This was a funny one! Please review. :-)<br>
<br>
Best,<br>
Christoph<br>
<br>
<b>=============== Summary ===============</b><br>
<br>
Change Set: fix-directedSuperSend-frameSize<br>
Date: 14 September 2022<br>
Author: Christoph Thiede<br>
<br>
Fixes omission fault in encoder that caused an insufficient frame size for compiled blocks with a directed super send. While the Cog VM was able to execute these methods anyway (probably performing invalid mem accesses?), the debugger aka image simulator failed to do so.<br>
<br>
<b>=============== Diff ===============</b><br>
<br>
<b>CompilerTest>>testDirectedSuperSendStackSize {tests - syntax} · ct 9/14/2022 16:35</b><br>
<font color="#FF0000">+ testDirectedSuperSendStackSize<br>
+ <br>
+ {13. CompiledCode smallFrameSize.<br>
+ 14. CompiledCode fullFrameSize}<br>
+ pairsDo: [:numTemps :expectedBlockFrame |<br>
+ | temps compiledMethod methodNode compiledBlock |<br>
+ temps := (Character alphabet first: numTemps) asArray.<br>
+ methodNode := Compiler new<br>
+ compile: 'griffle<br>
+ |' , (temps joinSeparatedBy: $ ) , '|<br>
+ ' , (temps withIndexCollect: [:t :i | '' , t , ':=' , i , '. ']) join , '<br>
+ [' , (temps joinSeparatedBy: $+) , '.<br>
+ super someDirectedSend: a] value.'<br>
+ in: nil class<br>
+ environment: nil environment<br>
+ notifying: nil<br>
+ ifFail: [^ self fail].<br>
+ compiledMethod := methodNode generateWithTempNames.<br>
+ <br>
+ self<br>
+ assert: compiledMethod equals: compiledMethod codeLiterals first;<br>
+ assert: 2 equals: compiledMethod codeLiterals size.<br>
+ self assert: CompiledCode fullFrameSize equals: compiledMethod frameSize.<br>
+ compiledBlock := compiledMethod codeLiterals second.<br>
+ self<br>
+ assert: compiledBlock isCompiledBlock;<br>
+ assert: expectedBlockFrame equals: compiledBlock frameSize].</font><br>
<br>
<b>SelectorNode>>emitCode:args:encoder:super: {code generation} · ct 9/14/2022 16:19 (changed)</b><br>
emitCode: stack args: nArgs encoder: encoder super: supered<br>
code < Send ifTrue:<br>
[self internalEncodingError].<br>
<s><font color="#0000FF">- stack pop: nArgs.<br>
</font></s> supered<br>
ifTrue:<br>
[(encoder supportsFullBlocks<br>
and: [encoder generatingFullBlock])<br>
ifTrue:<br>
<s><font color="#0000FF">- [encoder genPushLiteral: (encoder sharableLitIndex: encoder classEncoding).<br>
</font></s><font color="#FF0000">+ [stack push: 1. "superclass"<br>
+ encoder genPushLiteral: (encoder sharableLitIndex: encoder classEncoding).<br>
+ stack pop: 1 "superclass".<br>
+ stack pop: nArgs. <br>
</font> encoder genSendDirectedSuper: index numArgs: nArgs]<br>
<s><font color="#0000FF">- ifFalse: [encoder genSendSuper: index numArgs: nArgs]]<br>
</font></s><font color="#FF0000">+ ifFalse:<br>
+ [stack pop: nArgs.<br>
+ encoder genSendSuper: index numArgs: nArgs]]<br>
</font> ifFalse:<br>
<s><font color="#0000FF">- [encoder genSend: index numArgs: nArgs]<br>
</font></s><font color="#FF0000">+ [stack pop: nArgs.<br>
+ encoder genSend: index numArgs: nArgs]</font><br>
<br>
["fix-directedSuperSend-frameSize.1.cs"]<br>
<br>
<font color="#808080">---<br>
</font><font color="#808080"><i>Sent from </i></font><font color="#808080"><i><a href="https://github.com/hpi-swa-lab/squeak-inbox-talk"><u><font color="#808080">Squeak Inbox Talk</font></u></a></i></font><br>
["fix-directedSuperSend-frameSize.1.cs"]