浏览代码

Patched bug with temporary allocation of small arrays

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6976 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 年之前
父节点
当前提交
30bd646120
共有 3 个文件被更改,包括 26 次插入6 次删除
  1. 2 0
      source/Fox.Tool
  2. 6 6
      source/FoxArrayBase.Mod
  3. 18 0
      source/MathArrays.Execution.Test

+ 2 - 0
source/Fox.Tool

@@ -106,9 +106,11 @@ SystemTools.DoCommands
 	FoxTest.Compile	 -l=Test.Log  Oberon.Compilation.Test Oberon.Compilation.AMD64TestDiff ~
 	FoxTest.Compile	-l=Test.Log Oberon.Execution.Test Oberon.Execution.AMD64TestDiff ~
 	FoxTest.Compile	-l=Test.Log ActiveCells.Execution.Test ActiveCells.Execution.TestDiff ~
+	FoxTest.Compile	-l=Test.Log MathArrays.Execution.Test  ~ 
 
 ~
 
+
 open regression test files
 PET.Open Oberon.Compilation.Test ~
 PET.Open Oberon.Execution.Test ~

+ 6 - 6
source/FoxArrayBase.Mod

@@ -8351,7 +8351,7 @@ Sufficient (but not necessary) conditions:
 
 				Mat2x2:
 					IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat2x2 THEN
-						IF dadr = 0 THEN NEW(RESULT,2,2);
+						IF dadr = 0 THEN NEW(RESULT,2,2); dadr := GetAdr(ADDRESSOF(RESULT));
 						ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 						END;
 					END;
@@ -8366,7 +8366,7 @@ Sufficient (but not necessary) conditions:
 
 				|Mat3x3:
 					IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat3x3 THEN
-						IF dadr = 0 THEN NEW(RESULT,3,3);
+						IF dadr = 0 THEN NEW(RESULT,3,3);dadr := GetAdr(ADDRESSOF(RESULT));
 						ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 						END;
 					END;
@@ -8389,7 +8389,7 @@ Sufficient (but not necessary) conditions:
 
 				|Mat4x4:
 					IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat4x4 THEN
-						IF dadr = 0 THEN NEW(RESULT,4,4);
+						IF dadr = 0 THEN NEW(RESULT,4,4); dadr := GetAdr(ADDRESSOF(RESULT));
 						ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 						END;
 					END;
@@ -8448,7 +8448,7 @@ Sufficient (but not necessary) conditions:
 
 			MatVec2x2:
 				IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec2 THEN
-					IF dadr = 0 THEN NEW(RESULT,2);
+					IF dadr = 0 THEN NEW(RESULT,2);dadr := GetAdr(ADDRESSOF(RESULT));
 					ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 					END;
 				END;
@@ -8463,7 +8463,7 @@ Sufficient (but not necessary) conditions:
 
 			|MatVec3x3:
 				IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec3 THEN
-					IF dadr = 0 THEN NEW(RESULT,3);
+					IF dadr = 0 THEN NEW(RESULT,3);dadr := GetAdr(ADDRESSOF(RESULT));
 					ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 					END;
 				END;
@@ -8479,7 +8479,7 @@ Sufficient (but not necessary) conditions:
 
 			|MatVec4x4:
 				IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec4 THEN
-					IF dadr = 0 THEN NEW(RESULT,4);
+					IF dadr = 0 THEN NEW(RESULT,4);dadr := GetAdr(ADDRESSOF(RESULT));
 					ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
 					END;
 				END;

+ 18 - 0
source/MathArrays.Execution.Test

@@ -1,4 +1,5 @@
 # Math Array Exeuction Test Suite
+# options 	--mayTrap --prolog="Compiler.Compile -p=Win32G TesterInput.txt" --command="SystemTools.Free Test Dummy B A;SystemTools.Load Test" --logFile="FoxExecutionTest.Log" --result="MathArrays.Execution.Test.Diff"
 
 positive: DIM and LEN
 
@@ -818,3 +819,20 @@ positive: Test of Min and Max
 
 	BEGIN Min; Max;
 	END Test.
+
+positive: Temporary allocation of small arrays (failed before 2016.10.07)
+
+	MODULE Test;
+
+	PROCEDURE Do;
+	VAR LT1,LT2: ARRAY [4,4] OF REAL;
+	    L: ARRAY [4] OF REAL;
+	BEGIN
+	    L := LT1 * LT2 * [0.3, 0, 0, 1];
+	END Do;
+
+	BEGIN
+		Do;
+	END Test. 
+	
+