<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Do you really need an instance variable?</blockquote><div>Yes. I would like to submit some (minor modification and impact) change sets for BoxedMorph and PluggableButtonMorph, for eventual discussion (somewhat related to theming).</div><div><br></div><div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">There is a method <tt>Class>>#addInstVarName:</tt> that lets you add instance variables.</blockquote></div><div>Perfect, thanks.<br></div><div><br><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">You can use the <tt>-e</tt> command-line option to execute code from the command line.</blockquote><div>Hmmm. Where did you find out about the -e option? I am running this on macOS</div><div>(obtained from <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm">https://github.com/OpenSmalltalk/opensmalltalk-vm</a>) and invoking</div><div><font face="monospace">./Squeak.app/Contents/MacOS/Squeak -help</font> outputs:<br></div></div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font size="1"><font face="monospace">$ ./Squeak.app/Contents/MacOS/Squeak -h<br></font><font face="monospace">unknown option: -h<br></font><font face="monospace">Usage: Squeak [<option>...] [<imageName> [<argument>...]]<br></font><font face="monospace">       ./Squeak.app/Contents/MacOS/Squeak [<option>...] -- [<argument>...]<br></font><font face="monospace">Common <option>s:<br></font><font face="monospace">  -help                 print this help message, then exit<br></font><font face="monospace">  -memory <size>[kmg]  use fixed heap size (added to image size)<br></font><font face="monospace">  -nohandlers           disable sigsegv & sigusr1 handlers<br></font><font face="monospace">  -timephases           print start load and run times<br></font><font face="monospace">  -breaksel selector    set breakpoint on send of selector<br></font><font face="monospace">  -failonffiexception   when in an FFI callout primitive catch exceptions and fail the primitive<br></font><font face="monospace">  -breakmnu selector    set breakpoint on MNU of selector<br></font><font face="monospace">  -eden <size>[kmg]     set eden memory to bytes<br></font><font face="monospace">  -leakcheck num        check for leaks in the heap<br></font><font face="monospace">  -stackpages num       use n stack pages<br></font><font face="monospace">  -numextsems num       make the external semaphore table num in size<br></font><font face="monospace">  -noheartbeat          disable the heartbeat for VM debugging. disables input<br></font><font face="monospace">  -pollpip (0|1)        output on each poll for input<br></font><font face="monospace">  -eventtrace mask      print input events with types in mask to stderr<br></font><font face="monospace">  -logplugin name       only log primitives in plugin<br></font><font face="monospace">  -trace[=num]          enable tracing (optionally to a specific value)<br></font><font face="monospace">  -warnpid              print pid in warnings<br></font><font face="monospace">  -codesize <size>[mk]  set machine code memory to bytes<br></font><font face="monospace">  -tracestores          enable store tracing (assert check stores)<br></font><font face="monospace">  -cogmaxlits <n>       set max number of literals for methods to be compiled to machine code<br></font><font face="monospace">  -cogminjumps <n>      set min number of backward jumps for interpreted methods to be considered for compilation to machine code<br></font><font face="monospace">  -reportheadroom       report unused stack headroom on exit<br></font><font face="monospace">  -maxoldspace <size>[kmg]  set max size of old space memory to bytes<br></font><font face="monospace">  -logscavenge          log scavenging to scavenge.log<br></font><font face="monospace">  -headless             run in headless (no window) mode (default: false)<br></font><font face="monospace">  -headfull             run in headful (window) mode (default: true)<br></font><font face="monospace">  -opengl               use OpenGL for drawing the VM window. Must be the first argument.<br></font><font face="monospace">  -core-graphics        use CoreGraphics for drawing the VM window. Must be the first argument.<br></font><font face="monospace">  -metal                use Metal for drawing the VM window. Must be the first argument.<br></font><font face="monospace">  -version              print version information, then exit<br></font><font face="monospace">  -blockonerror         on error or segv block, not exit.  useful for attaching gdb<br></font><font face="monospace">  -blockonwarn          on warning block, don't warn.  useful for attaching gdb<br></font><font face="monospace">  -exitonwarn           treat warnings as errors, exiting on warn<br></font><font face="monospace">Notes:<br></font><font face="monospace">  <imageName> defaults to `squeak.image'.<br></font><font face="monospace">  If '-memory' or '-maxoldspace' are not specified then the heap will grow dynamically.<br></font><font face="monospace">  <argument>s are ignored, but are processed by the Squeak image.<br></font><font face="monospace">  The first <argument> normally names a Squeak `script' to execute.<br></font><font face="monospace">  Precede <arguments> by `--' to use default image.</font></font></blockquote><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace" size="1">$ ./Squeak.app/Contents/MacOS/Squeak -version<br>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]<br>CoInterpreter VMMaker.oscog-dtl.3185 uuid: 0e7f07b8-eed6-4362-b223-86c98594ddb9 Jun  2 2022<br>StackToRegisterMappingCogit VMMaker.oscog-mt.3179 uuid: c6fbcb07-2a19-ed4f-8b40-9c119a70882a Jun  2 2022<br>VM: 202206021410 runner@Mac-1654183989075.local:work/opensmalltalk-vm/opensmalltalk-vm<br>Date: Thu Jun 2 16:10:44 2022 CommitHash: c9fd365<br>Plugins: 202206021410 runner@Mac-1654183989075.local:work/opensmalltalk-vm/opensmalltalk-vm</font></blockquote></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 24, 2023 at 4:23 AM Gerald Klix via Cuis-dev <<a href="mailto:cuis-dev@lists.cuis.st">cuis-dev@lists.cuis.st</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF">
    <div>On 3/24/23 8:31 AM, Alexandre Rousseau
      via Cuis-dev wrote:<br>
    </div>
    <blockquote type="cite">
      <pre>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.
</pre>
      <blockquote type="cite">
        <pre>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.
</pre>
      </blockquote>
      <pre></pre>
      <br>
      <fieldset></fieldset>
    </blockquote>
    First, let me analyze that problem.<br>
    Nearly every Morph you see on the screen – <tt>SystemWindow</tt>
    and <br>
    thus <tt>BrowserWindow</tt> – is derived from <tt>BoxedMorph</tt>.
    Juan added save guards<br>
    to Object>>#become:, because adding the target object of <tt>#become:</tt><br>
    might still have some active contexts on the stack and these<br>
    active contexts refer to methods that where compiled for the<br>
    source object of <tt>#bceome:</tt>. In your case the source object<br>
    is the old class and the target object is the new class, with<br>
    the added instance variable. If you will add the instance variable<br>
    add the end, it would work out. Otherwise some<br>
    morphic code in the running system will certainly crash.<br>
    <br>
    Now for ways around this mess:<br>
    <br>
    Do you really need an instance variable?<br>
    Morphs also have properties, that should<br>
    be used if the instance variable is <tt>nil</tt> for<br>
    most morphs. Properties come in handy here,<br>
    because the can be added at run-time.<br>
    <br>
    If you insist on adding instance variables,<br>
    you have to add your variable with<br>
    no morphic code on the stack, meaning you have to <br>
    do it from the command line.<br>
    There is a method <tt>Class>>#addInstVarName:</tt> that lets<br>
    you add instance variables.<br>
    <br>
    You can use the <tt>-e</tt> command-line option<br>
    to execute code from the command line.<br>
    <br>
    <br>
    HTH,<br>
    <br>
    Gerald<br>
  </div>

-- <br>
Cuis-dev mailing list<br>
<a href="mailto:Cuis-dev@lists.cuis.st" target="_blank">Cuis-dev@lists.cuis.st</a><br>
<a href="https://lists.cuis.st/mailman/listinfo/cuis-dev" rel="noreferrer" target="_blank">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
</blockquote></div>