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

Gerald Klix cuis.01 at klix.ch
Fri Mar 24 08:23:51 PDT 2023


On 3/24/23 2:53 PM, Alexandre Rousseau via Cuis-dev wrote:
>
>     Do something like: squeak Cuis6.0-????.image -h
>
>
> That worked, thanks !
> PS : do you know if this is documented somewhere?
Sorry, I am not competent to answer that question,
with most Smalltalks I just use the browsers to find
my way around. And of course I do know
my own stuff at: http://haver.klix..ch.
So I do not read much documentation.

There is of course the Cuis Book and other stuff:
https://cuis.st/documentation

Most of it, I never read.


HTH,

Gerald



>
> On Fri, Mar 24, 2023 at 9:45 AM Gerald Klix <cuis.01 at klix.ch 
> <mailto: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
>>         <mailto: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
>>         <mailto: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 <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
>>
>
>



More information about the Cuis-dev mailing list