<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">Adding an instance variable to Morph is tricky. Hence this preamble..."</blockquote><div><br></div>Thanks. Very clear.    ... preamble, as in, to be performed via command line -s <script> parameter?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 24, 2023 at 7:49 PM Juan Vuletich <<a href="mailto:juan@cuis.st">juan@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"><u></u>

  
    
    
  
  <div bgcolor="#ffffff">
    Those safeguards are there for a reason. Just removing them without
    really understanding what's going on is asking for trouble.<br>
    <br>
    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.<br>
    <br>
    Hope this helps.<br>
    <br>
    Cheers,<br>
    <br>
    On 3/24/2023 6:30 PM, Alexandre Rousseau via Cuis-dev wrote:
    <blockquote type="cite">
      <div dir="ltr">I just learned a new word. Thanks. :)
        <div><br>
        </div>
        <div>
          <div>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.</div>
        </div>
        <div><br>
        </div>
        <div>Even replacing "Object >> become:" with the Squeak
          equivalent fails (errors). </div>
        <div><br>
        </div>
        <div>Bummer that. Will dig deeper if I can find time and shovel.</div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Fri, Mar 24, 2023 at
          4:55 PM Gerald Klix <<a href="mailto:cuis.01@klix.ch" target="_blank">cuis.01@klix.ch</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>Oh well, this is becoming a bigger gymkhana.<br>
              <br>
              I presume you have too hack <tt>Object>>#become:</tt>;
              in essence disable all the checking code<br>
              before <tt>{ self } elementsExchangeIdentityWith: {
                otherObject }</tt>.<br>
              <br>
              NB:<br>
              The same method in Squeak just reads:<br>
              <br>
              <tt>become: otherObject </tt><tt><br>
              </tt><tt>    "Primitive. Swap the object pointers of the
                receiver and the argument.</tt><tt><br>
              </tt><tt>     All variables in the entire system that used
                to point to the receiver now</tt><tt><br>
              </tt><tt>     point to the argument, and vice-versa. Fails
                if either object is read-only</tt><tt><br>
              </tt><tt>     or is an immediate such as a SmallInteger."</tt><tt><br>
              </tt><tt><br>
              </tt><tt>    {self} elementsExchangeIdentityWith:
                {otherObject}</tt><tt><br>
              </tt><tt><br>
                <br>
              </tt>Use the browsers "versions" button to restore the old
              version.<br>
              You can do all of this while the image is running.<br>
              <br>
              Again I learned two things:<br>
              <br>
              1. Juan's precautionary code in <tt>become:</tt> checks
              all running processes.<br>
              2. Command line parsing is done after the UI's display
              process was started.<br>
              <br>
              See <tt>SystemDictionary>>#snapshot:andQuit:embedded:clearAllClassState:</tt>.<br>
              <tt>self processCommandLineArguments </tt>comes after<tt>
                <br>
                UISupervisor spawnNewMorphicProcessFor: (guiRootObject
                ifNil: [ guiRootObject := guiRootObjectClass newWorld
                ]).<br>
              </tt><br>
              <br>
              HTH,<br>
              <br>
              Gerald<br>
              <br>
              <br>
              <br>
              <br>
              On 3/24/23 8:09 PM, Alexandre Rousseau wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">
                <div>Nope. This still fails ...</div>
                <blockquote class="gmail_quote">./Squeak.app/Contents/MacOS/Squeak

                  Cuis-Smalltalk-Dev/Cuis6.0-5686.image -d "BoxedMorph
                  addInstVarName: 'someBorderStyle'"</blockquote>
                <blockquote class="gmail_quote"> ...</blockquote>
                <blockquote class="gmail_quote">Class reshaping:
                  WorldMorph has some instance running
                  #runDeferredUIMessages. This CompiledMethod would
                  become invalid. Class reshaping aborted.<br>
                  Class reshaping: WorldMorph has some instance running
                  #runDeferredUIMessages. This CompiledMethod would
                  become invalid. Class reshaping aborted.<br>
                  Class reshaping: WorldMorph has some instance running
                  #doOneCycleNow. This CompiledMethod would become
                  invalid. Class reshaping aborted.<br>
                  Class reshaping: WorldMorph has some instance running
                  #doOneCycle:. This CompiledMethod would become
                  invalid. Class reshaping aborted.<br>
                  Class reshaping: WorldMorph has some instance running
                  #mainLoop. This CompiledMethod would become invalid.
                  Class reshaping aborted.<br>
                  Class reshaping: WorldMorph has some instance running
                  #mainLoop. This CompiledMethod would become invalid.
                  Class reshaping aborted.</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" target="_blank">cuis-dev@lists.cuis.st</a>>

                  wrote:<br>
                </div>
                <blockquote class="gmail_quote">
                  <div>
                    <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>
                      <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>
            </blockquote>
            <br>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
    <br>
    <pre cols="72">-- 
Juan Vuletich
<a href="http://cuis.st" target="_blank">cuis.st</a>
<a href="http://github.com/jvuletich" target="_blank">github.com/jvuletich</a>
<a href="http://researchgate.net/profile/Juan-Vuletich" target="_blank">researchgate.net/profile/Juan-Vuletich</a>
<a href="http://independent.academia.edu/JuanVuletich" target="_blank">independent.academia.edu/JuanVuletich</a>
<a href="http://patents.justia.com/inventor/juan-manuel-vuletich" target="_blank">patents.justia.com/inventor/juan-manuel-vuletich</a>
<a href="http://linkedin.com/in/juan-vuletich-75611b3" target="_blank">linkedin.com/in/juan-vuletich-75611b3</a>
<a href="http://twitter.com/JuanVuletich" target="_blank">twitter.com/JuanVuletich</a></pre>
  </div>

</blockquote></div>