[Oberon] Oberon for a C++ user.

Felix Friedrich felix.friedrich at inf.ethz.ch
Thu Nov 17 16:36:55 CET 2016


Andreas

I imagine the following, admittedly artificial, setup:

MODULE A contains a list L of some R0 = POINTER TO RECORD ... END
For example A provides base type and repositories of geometric figures.

MODULE B imports A and declares R1 = POINTER TO RECORD (A.R0) .. END;
For example R1 describes a circle.

MODULE C traverses the list of A identifying every B.R1 element with a 
type test:
IF element IS R1 THEN (* e.g. remove it from the list A.L *) END;
For example C constitutes a graphics program providing a mechanism to 
remove all circles from a plot.

The problem is that if B is unloaded after some circles had been 
deposited in A.L and if B is loaded again and only then C is becoming 
active, it will only remove elements from the new B but not of the older 
B: there will still be circles in the plot.


Minimal Test code:

MODULE A;
TYPE R* = POINTER TO RECORD END;
VAR r*: R;
END A.

MODULE B;
IMPORT A;
TYPE R* = POINTER TO RECORD(A.R) END;
VAR r: R;
BEGIN
     NEW(r);
     IF A.r = NIL THEN
         A.r := r;
     END;
END B.

MODULE C;
IMPORT A,B;
BEGIN
     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. *)
     ASSERT(A.r = NIL);
END C.

Load Module C.
System.Free C ~
Load Module C. (--> TRAP)

Rgds
Felix


> Felix,
>
> that appears to be a solvable problem though. Two comments:
>
>
> (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.
>
>
> (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.
>
>
> 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.
>
>
> 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.
>
>
> Andreas
>
> -------------------------------------------------------------------------------------------
> From: Felix Friedrich felix.friedrich at inf.ethz.ch
> Tue Sep 27 19:11:59 CEST 2016
>
> > But this does not solve other problems coming from the possible
> > coexistence of an old and new version of a module. If the old module
> > survives, pointers could be passed around to new modules compromising
> > the type system.
>
> > I think that any kind of upcall, be it via procedure variables or via
> > object methods does not go well with module unloading.
>
> > Felix
>
>
>
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/oberon/attachments/20161117/36f57b1f/attachment.html>


More information about the Oberon mailing list