Răsfoiți Sursa

Fixed module registering: imported modules are now removed from the register list before calling Initialize0 on them.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6476 8c9fc860-2736-0410-a75d-ab315db34111
eth.tmartiel 9 ani în urmă
părinte
comite
16deee6b59
1 a modificat fișierele cu 22 adăugiri și 3 ștergeri
  1. 22 3
      source/Generic.Modules.Mod

+ 22 - 3
source/Generic.Modules.Mod

@@ -29,7 +29,7 @@ CONST
 	DefaultContext* = "A2";
 	NoLoader=3400;
 
-	TraceBoot=FALSE;
+	TraceBoot=TRUE;
 
 TYPE
 	(* definitions for object-model loader support *)
@@ -326,6 +326,8 @@ VAR callagain: BOOLEAN;
 PROCEDURE Initialize0*(module: Module);
 VAR new: BOOLEAN;
 BEGIN
+	(* module MUST have been removed from register list and must not have been initialized yet *)
+	ASSERT(module.next = NIL);
 	Publish (module, new);
 	callagain := FALSE;
 	IF new THEN
@@ -922,7 +924,7 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 END Register;
 
 PROCEDURE PublishRegisteredModules;
-VAR m {UNTRACED}: Module; module, import: SIZE;
+VAR m {UNTRACED}, prev {UNTRACED}, cur {UNTRACED}: Module; module, import: SIZE;
 BEGIN
 	WHILE register.first # NIL DO
 		m := register.first;
@@ -930,7 +932,24 @@ BEGIN
 		m.next := NIL;
 		IF m.module # NIL THEN
 			FOR import := 0 TO LEN (m.module) - 1 DO
-				Initialize0 (m.module[import]);
+				IF ~m.module[import].published THEN
+					ASSERT(register.first # NIL);
+					prev := NIL;
+					cur := register.first;
+					WHILE (cur # NIL) & (cur # m.module[import]) DO
+						prev := cur;
+						cur := cur.next
+					END;
+					(*ASSERT(cur = m.module[import]);*)
+					ASSERT(cur = m.module[import]);
+					IF prev = NIL THEN
+						register.first := cur.next
+					ELSE
+						prev.next := cur.next;
+					END;
+					cur.next := NIL;
+					Initialize0 (m.module[import]);
+				END
 			END;
 		END;
 		Initialize0 (m);