[squeak-dev] Merge Request: #caseOf:otherwise: with arguments

christoph.thiede at student.hpi.uni-potsdam.de christoph.thiede at student.hpi.uni-potsdam.de
Mon Nov 22 17:52:20 UTC 2021


Hi Levente,

please see Compiler-ct.464 (inbox). To you as a more experienced decompiler developer, does this implementation look convincing? If yes, I can merge it myself now. :-)

Best,
Christoph

---
Sent from Squeak Inbox Talk

On 2021-11-18T14:04:16+01:00, marcel.taeumel at hpi.de wrote:

> Hi Levente --
> 
> Thanks. Decompiler only adds the block-arg for not-inlined caseOfs. See ObjectTest >> #testCaseOfOtherwise.
> 
> Hmm... Christoph? =) Otherwise (ha!) I will take a look at it soon-ish.
> 
> Best,
> Marcel
> Am 18.11.2021 13:51:02 schrieb Levente Uzonyi <leves at caesar.elte.hu>:
> Hi Marcel,
> 
> I just checked how this works, and noticed that the decompiler cannot
> recreate the original code if the otherwise: block has an argument.
> 
> 
> Levente
> 
> On Thu, 18 Nov 2021, Marcel Taeumel wrote:
> 
> > Merged.
> >
> > Am 21.02.2020 17:33:03 schrieb Thiede, Christoph :
> >
> > This changeset makes it possible to accept an argument in the otherwise block of a #caseOf:otherwise: call.
> >
> >
> > Diff of the #caseOf:otherwise: implementation:
> >
> > caseOf: aBlockAssociationCollection otherwise: aBlock
> >
> > "The elements of aBlockAssociationCollection are associations between blocks.  Answer the evaluated value of the first association in aBlockAssociationCollection whose evaluated key equals the receiver.  If no
> > match is found, answer the result of evaluating aBlock."
> >
> >
> > aBlockAssociationCollection associationsDo:
> >
> > [:assoc | (assoc key value = self) ifTrue: [^assoc value value]].
> >
> > - ^ aBlock value
> >
> > + ^ aBlock cull: self
> >
> >
> > "| z | z := {[#a]->[1+1]. ['b' asSymbol]->[2+2]. [#c]->[3+3]}. #b caseOf: z otherwise: [0]"
> >
> > "| z | z := {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]}. #b caseOf: z otherwise: [0]"
> >
> > "The following are compiled in-line:"
> >
> > "#b caseOf: {[#a]->[1+1]. ['b' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [0]"
> >
> > "#b caseOf: {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [0]"
> >
> > + "#b caseOf: {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [:x | x halt]"
> >
> >
> > Furthermore, the changeset includes a necessary modification of MessageNode >> #transformCase: so that the otherwise argument can be compiled in-line.
> >
> > Last but not least, I wrote some tests for #caseOf:[otherwise:].
> >
> >
> > Please review!
> >
> > (In a later change, it would be possible to allow arguments for the association key blocks as well. But I love short feedback loops, so let's assess this one first :-))
> >
> >
> > Best,
> >
> > Christoph
> >
> >
> >
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20211118/e87b1cbc/attachment.html>
> 
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20211122/720da7b1/attachment.html>


More information about the Squeak-dev mailing list