Przeglądaj źródła

adapt old object file format to recent changes in heaps (arrays with pointers don't refer to their last element any more but to the size)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6697 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 lat temu
rodzic
commit
55914d2750
1 zmienionych plików z 6 dodań i 5 usunięć
  1. 6 5
      source/Linker0.Mod

+ 6 - 5
source/Linker0.Mod

@@ -517,8 +517,8 @@ BEGIN
 	Fill4(dataBlockAdr, fillSize DIV 4, 0);
 
 	firstElem := dataBlockAdr + arrayDataOffset;
-	SYSTEM.PUT(dataBlockAdr, firstElem + arrSize - elemSize);	(* lastElemToMark *)
-	Relocate(dataBlockAdr);
+	SYSTEM.PUT(dataBlockAdr, numElems (* firstElem + arrSize - elemSize*) );	(* lastElemToMark *)
+	(* Relocate(dataBlockAdr); *)
 	SYSTEM.PUT(dataBlockAdr + AddressSize, NIL);				(* reserved for Mark *)
 	SYSTEM.PUT(dataBlockAdr + 2 * AddressSize, firstElem);		(* firstElem *)
 	Relocate(dataBlockAdr + 2 * AddressSize);
@@ -908,17 +908,18 @@ END RelocateModules;
 (* RelocateArrayFields - Fix up a dynamic array. *)
 
 PROCEDURE RelocateArrayFields(tagAdr: ADDRESS);
-VAR adr, p, lastElem: ADDRESS; staticTypeBlock {UNTRACED}: StaticTypeBlock; i: LONGINT;
+VAR adr, p, lastElem, size: ADDRESS; staticTypeBlock {UNTRACED}: StaticTypeBlock; i: LONGINT;
 BEGIN
-	SYSTEM.GET(tagAdr + AddressSize, lastElem);
+	SYSTEM.GET(tagAdr + AddressSize, size);
 	SYSTEM.GET(tagAdr + 3 * AddressSize, p);	(* firstElem *)
 	SYSTEM.GET(tagAdr, adr);	(* adr is address of static type descriptor (no alignment) *)
 	staticTypeBlock := SYSTEM.VAL(StaticTypeBlock, adr);
 	LOOP
+		IF size = 0 THEN EXIT END; 
+		DEC(size); 
 		FOR i := 0 TO LEN(staticTypeBlock.pointerOffsets) - 1 DO
 			Relocate(p + staticTypeBlock.pointerOffsets[i]);
 		END;
-		IF p = lastElem THEN EXIT END;
 		INC(p, staticTypeBlock.recSize)	(* step to next array element *)
 	END
 END RelocateArrayFields;