[Cuis-dev] BoxedMorph post-class definition change recompilation failure

Juan Vuletich juan at cuis.st
Fri Mar 24 16:49:04 PDT 2023


Those safeguards are there for a reason. Just removing them without 
really understanding what's going on is asking for trouble.

To see how to do what you want to do, but in a safe way, see (for 
instance) change set #4110. You'll need to unzip the relevant file in 
/PreviousUpdates.

Hope this helps.

Cheers,

On 3/24/2023 6:30 PM, Alexandre Rousseau via Cuis-dev wrote:
> I just learned a new word. Thanks. :)
>
> I compared this behaviour to that of Squeak 6. The latter issues a 
> warning but in situ recompilation succeeds without subsequent side 
> effects, in and this and subsequent sessions.
>
> Even replacing "Object >> become:" with the Squeak equivalent fails 
> (errors).
>
> Bummer that. Will dig deeper if I can find time and shovel.
>
>
>
> On Fri, Mar 24, 2023 at 4:55 PM Gerald Klix <cuis.01 at klix.ch 
> <mailto:cuis.01 at klix.ch>> wrote:
>
>     Oh well, this is becoming a bigger gymkhana.
>
>     I presume you have too hack Object>>#become:; in essence disable
>     all the checking code
>     before { self } elementsExchangeIdentityWith: { otherObject }.
>
>     NB:
>     The same method in Squeak just reads:
>
>     become: otherObject
>         "Primitive. Swap the object pointers of the receiver and the
>     argument.
>          All variables in the entire system that used to point to the
>     receiver now
>          point to the argument, and vice-versa. Fails if either object
>     is read-only
>          or is an immediate such as a SmallInteger."
>
>         {self} elementsExchangeIdentityWith: {otherObject}
>
>
>     Use the browsers "versions" button to restore the old version.
>     You can do all of this while the image is running.
>
>     Again I learned two things:
>
>     1. Juan's precautionary code in become: checks all running processes.
>     2. Command line parsing is done after the UI's display process was
>     started.
>
>     See SystemDictionary>>#snapshot:andQuit:embedded:clearAllClassState:.
>     self processCommandLineArguments comes after
>     UISupervisor spawnNewMorphicProcessFor: (guiRootObject ifNil: [
>     guiRootObject := guiRootObjectClass newWorld ]).
>
>
>     HTH,
>
>     Gerald
>
>
>
>
>     On 3/24/23 8:09 PM, Alexandre Rousseau wrote:
>>     Nope. This still fails ...
>>
>>         ./Squeak.app/Contents/MacOS/Squeak
>>         Cuis-Smalltalk-Dev/Cuis6.0-5686.image -d "BoxedMorph
>>         addInstVarName: 'someBorderStyle'"
>>
>>          ...
>>
>>         Class reshaping: WorldMorph has some instance running
>>         #runDeferredUIMessages. This CompiledMethod would become
>>         invalid. Class reshaping aborted.
>>         Class reshaping: WorldMorph has some instance running
>>         #runDeferredUIMessages. This CompiledMethod would become
>>         invalid. Class reshaping aborted.
>>         Class reshaping: WorldMorph has some instance running
>>         #doOneCycleNow. This CompiledMethod would become invalid.
>>         Class reshaping aborted.
>>         Class reshaping: WorldMorph has some instance running
>>         #doOneCycle:. This CompiledMethod would become invalid. Class
>>         reshaping aborted.
>>         Class reshaping: WorldMorph has some instance running
>>         #mainLoop. This CompiledMethod would become invalid. Class
>>         reshaping aborted.
>>         Class reshaping: WorldMorph has some instance running
>>         #mainLoop. This CompiledMethod would become invalid. Class
>>         reshaping aborted.
>>
>>
>>     On Fri, Mar 24, 2023 at 4:23 AM Gerald Klix via Cuis-dev
>>     <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>> wrote:
>>
>>         On 3/24/23 8:31 AM, Alexandre Rousseau via Cuis-dev wrote:
>>>         I'm trying to modify rather than subclass BoxedMorp, adding a new instance
>>>         var to the class definition. This fails while Transcript reports what
>>>         follows.
>>>
>>>         I'm guessing that recompilation of BoxedMorph does not play well while a
>>>         WorldMorph (a subclass of BoxedMorph itself) instance is running.
>>>
>>>         What would be a way to work around this?
>>>
>>>         Class reshaping: InnerTextMorph has some instance running #acceptContents.
>>>>         This CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: InnerTextMorph has some instance running
>>>>         #processKeystrokeEvent:. This CompiledMethod would become invalid. Class
>>>>         reshaping aborted.
>>>>         Class reshaping: InnerTextMorph has some instance running
>>>>         #processKeystrokeEvent:. This CompiledMethod would become invalid. Class
>>>>         reshaping aborted.
>>>>         Class reshaping: InnerTextMorph has some instance running #keyStroke:.
>>>>         This CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: InnerTextMorph has some instance running #keyStroke:.
>>>>         This CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: HandMorph has some instance running
>>>>         #startKeyboardDispatch:. This CompiledMethod would become invalid. Class
>>>>         reshaping aborted.
>>>>         Class reshaping: HandMorph has some instance running #processEventQueue.
>>>>         This CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #doOneCycleNow. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #handsDo:. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #doOneCycleNow. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #doOneCycle:. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #mainLoop. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>>         Class reshaping: WorldMorph has some instance running #mainLoop. This
>>>>         CompiledMethod would become invalid. Class reshaping aborted.
>>>
>>         First, let me analyze that problem.
>>         Nearly every Morph you see on the screen – SystemWindow and
>>         thus BrowserWindow – is derived from BoxedMorph. Juan added
>>         save guards
>>         to Object>>#become:, because adding the target object of #become:
>>         might still have some active contexts on the stack and these
>>         active contexts refer to methods that where compiled for the
>>         source object of #bceome:. In your case the source object
>>         is the old class and the target object is the new class, with
>>         the added instance variable. If you will add the instance
>>         variable
>>         add the end, it would work out. Otherwise some
>>         morphic code in the running system will certainly crash.
>>
>>         Now for ways around this mess:
>>
>>         Do you really need an instance variable?
>>         Morphs also have properties, that should
>>         be used if the instance variable is nil for
>>         most morphs. Properties come in handy here,
>>         because the can be added at run-time.
>>
>>         If you insist on adding instance variables,
>>         you have to add your variable with
>>         no morphic code on the stack, meaning you have to
>>         do it from the command line.
>>         There is a method Class>>#addInstVarName: that lets
>>         you add instance variables.
>>
>>         You can use the -e command-line option
>>         to execute code from the command line.
>>
>>
>>         HTH,
>>
>>         Gerald
>>         -- 
>>         Cuis-dev mailing list
>>         Cuis-dev at lists.cuis.st <mailto:Cuis-dev at lists.cuis.st>
>>         https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>


-- 
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20230324/b9307537/attachment.htm>


More information about the Cuis-dev mailing list