MODULE* PROCEDURE AddVirtualInfo (u: Mx.Unit; VAR z: Mx.InfoList; i: INTEGER) = VAR n := NUMBER (u.info^); new: Mx.InfoVec; BEGIN <*ASSERT z.start = 0*> IF (z.cnt >= n) THEN new := NEW (Mx.InfoVec, n + n); SUBARRAY (new^, 0, n) := u.info^; u.info := new; END; u.info [z.cnt] := i; INC (z.cnt); END AddVirtualInfo; **; IMPORT M3ID, Mx, MxMap, MxSet, MxVS, MxVSSet; PROCEDURE MxRep UnitName (u: Mx.Unit): TEXT = CONST Tag = ARRAY BOOLEAN OF TEXT { ".m3", ".i3" }; BEGIN IF (u = NIL) THEN RETURN "<NIL>" END; RETURN M3ID.ToText (u.name) & Tag [u.interface]; END UnitName; VAR import_file: Mx.File := NIL; PROCEDUREGetVirtualUnit (x: Mx.LinkSet; nm: Mx.Name; client: Mx.Unit): Mx.Unit = VAR u: Mx.Unit := MxMap.Get (x.virtuals, nm); c: MxSet.T := MxMap.Get (x.clients, nm); BEGIN IF (import_file = NIL) THEN import_file := NEW (Mx.File, name := "*virtual*", imported := FALSE); END; IF (u = NIL) THEN u := NEW (Mx.Unit, interface := TRUE, name := nm, file := import_file, virtual := TRUE); MxMap.Insert (x.virtuals, nm, u); u.info := NEW (Mx.InfoVec, 20); END; IF (c = NIL) THEN c := MxSet.New (); MxMap.Insert (x.clients, nm, c); END; MxSet.Insert (c, client); RETURN u; END GetVirtualUnit;
PROCEDUREGetStamp (x : Mx.LinkSet; set : MxVSSet.T; vs : MxVS.T; VAR(*OUT*) unit : Mx.Unit; VAR(*OUT*) stamp : MxVS.T) = VAR info: MxVS.Info; BEGIN stamp := MxVSSet.Get (set, vs); IF (stamp # MxVS.NoVS) THEN MxVS.Get (vs, info); unit := MxMap.Get (x.interfaces, info.source); IF (unit = NIL) THEN unit := MxMap.Get (x.virtuals, info.source); END; END; END GetStamp; PROCEDUREGetExportedObject (x : Mx.LinkSet; o : Mx.ObjectType; VAR(*OUT*) unit : Mx.Unit; VAR(*OUT*) object : Mx.ObjectType) = VAR u: Mx.Unit; oo: Mx.ObjectType; BEGIN unit := NIL; object := NIL; IF (o.from_module) THEN u := MxMap.Get (x.modules, o.source); ELSE u := MxMap.Get (x.interfaces, o.source); END; IF (u = NIL) THEN u := MxMap.Get (x.virtuals, o.source); END; IF (u = NIL) THEN RETURN; END; unit := u; oo := u.exported_objects; WHILE (oo # NIL) DO IF (oo.type = o.type) AND (oo.from_module = o.from_module) THEN object := oo; RETURN; END; oo := oo.next; END; END GetExportedObject; PROCEDUREGetExportedRevelation (x : Mx.LinkSet; r : Mx.Revelation; VAR(*OUT*) unit : Mx.Unit; VAR(*OUT*) rev : Mx.Revelation) = VAR rx: Mx.Revelation; u: Mx.Unit; BEGIN unit := NIL; rev := NIL; u := MxMap.Get (x.interfaces, r.source); IF (u = NIL) THEN u := MxMap.Get (x.virtuals, r.source); END; IF (u = NIL) THEN RETURN; END; unit := u; rx := u.revelations; WHILE (rx # NIL) DO IF (rx.export) AND (rx.lhs = r.lhs) AND (rx.rhs = r.rhs) AND (rx.partial = r.partial) THEN rev := rx; RETURN; END; rx := rx.next; END; END GetExportedRevelation; BEGIN END MxRep.