<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>