[Cuis-dev] Bugfix: wrong bytecode when creating a class instance variable interactively
Juan Vuletich
juan at cuis.st
Mon Oct 5 13:16:13 PDT 2026
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
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/20261005/8c8236ab/attachment.htm>
More information about the Cuis-dev
mailing list