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

Alexandre Rousseau yalexr at gmail.com
Fri Mar 24 06:53:08 PDT 2023


>
> Do something like: squeak Cuis6.0-????.image -h


That worked, thanks !
PS : do you know if this is documented somewhere?

On Fri, Mar 24, 2023 at 9:45 AM Gerald Klix <cuis.01 at klix.ch> wrote:

> Please see below.
>
> HTH,
>
> Gerald
>
> On 3/24/23 2:34 PM, Alexandre Rousseau wrote:
>
> Do you really need an instance variable?
>
> Yes. I would like to submit some (minor modification and impact) change
> sets for BoxedMorph and PluggableButtonMorph, for eventual discussion
> (somewhat related to theming).
>
>
> There is a method Class>>#addInstVarName: that lets you add instance
>> variables.
>
> Perfect, thanks.
>
>
> You can use the -e command-line option to execute code from the command
>> line.
>
> Hmmm. Where did you find out about the -e option? I am running this on
> macOS
> (obtained from https://github.com/OpenSmalltalk/opensmalltalk-vm) and
> invoking
> ./Squeak.app/Contents/MacOS/Squeak -help outputs:
>
> $ ./Squeak.app/Contents/MacOS/Squeak -h
>> unknown option: -h
>> Usage: Squeak [<option>...] [<imageName> [<argument>...]]
>>        ./Squeak.app/Contents/MacOS/Squeak [<option>...] -- [<argument>...]
>> Common <option>s:
>>   -help                 print this help message, then exit
>>   -memory <size>[kmg]  use fixed heap size (added to image size)
>>   -nohandlers           disable sigsegv & sigusr1 handlers
>>   -timephases           print start load and run times
>>   -breaksel selector    set breakpoint on send of selector
>>   -failonffiexception   when in an FFI callout primitive catch exceptions
>> and fail the primitive
>>   -breakmnu selector    set breakpoint on MNU of selector
>>   -eden <size>[kmg]     set eden memory to bytes
>>   -leakcheck num        check for leaks in the heap
>>   -stackpages num       use n stack pages
>>   -numextsems num       make the external semaphore table num in size
>>   -noheartbeat          disable the heartbeat for VM debugging. disables
>> input
>>   -pollpip (0|1)        output on each poll for input
>>   -eventtrace mask      print input events with types in mask to stderr
>>   -logplugin name       only log primitives in plugin
>>   -trace[=num]          enable tracing (optionally to a specific value)
>>   -warnpid              print pid in warnings
>>   -codesize <size>[mk]  set machine code memory to bytes
>>   -tracestores          enable store tracing (assert check stores)
>>   -cogmaxlits <n>       set max number of literals for methods to be
>> compiled to machine code
>>   -cogminjumps <n>      set min number of backward jumps for interpreted
>> methods to be considered for compilation to machine code
>>   -reportheadroom       report unused stack headroom on exit
>>   -maxoldspace <size>[kmg]  set max size of old space memory to bytes
>>   -logscavenge          log scavenging to scavenge.log
>>   -headless             run in headless (no window) mode (default: false)
>>   -headfull             run in headful (window) mode (default: true)
>>   -opengl               use OpenGL for drawing the VM window. Must be the
>> first argument.
>>   -core-graphics        use CoreGraphics for drawing the VM window. Must
>> be the first argument.
>>   -metal                use Metal for drawing the VM window. Must be the
>> first argument.
>>   -version              print version information, then exit
>>   -blockonerror         on error or segv block, not exit.  useful for
>> attaching gdb
>>   -blockonwarn          on warning block, don't warn.  useful for
>> attaching gdb
>>   -exitonwarn           treat warnings as errors, exiting on warn
>> Notes:
>>   <imageName> defaults to `squeak.image'.
>>   If '-memory' or '-maxoldspace' are not specified then the heap will
>> grow dynamically.
>>   <argument>s are ignored, but are processed by the Squeak image.
>>   The first <argument> normally names a Squeak `script' to execute.
>>   Precede <arguments> by `--' to use default image.
>
>
> $ ./Squeak.app/Contents/MacOS/Squeak -version
>> 5.0 5.20220602.1410 Mac OS X built on Jun  2 2022 15:55:29 UTC Compiler:
>> Apple LLVM 12.0.0 (clang-1200.0.32.29) [Production Spur 64-bit x64 VM]
>> CoInterpreter VMMaker.oscog-dtl.3185 uuid:
>> 0e7f07b8-eed6-4362-b223-86c98594ddb9 Jun  2 2022
>> StackToRegisterMappingCogit VMMaker.oscog-mt.3179 uuid:
>> c6fbcb07-2a19-ed4f-8b40-9c119a70882a Jun  2 2022
>> VM: 202206021410
>> runner at Mac-1654183989075.local:work/opensmalltalk-vm/opensmalltalk-vm
>> Date: Thu Jun 2 16:10:44 2022 CommitHash: c9fd365
>> Plugins: 202206021410
>> runner at Mac-1654183989075.local:work/opensmalltalk-vm/opensmalltalk-vm
>
> Do something like:
> squeak Cuis6.0-????.image -h
>
> This will display a help text and briefly open the vm window.
>
>
> 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/58d00e6e/attachment-0001.htm>


More information about the Cuis-dev mailing list