浏览代码

Moved common functions from Runtime into Builtins

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8043 8c9fc860-2736-0410-a75d-ab315db34111
negelef 7 年之前
父节点
当前提交
c91f69c538
共有 4 个文件被更改,包括 34 次插入116 次删除
  1. 21 8
      source/AMD64.Builtins.Mod
  2. 3 10
      source/FoxIntermediateBackend.Mod
  3. 9 26
      source/I386.Builtins.Mod
  4. 1 72
      source/Runtime.Mod

+ 21 - 8
source/AMD64.Builtins.Mod

@@ -6,7 +6,7 @@ VAR
 	modules-: LONGINT;
 
 PROCEDURE InsertModule*(a: ADDRESS): BOOLEAN;
-BEGIN
+BEGIN {UNCOOPERATIVE}
 	kernelModule[modules] := a;
 	INC(modules);
 	RETURN TRUE
@@ -19,12 +19,14 @@ END InsertModule;
 	traps if src or destination is not 0X terminated and comparison is not finished
 *)
 PROCEDURE CompareString*(CONST left,right: ARRAY OF CHAR): SHORTINT;
-VAR i: LONGINT; res: SHORTINT; l,r: CHAR;
-BEGIN
+VAR i: SIZE; res: SHORTINT; l, r: CHAR;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
 	i := 0; res := 0;
 	LOOP
-		l := left[i]; 		(* index check included *)
-		r := right[i];		(* index check included *)
+		ASSERT (i < LEN (left));
+		ASSERT (i < LEN (right));
+		l := left[i];
+		r := right[i];
 		IF (res = 0) THEN
 			IF (l > r) THEN
 				res := 1; EXIT
@@ -41,8 +43,8 @@ END CompareString;
 
 (* copy string from src to dest, emits trap if not 0X terminated or destination too short *)
 PROCEDURE CopyString*(VAR dest: ARRAY OF CHAR; CONST src: ARRAY OF CHAR);
-VAR i: LONGINT; ch :CHAR; l1,l2: LONGINT;
-BEGIN
+VAR i: SIZE; ch :CHAR; l1, l2: SIZE;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
 	(*
 	i := 0;
 	REPEAT
@@ -57,9 +59,20 @@ BEGIN
 	l2 := LEN(src);
 	IF l2 < l1 THEN l1 := l2 END;
 	SYSTEM.MOVE(ADDRESSOF(src[0]),ADDRESSOF(dest[0]),l1);
-	dest[l1-1] := 0X;
+	dest[l1-1] := 0X; (* this implies that COPY assumes a string *)
 END CopyString;
 
+PROCEDURE EnsureAllocatedStack*(size: SIZE);
+VAR i: ADDRESS; temp: ADDRESS;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+	FOR i := 0 TO size BY 4096 DO
+		SYSTEM.GET(ADDRESSOF(i)-i,temp);
+	END;
+END EnsureAllocatedStack;
+
 BEGIN
 	(*! assumed that modules = 0, implicit call of InsertModule *)
 END Builtins.
+
+
+Builtins.Obw

+ 3 - 10
source/FoxIntermediateBackend.Mod

@@ -3484,11 +3484,8 @@ TYPE
 			Emit(Push(position,right.op));
 			ReleaseOperand(right);
 
-			IF backend.cooperative THEN
-				CallThis(position,"Runtime",procedureName, 4);
-			ELSE
-				CallThis(position,builtinsModuleName,procedureName, 4);
-			END;
+			CallThis(position,builtinsModuleName,procedureName, 4);
+
 			IntermediateCode.InitRegister(reg,int8,IntermediateCode.GeneralPurposeRegister,AcquireRegister(int8,IntermediateCode.GeneralPurposeRegister));
 			Emit(Result(position,reg));
 			(*
@@ -3527,11 +3524,7 @@ TYPE
 			Emit(Push(position,right.op));
 			ReleaseOperand(right);
 
-			IF backend.cooperative THEN
-				CallThis(position,"Runtime",procedureName, 4);
-			ELSE
-				CallThis(position,builtinsModuleName,procedureName,4);
-			END;
+			CallThis(position,builtinsModuleName,procedureName,4);
 			RestoreRegisters(saved);
 		END CopyString;
 

+ 9 - 26
source/I386.Builtins.Mod

@@ -399,9 +399,6 @@ CODE
 	POP	EDX
 END EntierRH;
 
-
-
-
 (* compare strings,
 	returns 0 if strings are equal,
 	returns +1 if left is lexicographic greater than right,
@@ -409,12 +406,14 @@ END EntierRH;
 	traps if src or destination is not 0X terminated and comparison is not finished
 *)
 PROCEDURE CompareString*(CONST left,right: ARRAY OF CHAR): SHORTINT;
-VAR i: LONGINT; res: SHORTINT; l,r: CHAR;
-BEGIN {UNCOOPERATIVE}
+VAR i: SIZE; res: SHORTINT; l, r: CHAR;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
 	i := 0; res := 0;
 	LOOP
-		l := left[i]; 		(* index check included *)
-		r := right[i];		(* index check included *)
+		ASSERT (i < LEN (left));
+		ASSERT (i < LEN (right));
+		l := left[i];
+		r := right[i];
 		IF (res = 0) THEN
 			IF (l > r) THEN
 				res := 1; EXIT
@@ -431,8 +430,8 @@ END CompareString;
 
 (* copy string from src to dest, emits trap if not 0X terminated or destination too short *)
 PROCEDURE CopyString*(VAR dest: ARRAY OF CHAR; CONST src: ARRAY OF CHAR);
-VAR i: LONGINT; ch :CHAR; l1,l2: LONGINT;
-BEGIN {UNCOOPERATIVE}
+VAR i: SIZE; ch :CHAR; l1, l2: SIZE;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
 	(*
 	i := 0;
 	REPEAT
@@ -452,28 +451,12 @@ END CopyString;
 
 PROCEDURE EnsureAllocatedStack*(size: SIZE);
 VAR i: ADDRESS; temp: ADDRESS;
-BEGIN {UNCOOPERATIVE}
+BEGIN {UNCOOPERATIVE, UNCHECKED}
 	FOR i := 0 TO size BY 4096 DO
 		SYSTEM.GET(ADDRESSOF(i)-i,temp);
-		(*
-		SYSTEM.PUT(ADDRESSOF(val)-i,0);
-		*)
 	END;
-(*
-CODE{SYSTEM.i386}
-	MOV EAX, [EBP+size]
-	SHR EAX,12 ; divide by 4096
-	MOV ECX,-4
-start:
-	MOV EDX,[EBP+ECX]
-	SUB ECX,4096
-	TST EAX
-	DEC EAX
-	JNZ start
-*)
 END EnsureAllocatedStack;
 
-
 BEGIN
 	(*! assumed that modules = 0, implicit call of InsertModule *)
 END Builtins.

+ 1 - 72
source/Runtime.Mod

@@ -9,77 +9,6 @@ TYPE TrapHandler* = PROCEDURE (number: SIZE);
 
 VAR trapHandler*: TrapHandler;
 
-(* compare strings,
-	returns 0 if strings are equal,
-	returns +1 if left is lexicographic greater than right,
-	returns -1 if left is lexicographics smaller than right
-	traps if src or destination is not 0X terminated and comparison is not finished
-*)
-PROCEDURE CompareString*(CONST left,right: ARRAY OF CHAR): SHORTINT;
-VAR i: LONGINT; res: SHORTINT; l,r: CHAR;
-BEGIN {UNCOOPERATIVE, UNCHECKED}
-	i := 0; res := 0;
-	LOOP
-		l := left[i]; 		(* index check included *)
-		r := right[i];		(* index check included *)
-		IF (res = 0) THEN
-			IF (l > r) THEN
-				res := 1; EXIT
-			ELSIF (l<r) THEN
-				res := -1; EXIT
-			ELSIF l=0X THEN
-				EXIT
-			END;
-		END;
-		INC(i);
-	END;
-	RETURN res
-END CompareString;
-
-(* copy string from src to dest, emits trap if not 0X terminated or destination too short *)
-PROCEDURE CopyString*(VAR dest: ARRAY OF CHAR; CONST src: ARRAY OF CHAR);
-VAR i: LONGINT; ch :CHAR; l1,l2: LONGINT;
-BEGIN {UNCOOPERATIVE, UNCHECKED}
-	(*
-	i := 0;
-	REPEAT
-		ch := src[i];		(* index check included *)
-		dest[i] := ch;	(* index check included *)
-		INC(i);
-	UNTIL ch=0X;
-	*)
-
-	(*! currently implemented: old PACO semantics *)
-	l1 := LEN(dest);
-	l2 := LEN(src);
-	IF l2 < l1 THEN l1 := l2 END;
-	SYSTEM.MOVE(ADDRESSOF(src[0]),ADDRESSOF(dest[0]),l1);
-	dest[l1-1] := 0X; (* this implies that COPY assumes a string *)
-END CopyString;
-
-PROCEDURE EnsureAllocatedStack*(size: SIZE);
-VAR i: ADDRESS; temp: ADDRESS;
-BEGIN {UNCOOPERATIVE, UNCHECKED}
-	FOR i := 0 TO size BY 4096 DO
-		SYSTEM.GET(ADDRESSOF(i)-i,temp);
-		(*
-		SYSTEM.PUT(ADDRESSOF(val)-i,0);
-		*)
-	END;
-(*
-CODE{SYSTEM.i386}
-	MOV EAX, [EBP+size]
-	SHR EAX,12 ; divide by 4096
-	MOV ECX,-4
-start:
-	MOV EDX,[EBP+ECX]
-	SUB ECX,4096
-	TST EAX
-	DEC EAX
-	JNZ start
-*)
-END EnsureAllocatedStack;
-
 (** This procedure aborts the program and prints the number of the trap that caused the program to fail. *)
 (** The compiler calls this procedure for HALT statements or for unsatisfied ASSERT statements. *)
 PROCEDURE {NORETURN} Trap- (number: SIZE);
@@ -123,4 +52,4 @@ END Dispose;
 
 END Runtime.
 
-Runtime.Obw
+Runtime.Obw