Ver Fonte

Added stack for valid addresses of VAR/CONST parameter or variable arrays

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6779 8c9fc860-2736-0410-a75d-ab315db34111
felixf há 9 anos atrás
pai
commit
df6f0e9d59
1 ficheiros alterados com 25 adições e 22 exclusões
  1. 25 22
      source/Generic.Reflection.Mod

+ 25 - 22
source/Generic.Reflection.Mod

@@ -411,26 +411,29 @@ CONST
 		w.Update;
 	END WriteBasicValue;
 	
-	PROCEDURE WriteValueString*(w: Streams.Writer; adr: ADDRESS; maxLen: LONGINT);
+	PROCEDURE OnHeapOrStack(adr: ADDRESS; low, high: ADDRESS): BOOLEAN;
+	BEGIN
+		RETURN (low <= adr) & (adr < high) OR CheckHeapAddress(adr);
+	END OnHeapOrStack;
+	
+	PROCEDURE WriteValueString*(w: Streams.Writer; adr: ADDRESS; maxLen: LONGINT; low, high: ADDRESS);
 	CONST MaxString = 32; 
 	VAR ch: CHAR;
 	BEGIN
 		IF maxLen > MaxString THEN maxLen := MaxString END; 
 		w.Char('"');
-		IF CheckHeapAddress(adr) THEN
-			LOOP
-				IF maxLen <= 0 THEN EXIT END;
-				SYSTEM.GET(adr, ch);
-				IF (ch < " ") OR (ch > "~") THEN EXIT END;
-				w.Char(ch);
-				INC(adr);
-				DEC(maxLen);
-			END;
+		LOOP
+			IF (maxLen <= 0) OR ~OnHeapOrStack(adr, low, high) THEN EXIT END;
+			SYSTEM.GET(adr, ch);
+			IF (ch < " ") OR (ch > "~") THEN EXIT END;
+			w.Char(ch);
+			INC(adr);
+			DEC(maxLen);
 		END;
 		w.Char('"');
 	END WriteValueString;
 
-	PROCEDURE WriteValue*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; adr: ADDRESS);
+	PROCEDURE WriteValue*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; adr: ADDRESS; low, high: ADDRESS);
 	VAR type: CHAR; a: ADDRESS; size: SIZE; len: SIZE;
 	BEGIN
 		type := GetChar(refs, offset);
@@ -449,17 +452,17 @@ CONST
 			WriteBasicValue(w, sfTypeANY, adr, size);
 			w.String("->");
 			SYSTEM.GET(adr, a);
-			WriteValue(w,refs,offset, a);
+			WriteValue(w,refs,offset, a, low,high);
 			(*SkipType(refs, offset);*)
 		| sfTypeOpenArray: 
 			IF refs[offset] = sfTypeCHAR THEN (* ARRAY OF CHAR *)
-				WriteValueString(w, adr, MaxString);
+				WriteValueString(w, adr, MaxString, low, high);
 			END;
 			SkipType(refs, offset);
 		| sfTypeStaticArray: 
 			len := GetSize(refs, offset); 
 			IF refs[offset] = sfTypeCHAR THEN (* ARRAY x OF CHAR *)
-				WriteValueString(w, adr, len);
+				WriteValueString(w, adr, len, low, high);
 			END;
 			SkipType(refs, offset);
 		| sfTypeDynamicArray: 
@@ -492,7 +495,7 @@ CONST
 		w.Update;
 	END WriteValue;
 		
-	PROCEDURE WriteVariable*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT;  base: ADDRESS);
+	PROCEDURE WriteVariable*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT;  base: ADDRESS; low, high: ADDRESS);
 	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT;  prevScope: SIZE; c: CHAR;
 	BEGIN
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
@@ -509,16 +512,16 @@ CONST
 		ELSE (* absolute *)
 			adr := GetAddress(refs, offset);
 		END;
-		WriteValue(w, refs, offset, adr); 
+		WriteValue(w, refs, offset, adr, low, high); 
 	END WriteVariable; 
 	
 	(* write variables taking meta information from stream in stream at offset, potentially stored at base address
 	 *)
-	PROCEDURE WriteVariables*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; base: ADDRESS);
+	PROCEDURE WriteVariables*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; base: ADDRESS; low, high: ADDRESS);
 	VAR count: LONGINT; 
 	BEGIN
 		WHILE refs[offset] = sfVariable DO
-			WriteVariable(w, refs, offset, base); w.Ln;
+			WriteVariable(w, refs, offset, base, low, high); w.Ln;
 			(*INC(count); *)
 		END; 
 		IF count > 0 THEN w.Ln; Wait(w); END;
@@ -782,7 +785,7 @@ CONST
 	PROCEDURE WriteProc*(w: Streams.Writer; pc: ADDRESS);
 	VAR refs: Modules.Bytes; refpos: LONGINT; base: ADDRESS;
 	BEGIN
-		WriteProc0(w, Modules.ThisModuleByAdr0(pc), pc, -1, refs, refpos, base)
+		WriteProc0(w, Modules.ThisModuleByAdr0(pc), pc,  -1, refs, refpos, base)
 	END WriteProc;
 	
 	(** Write the state of the specified module. *)
@@ -798,7 +801,7 @@ CONST
 			SkipSize(offset);
 			SkipString(refs, offset);
 			IF (GetChar(refs, offset) = sfScopeBegin) THEN
-				WriteVariables(w, refs, offset, 0)
+				WriteVariables(w, refs, offset, 0, 0, 0)
 			END;
 		END;
 	END ModuleState;
@@ -827,10 +830,10 @@ CONST
 					WriteProc0(w, m, pc, bp, refs, offset, base); w.Ln;Wait(w); w.Update;
 					IF long & (~overflow OR (count > 0)) THEN	(* show variables *)
 						IF offset >= 0 THEN 
-							WriteVariables(w,refs,offset, base); 
+							WriteVariables(w,refs,offset, stacklow, stackhigh, base); 
 							SkipType(refs, offset);
 							IF Expect(GetChar(refs, offset) = sfScopeBegin) THEN
-								WriteVariables(w,refs,offset, base); 
+								WriteVariables(w,refs,offset, base, stacklow, stackhigh); 
 							END;
 						END;
 						IF (m # NIL) & (base # m.sb) & (count = 0) THEN ModuleState(w, m) END