[Cuis-dev] BoxedMorph post-class definition change recompilation failure
Alexandre Rousseau
yalexr at gmail.com
Fri Mar 24 14:30:20 PDT 2023
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> 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> 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
>> https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20230324/7f383568/attachment-0001.htm>
More information about the Cuis-dev
mailing list