[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
|