[squeak-dev] Question regarding compilation of #caseOf:[otherwise:] messages
Thiede, Christoph
Christoph.Thiede at student.hpi.uni-potsdam.de
Sat Feb 22 17:23:54 UTC 2020
Hi all,
this a question regarding the Compiler's implementation. I spent some time on it but could not yet find a satisfying explanation. Maybe someone of you can help me?
Let's look into MessageNode >> #emitCodeForCase:encoder:value:, which contains the following passage:
(isLast and: [allReturn]) ifTrue:
[self emitCodeForJump: elseSize encoder: encoder]
Btw, the equivalent in #sizeCodeForCase:value: is:
(isLast and: [allReturn]) ifTrue: [thenSize := thenSize + (self sizeCode: encoder forJump: elseSize)].
In the bytecode of a method, this will look like this:
89 <23> pushConstant: 2
90 <88> dup
91 <76> pushConstant: 1
92 <B6> send: =
93 <9A> jumpFalse: 97
94 <87> pop
95 <22> pushConstant: #one
96 <7C> returnTop
97 <77> pushConstant: 2
98 <B6> send: =
99 <9A> jumpFalse: 103
100 <21> pushConstant: #two
101 <7C> returnTop
102 <90> jumpTo: 104 "here!"
103 <20> pushConstant: 42
104 <87> pop
I cannot see when this jump would be ever reached.
Case 1: Any case is selected, and because allReturn is true, its inlined value block is guaranteed to #returnTop and thus not to reach the last jump (in the above example, this happens in pc101).
Case 2: No case is selected, so the execution will jump straightly to the inlined otherwiseBlock (this is pc99 in the example).
For what purpose do we need this jump (ex: pc102)? Should we maybe remove it?
Are there any special situations in which #returns is true but there is any code path that does *not* return? Some weird exception handling trick, for example?
Or was the dubious jump just designed as a fallback to catch any hypothetic failures in any other component of the compiler system?
I removed the generation of this jump for testing and could not investigate any anomalies so far. All compiler tests are passing - except of a number of Decompiler tests, which probably would need to be updated as well.
Please find a minimum changeset in the attachment that demonstrates my question.
I am looking forward to your replies!
Best,
Christoph
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200222/7b1fd037/attachment.html>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: cleanup caseOf.1.cs
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200222/7b1fd037/attachment.ksh>
More information about the Squeak-dev
mailing list
|