浏览代码

Improved assignment checks that are publicly accessible

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7761 8c9fc860-2736-0410-a75d-ab315db34111
eth.negelef 7 年之前
父节点
当前提交
63d158afd0
共有 1 个文件被更改,包括 11 次插入4 次删除
  1. 11 4
      source/Heaps.Mod

+ 11 - 4
source/Heaps.Mod

@@ -359,11 +359,18 @@ BEGIN
 	END;
 	END;
 END EnterInCardSet;
 END EnterInCardSet;
 
 
-PROCEDURE CheckAssignment*(dest, src: DataBlockU);
+PROCEDURE CheckInternalAssignment(dest, src: DataBlockU);
 BEGIN
 BEGIN
 	IF (src # NIL) & (src.heapBlock # NIL) & (src.heapBlock.mark MOD GenerationMask = Young) THEN
 	IF (src # NIL) & (src.heapBlock # NIL) & (src.heapBlock.mark MOD GenerationMask = Young) THEN
 		EnterInCardSet(dest);
 		EnterInCardSet(dest);
 	END;
 	END;
+END CheckInternalAssignment;
+
+PROCEDURE CheckAssignment*(dest, src: DataBlockU);
+BEGIN
+	IF (currentGeneration = Young) OR (youngCounts > 0) THEN
+		CheckInternalAssignment(dest, src);
+	END;
 END CheckAssignment;
 END CheckAssignment;
 
 
 (* Sweep phase *)
 (* Sweep phase *)
@@ -1678,7 +1685,7 @@ VAR assigns*: LONGINT;
 
 
 PROCEDURE Assign*(VAR dest: ADDRESS; src: ADDRESS);
 PROCEDURE Assign*(VAR dest: ADDRESS; src: ADDRESS);
 BEGIN
 BEGIN
-	CheckAssignment(ADDRESS OF dest,src);
+	CheckInternalAssignment(ADDRESS OF dest,src);
 	dest := src;
 	dest := src;
 	INC(assigns);
 	INC(assigns);
 END Assign;
 END Assign;
@@ -1688,7 +1695,7 @@ VAR i: LONGINT; sval: ADDRESS;
 BEGIN
 BEGIN
 	FOR i := 0 TO LEN(tag.pointerOffsets)-1 DO
 	FOR i := 0 TO LEN(tag.pointerOffsets)-1 DO
 		SYSTEM.GET(src+tag.pointerOffsets[i], sval);
 		SYSTEM.GET(src+tag.pointerOffsets[i], sval);
-		CheckAssignment(dest + tag.pointerOffsets[i], sval); 
+		CheckInternalAssignment(dest + tag.pointerOffsets[i], sval); 
 	END;
 	END;
 	SYSTEM.MOVE(src,dest,tag.recSize);
 	SYSTEM.MOVE(src,dest,tag.recSize);
 	INC(assigns);
 	INC(assigns);
@@ -1700,7 +1707,7 @@ BEGIN
 	FOR j := 0 TO LEN(tag.pointerOffsets)-1 DO
 	FOR j := 0 TO LEN(tag.pointerOffsets)-1 DO
 	FOR i := 0 TO numElems-1 DO
 	FOR i := 0 TO numElems-1 DO
 		SYSTEM.GET(src+tag.pointerOffsets[i] + i * tag.recSize + tag.pointerOffsets[j], sval);
 		SYSTEM.GET(src+tag.pointerOffsets[i] + i * tag.recSize + tag.pointerOffsets[j], sval);
-		CheckAssignment(dest+ i * tag.recSize + tag.pointerOffsets[j], sval);
+		CheckInternalAssignment(dest+ i * tag.recSize + tag.pointerOffsets[j], sval);
 	END;
 	END;
 	END;
 	END;
 	SYSTEM.MOVE(src,dest,tag.recSize * numElems);
 	SYSTEM.MOVE(src,dest,tag.recSize * numElems);