[Cuis-dev] Bugfix: wrong bytecode when creating a class instance variable interactively
Juan Vuletich
juan at cuis.st
Tue Oct 6 04:04:02 PDT 2026
Amazing!
On 2026-10-06 4:59 AM, Nicolas Cellier via Cuis-dev wrote:
> Gosh, I accidentally fixed it in Squeak !7 years before it was even
> noticed...
> https://source.squeak.org/trunk/Kernel-nice.346.diff
>
> Le lun. 5 oct. 2026 à 22:16, Juan Vuletich via Cuis-dev
> <cuis-dev at lists.cuis.st> a écrit :
>
> Hi Facu,
>
> Wow! Not every day you find a bug that is over 40 years old!
>
> Just pushed this to GitHub. Thanks!
>
> Cheers,
>
> On 2026-10-04 1:01 PM, Facundo Javier Gelatti via Cuis-dev wrote:
>> Hello!
>>
>> This is a bug report + fix.
>>
>> The bug is the following: declaring a class instance variable
>> from the "Unknown variable" popup sometimes produces a method
>> whose bytecode does not match the source (it stores into the
>> wrong variables).
>> I attach some code to see this (example.workspace.st
>> <http://example.workspace.st>), which should be run from a workspace.
>>
>> This happens because Metaclass>>addInstVarName: reverses the
>> order of existing variables (which is already a weird behavior),
>> and the compiler resolves instance variables to slot numbers at
>> the start of the compilation. So, in an interactive environment:
>> 1. When we accept a method with an undeclared name, a
>> notification is signalled mid-compilation.
>> 2. Then, from the popup, we choose to declare an instance variable.
>> 3. So, Parser>>declareInstVar: sends #addInstVarName:. This adds
>> the instance variable (reversing the order of the existing ones),
>> and triggers a recompilation of all existing methods (this does
>> not include the method mid-compilation, which is not yet
>> installed on the class).
>> 4. Then the compilation resumes. But the encoder has already
>> assigned a slot index to every pre-existing variable, so the
>> system ends up producing the wrong bytecode.
>> Note that the class needs to have at least two existing class
>> instance variables for this to happen (since reversing just one
>> does nothing).
>>
>> The fix is to make Metaclass>>addInstVarName: preserve the order
>> of the variables (as Class>>addInstVarName: already does). With
>> the order preserved, the indices the encoder computed before the
>> declaration stay valid.
>>
>> I've included tests for the bug, and also two additional things
>> for consistency: one test for this same thing but instance-side,
>> and a change to #removeInstVarName: to also preserve the order of
>> the variables (removing class instance variables does not produce
>> wrong behavior, but it is a bit confusing to see the order of the
>> variables change).
>>
>> * * *
>>
>> As a side-note: I've been chasing this bug for some time, since
>> it specially affected students using Cuis-University (denotative
>> objects are classes behind the scenes, so all instance variables
>> are class instance variables). The bug was hard to find because
>> when you recompile the method (e.g. make any change and
>> recompile, or file it out and then file it in, etc.), the
>> bytecode is silently fixed.
>>
>> Cheers!
>> Facu
>>
> --
> Juan Vuletich
> www.cuis.st <http://www.cuis.st>
> github.com/jvuletich <http://github.com/jvuletich>
> researchgate.net/profile/Juan-Vuletich <http://researchgate.net/profile/Juan-Vuletich>
> independent.academia.edu/JuanVuletich <http://independent.academia.edu/JuanVuletich>
> patents.justia.com/inventor/juan-manuel-vuletich <http://patents.justia.com/inventor/juan-manuel-vuletich>
>
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
>
>
--
Juan Vuletich
www.cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20261006/c2dd263e/attachment.htm>
More information about the Cuis-dev
mailing list