<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    The code does not work for Component Pascal.<br>
    One must write for MODULE A, <br>
    either<br>
    TYPE R* = POINTER TO EXTENSIBLE RECORD END;<br>
    or<br>
    TYPE R* = POINTER TO ABSTRACT RECORD END;<br>
    However using EXTENSIBLE does indeed lead to a trap for CP.<br>
    -Doug<br>
    <br>
    <div class="moz-cite-prefix">On 11/17/2016 7:36 AM, Felix Friedrich
      wrote:<br>
    </div>
    <blockquote
      cite="mid:974b9719-3dd9-5fb2-6f09-f65e2c835f27@inf.ethz.ch"
      type="cite">
      <meta content="text/html; charset=windows-1252"
        http-equiv="Content-Type">
      MODULE A;<br>
      <div class="moz-cite-prefix"> TYPE R* = POINTER TO RECORD END;<br>
        VAR r*: R;<br>
        END A.<br>
        <br>
        MODULE B;<br>
        IMPORT A;<br>
        TYPE R* = POINTER TO RECORD(A.R) END;<br>
        VAR r: R;<br>
        BEGIN  <br>
            NEW(r);<br>
            IF A.r = NIL THEN<br>
                A.r := r;<br>
            END;<br>
        END B.<br>
        <br>
        MODULE C;<br>
        IMPORT A,B;<br>
        BEGIN<br>
            IF A.r IS B.R THEN A.r := NIL END; (* problem: type test
        refers to "new" version of B.R while an instance of an old
        version of B.R is still existing. *)<br>
            ASSERT(A.r = NIL);  <br>
        END C.<br>
        <br>
        Load Module C.<br>
        System.Free C ~<br>
        Load Module C. (--> TRAP)<br>
        <br>
        Rgds<br>
        Felix<br>
        <br>
        <br>
      </div>
      <blockquote
        cite="mid:820376940.2296230.1478944376342@mail.yahoo.com"
        type="cite">
        <meta http-equiv="Content-Type" content="text/html;
          charset=windows-1252">
        <div style="color:#000; background-color:#fff;
          font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande,
          sans-serif;font-size:13px">
          <div id="yui_3_16_0_ym19_1_1478930367016_11861">Felix,</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">that
            appears to be a solvable problem though. Two comments:</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">(i)
            In order to keep "old" types and methods around, it suffices
            to keep older versions of a module block (containing both
            its type descriptors and its procedures) around in main
            memory, as long as there are references to them from the
            remaining part of the system.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">(ii)
            Even if an "old" version of a module passes a pointer around
            and that pointer suddenly ends up in a newer version (of
            potentially the same module), it is not really a problem (I
            think, but happy to be proven wrong) - so long as the "old"
            type descriptors and methods are still available in memory.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">Note
            that "old" methods will of course also access the "old"
            record and the "old" type descriptor for that record type,
            so there doesn't seem to be problem in principle. That of
            course needs to be taken with a grain of salt, just like one
            needs to take module interfaces with a grain of salt. If the
            newer version of a module doesn't actually change the module
            *interface* (i.e. meaning that clients do not need to be
            recompiled), but significantly changes the semantics of its
            implementation, there may be issues. All that is really
            guaranteed is that the module *interface* doesn't change -
            so even with modules, it is the programmer's responsibility
            that the *semantics* between multiple versions are
            "consistent". I'd say it's the same with records and
            methods.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">PS:
            I have implemented (i), but have not tested an example for
            (ii) yet. So if someone supplied a short test program for
            that in this forum, I'd be happy to test and then report on
            it.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr">Andreas</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11861" dir="ltr"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11937">-------------------------------------------------------------------------------------------</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11937" dir="ltr">From:
            Felix Friedrich felix.friedrich at inf.ethz.ch </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11938">Tue Sep 27
            19:11:59 CEST 2016</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11942"><br>
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11964">> But this
            does not solve other problems coming from the possible </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11965">>
            coexistence of an old and new version of a module. If the
            old module </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11966">> survives,
            pointers could be passed around to new modules compromising </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11967">> the type
            system.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11968"><br
              id="yui_3_16_0_ym19_1_1478930367016_11969">
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11970">> I think
            that any kind of upcall, be it via procedure variables or
            via </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11971">> object
            methods does not go well with module unloading.</div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11972"><br
              id="yui_3_16_0_ym19_1_1478930367016_11973">
          </div>
          <div id="yui_3_16_0_ym19_1_1478930367016_11974">> Felix</div>
          <div dir="ltr" id="yui_3_16_0_ym19_1_1478930367016_11975"><br
              id="yui_3_16_0_ym19_1_1478930367016_11976">
          </div>
        </div>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">--
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a>
</pre>
      </blockquote>
      <p><br>
      </p>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">--
<a class="moz-txt-link-abbreviated" href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems
<a class="moz-txt-link-freetext" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>