[squeak-dev] The Inbox: Compiler-nice.427.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Fri Apr 17 11:53:19 UTC 2020


... and recompileAll in postscript

Le ven. 17 avr. 2020 à 13:52, Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com> a écrit :

> Hi Christoph,
> Sure, it's a duplicate. Feel free to republish your original fix.
> We might probably also want to fix the Decompiler.
>
> Le ven. 17 avr. 2020 à 13:43, Thiede, Christoph <
> Christoph.Thiede at student.hpi.uni-potsdam.de> a écrit :
>
>> Hi Nicolas,
>>
>>
>> is this a duplicate of fix caseerror.1.cs (
>> http://forum.world.st/Problems-with-caseError-tp5111930p5112255.html)?
>>
>> Best,
>>
>> Christoph
>> <http://www.hpi.de/>
>> ------------------------------
>> *Von:* Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im
>> Auftrag von commits at source.squeak.org <commits at source.squeak.org>
>> *Gesendet:* Freitag, 17. April 2020 12:52:18
>> *An:* squeak-dev at lists.squeakfoundation.org
>> *Betreff:* [squeak-dev] The Inbox: Compiler-nice.427.mcz
>>
>> Nicolas Cellier uploaded a new version of Compiler to project The Inbox:
>> http://source.squeak.org/inbox/Compiler-nice.427.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Compiler-nice.427
>> Author: nice
>> Time: 17 April 2020, 12:52:15.465993 pm
>> UUID: 1ea19d4a-47f4-4c94-8fef-2b43c99f2b04
>> Ancestors: Compiler-ct.426
>>
>> Fixup: caseError must be sent to the receiver of the caseOf: message, not
>> to the receiver of the home method.
>>
>> For this, we must also dup/pop in the last case whenever there is no
>> otherwise argument.
>>
>> TODO: also fix the Decompiler...
>>
>> =============== Diff against Compiler-ct.426 ===============
>>
>> Item was changed:
>>   ----- Method: MessageNode>>emitCodeForCase:encoder:value: (in category
>> 'code generation') -----
>>   emitCodeForCase: stack encoder: encoder value: forValue
>>
>>          | braceNode sizeStream allReturn |
>>          forValue ifFalse:
>>                  [^super emitCodeForEffect: stack encoder: encoder].
>>          braceNode := arguments first.
>>          sizeStream := ReadStream on: sizes.
>>          receiver emitCodeForValue: stack encoder: encoder.
>>          "There must be at least one branch around the otherwise/caseError
>>            so the decompiler can identify the end of the
>> otherwise/caseError."
>>          allReturn := true. "assume every case ends with a return"
>>          braceNode casesForwardDo:
>>                  [:keyNode :valueNode :last | | thenSize elseSize |
>>                  thenSize := sizeStream next.
>>                  elseSize := sizeStream next.
>> +                (last and: [arguments size = 2]) ifFalse: [encoder
>> genDup. stack push: 1].
>> -                last ifFalse: [encoder genDup. stack push: 1].
>>                  keyNode emitCodeForEvaluatedValue: stack encoder:
>> encoder.
>>                  keyNode pc: encoder nextPC.
>>                  equalNode emitCode: stack args: 1 encoder: encoder.
>>                  self emitCodeForBranchOn: false dist: thenSize pop:
>> stack encoder: encoder.
>> +                (last and: [arguments size = 2]) ifFalse: [encoder
>> genPop. stack pop: 1].
>> -                last ifFalse: [encoder genPop. stack pop: 1].
>>                  valueNode emitCodeForEvaluatedValue: stack encoder:
>> encoder.
>> +                (last and: [arguments size = 2]) ifTrue: [stack pop: 1].
>> -                last ifTrue: [stack pop: 1].
>>                  valueNode returns ifFalse:
>>                          [self emitCodeForJump: elseSize encoder: encoder.
>>                           allReturn := false].
>>                  (last and: [allReturn]) ifTrue:
>>                          [self emitCodeForJump: elseSize encoder:
>> encoder]].
>>          arguments size = 2
>>                  ifTrue:
>>                          [arguments last emitCodeForEvaluatedValue: stack
>> encoder: encoder] "otherwise: [...]"
>>                  ifFalse:
>> +                        ["the receiver of caseOf: has been previously
>> dup, just send"
>> -                        [NodeSelf emitCodeForValue: stack encoder:
>> encoder.
>>                          caseErrorNode emitCode: stack args: 0 encoder:
>> encoder]!
>>
>> Item was changed:
>>   ----- Method: MessageNode>>sizeCodeForCase:value: (in category 'code
>> generation') -----
>>   sizeCodeForCase: encoder value: forValue
>>
>>          | braceNode sizeIndex elseSize allReturn |
>>          forValue not ifTrue:
>>                  [^super sizeCodeForEffect: encoder].
>>          equalNode := encoder encodeSelector: #=.
>>          braceNode := arguments first.
>>          sizes := Array new: 2 * braceNode numElements.
>>          sizeIndex := sizes size.
>>          elseSize := arguments size = 2
>>                  ifTrue:
>>                          [arguments last sizeCodeForEvaluatedValue:
>> encoder] "otherwise: [...]"
>>                  ifFalse:
>>                          [caseErrorNode := encoder encodeSelector:
>> #caseError.
>> +                         "Assume that the receiver of caseOf: has been
>> dup"
>> +                        (caseErrorNode sizeCode: encoder args: 0 super:
>> false)]. "self caseError"
>> -                         (NodeSelf sizeCodeForValue: encoder)
>> -                         + (caseErrorNode sizeCode: encoder args: 0
>> super: false)]. "self caseError"
>>          "There must be at least one branch around the otherwise/caseError
>>            so the decompiler can identify the end of the
>> otherwise/caseError."
>>          allReturn := true. "assume every case ends with a return"
>>          braceNode casesForwardDo:
>>                  [:keyNode :valueNode :last |
>>                  valueNode returns ifFalse: [allReturn := false]].
>>          braceNode casesReverseDo:
>>                  [:keyNode :valueNode :last | | thenSize |
>>                  sizes at: sizeIndex put: elseSize.
>>                  thenSize := valueNode sizeCodeForEvaluatedValue: encoder.
>> +                (last and: [arguments size = 2]) ifFalse: [thenSize :=
>> thenSize + encoder sizePop].
>> -                last ifFalse: [thenSize := thenSize + encoder sizePop].
>>                  valueNode returns ifFalse: [thenSize := thenSize + (self
>> sizeCode: encoder forJump: elseSize)].
>>                  (last and: [allReturn]) ifTrue: [thenSize := thenSize +
>> (self sizeCode: encoder forJump: elseSize)].
>>                  sizes at: sizeIndex-1 put: thenSize.
>> +                (last and: [arguments size = 2]) ifFalse: [elseSize :=
>> elseSize + encoder sizeDup].
>> -                last ifFalse: [elseSize := elseSize + encoder sizeDup].
>>                  elseSize := elseSize
>>                                          + (keyNode
>> sizeCodeForEvaluatedValue: encoder)
>>                                          + (equalNode sizeCode: encoder
>> args: 1 super: false)
>>                                          + (self sizeCode: encoder
>> forBranchOn: false dist: thenSize)
>>                                          + thenSize.
>>                  sizeIndex := sizeIndex - 2].
>>          ^(receiver sizeCodeForValue: encoder) + elseSize!
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200417/eb2b3347/attachment.html>


More information about the Squeak-dev mailing list