浏览代码

Allowed blocks without head blocks in GC check
Added array allocation that will replace the old style


git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7193 8c9fc860-2736-0410-a75d-ab315db34111

felixf 8 年之前
父节点
当前提交
b11d0742aa
共有 1 个文件被更改,包括 43 次插入2 次删除
  1. 43 2
      source/Heaps.Mod

+ 43 - 2
source/Heaps.Mod

@@ -253,7 +253,8 @@ BEGIN
 	block := p;
 	block := p;
 	IF (block # NIL) & Machine.ValidHeapAddress(ADDRESS OF block.heapBlock)THEN
 	IF (block # NIL) & Machine.ValidHeapAddress(ADDRESS OF block.heapBlock)THEN
 		block := block.heapBlock;
 		block := block.heapBlock;
-		IF (block # NIL) & Machine.ValidHeapAddress(ADDRESS OF block.typeBlock) THEN
+		IF (block = NIL) THEN RETURN TRUE (* block without heap header -- considered untraced *)
+		ELSIF Machine.ValidHeapAddress(ADDRESS OF block.typeBlock) THEN
 			tdAdr := block.typeBlock;
 			tdAdr := block.typeBlock;
 			IF (tdAdr = systemBlockTag) OR (tdAdr = recordBlockTag) OR (tdAdr = protRecBlockTag) OR (tdAdr = arrayBlockTag) THEN
 			IF (tdAdr = systemBlockTag) OR (tdAdr = recordBlockTag) OR (tdAdr = protRecBlockTag) OR (tdAdr = arrayBlockTag) THEN
 				RETURN TRUE;
 				RETURN TRUE;
@@ -1083,7 +1084,7 @@ BEGIN
 	CheckPostGC;
 	CheckPostGC;
 	try := 1;
 	try := 1;
 	p := NIL;
 	p := NIL;
-	IF  (GC = NilGC) OR (throughput < 64*1024*1024) THEN
+	IF  (GC = NilGC) OR (throughput < 128*1024*1024) THEN
 		GetFreeBlock(size, p);
 		GetFreeBlock(size, p);
 	ELSE
 	ELSE
 		throughput := 0;
 		throughput := 0;
@@ -1369,6 +1370,46 @@ BEGIN
 	END
 	END
 END NewArr;
 END NewArr;
 
 
+TYPE
+UnsafeArray= POINTER {UNSAFE} TO UnsafeArrayDesc;
+UnsafeArrayDesc = RECORD (ArrayDataBlockDesc)
+	len: ARRAY 8 OF SIZE;
+END;
+
+(* replacement for overcomplicated code emission -- at the cost of a slightly increased runtime cost *)
+PROCEDURE NewArray*(CONST a: ARRAY OF SIZE;  elementSize: SIZE; tag: ADDRESS; VAR dest: ANY);
+VAR p: ANY; dim: SIZE;
+		
+		PROCEDURE GetSize(): SIZE;
+		VAR i: SIZE; size: SIZE;
+		BEGIN
+			size := 1;
+			FOR i := 0 TO dim-1 DO
+				size := size * a[i];
+			END;
+			RETURN size;
+		END GetSize;
+		
+		PROCEDURE SetSizes(dest: UnsafeArray);
+		VAR i: SIZE;
+		BEGIN
+			FOR i := 0 TO dim-1 DO
+				dest.len[i] := a[i];
+			END;
+		END SetSizes;
+
+	BEGIN
+		dim := LEN( a,0 );
+		IF tag = NIL THEN
+			NewSys(p, GetSize() * elementSize + dim * SIZEOF(ADDRESS) + 3 *SIZEOF(ADDRESS) + (dim DIV 2) * 2 * SIZEOF(ADDRESS), FALSE);
+		ELSE
+			NewArr(p, tag, GetSize(), dim, FALSE);
+		END;
+		SetSizes(p);
+		dest := p;
+END NewArray;
+
+
 (* obsolete for generic object file / required only for old loader *)
 (* obsolete for generic object file / required only for old loader *)
 PROCEDURE FillStaticType*(VAR staticTypeAddr: ADDRESS; startAddr, typeInfoAdr: ADDRESS; size, recSize: SIZE;
 PROCEDURE FillStaticType*(VAR staticTypeAddr: ADDRESS; startAddr, typeInfoAdr: ADDRESS; size, recSize: SIZE;
 							numPtrs, numSlots: LONGINT);
 							numPtrs, numSlots: LONGINT);