[Cuis-dev] [DEFECT] De-compling code uses #storeOn:
Gerald Klix
cuis.01 at klix.ch
Wed Dec 15 07:01:36 PST 2021
On 12/15/21 2:17 PM, Juan Vuletich via Cuis-dev wrote:
> On 12/10/2021 12:22 PM, Gerald Klix via Cuis-dev wrote:
>> Hi all, Hi Juan,
>>
>> There is a defect in de-compiling code.
>> After de-compiling the resulting method node
>> is pretty printed. Constants defined with
>> a back-tick are "printed" by using #storeOn:,
>> which -- IHMO -- is dangerous as this
>> example method source proves:
>>
>> --- snip ---
>> boom
>> "Decompile me ..."
>>
>> ^ `Smalltalk asDictionary` size
>> --- snap ---
>>
>> The problem got much worse, when #linesOfCode
>> was based on #decompiledString.
>> Just selecting a package containing such a
>> method in the package browser
>> will cause the VM or the OS to run out of memory.
>>
>> I think we need something like #printDecompiledOn:
>> which should do something sensible,
>> like sending #store: but limiting
>> the output size.
>>
>>
>> Best Regards,
>>
>> Gerald
>
> I see. I'm not too worried about that. I think backtick literals should
> only be used for very simple things that don't have a literal specific
> syntax (like for example, points, fractions, complex numbers). And they
> should produce the same object structure each time the method is
> compiled (and the expression is evaluated). The result should also be
> the same if the backticks were removed and the expression was evaluated
> every time.
I would love to agree, but that one change kept me busy for more than
4 hours. I had `Module >> #PlanE` somewhere in a package. That
innocent piece of code made the image hang once I selected the package
in the package list. At the end of a long journey of disabling browser
code etc. pp. I came along our latest lines-of-code change. Once I
undid it, everything was fine again. I tracked the problem down
to the pretty printing of decompiled code.
The solution was to make #storeOn: an alias #printOn: in modules,
otherwise the pretty printer tries to format the store-string of
the whole module, which in this case includes huge dictionaries.
>
> More complex things like this, that could give very different results
> each time the expression is evaluated, should better live in a class
> variable (or a class instance variable), and set up in a class #initialize.
Could have been done here, if I would have known beforehand.
Please keep in mind, once you compile such a piece of code
in a browser, the browser immediately computes its lines-of-code
and the poor dude at the keyboard has no change to correct
his mistake.
>
> Perhaps a warning "Dude, don't use backticks for this" would be nice.
> Anyway, anybody playing with this kind of stuff will quickly learn all
> this.
IHMO, at least a warning should be displayed by the compiler
if the "store-string" of the evaluation result of a backtick
expression is not the same as its "print-string".
Maybe the size of the "store-string should be considered, too.
Just my 0.02 €,
Gerald
More information about the Cuis-dev
mailing list