ソースを参照

Patched passing of variables, values and expressions as array of byte

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6890 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 年 前
コミット
e5f1a046cd

+ 1 - 1
source/FoxIntermediateBackend.Mod

@@ -4609,7 +4609,7 @@ TYPE
 					Evaluate(expression, tmpOperand);
 					Evaluate(expression, tmpOperand);
 					variable := GetTemporaryVariable(expression.type, FALSE);
 					variable := GetTemporaryVariable(expression.type, FALSE);
 					Symbol(variable, operand);
 					Symbol(variable, operand);
-					MakeMemory(tmp,operand.op,operand.op.type,0);
+					MakeMemory(tmp,operand.op,tmpOperand.op.type,0);
 					Emit(Mov(position,tmp, tmpOperand.op));
 					Emit(Mov(position,tmp, tmpOperand.op));
 					ReleaseOperand(tmpOperand);
 					ReleaseOperand(tmpOperand);
 				END;
 				END;

+ 3 - 1
source/FoxSemanticChecker.Mod

@@ -2402,7 +2402,9 @@ TYPE
 		VAR result: SyntaxTree.Expression; int: HUGEINT; real, imaginary: LONGREAL; set: SET; char: CHAR; string: Scanner.StringType;
 		VAR result: SyntaxTree.Expression; int: HUGEINT; real, imaginary: LONGREAL; set: SET; char: CHAR; string: Scanner.StringType;
 		BEGIN
 		BEGIN
 			result := expression; type := type.resolved;
 			result := expression; type := type.resolved;
-			IF (expression IS SyntaxTree.IntegerValue)  THEN
+			IF (type IS SyntaxTree.ArrayType) & (type(SyntaxTree.ArrayType).arrayBase.resolved IS SyntaxTree.ByteType) THEN
+				(* skip, no conversion *)
+			ELSIF (expression IS SyntaxTree.IntegerValue)  THEN
 				int := expression(SyntaxTree.IntegerValue).hvalue;
 				int := expression(SyntaxTree.IntegerValue).hvalue;
 				IF (type IS SyntaxTree.IntegerType) OR (type IS SyntaxTree.SizeType) THEN
 				IF (type IS SyntaxTree.IntegerType) OR (type IS SyntaxTree.SizeType) THEN
 					int := Global.ConvertSigned(int,system.SizeOf(type));
 					int := Global.ConvertSigned(int,system.SizeOf(type));

+ 23 - 0
source/Oberon.Execution.Test

@@ -7802,3 +7802,26 @@ positive: pass record size to array of system.byte with dynamic dize for varpars
 		TestI(a^);
 		TestI(a^);
 		TestI(c);
 		TestI(c);
 	END Test.
 	END Test.
+
+positive: pass variables and values to array of byte
+
+	MODULE Test;
+
+	IMPORT SYSTEM; 
+
+	PROCEDURE Pass(CONST a: ARRAY OF SYSTEM.BYTE; len: LONGINT);
+	VAR i: LONGINT;
+	BEGIN
+		ASSERT(LEN(a) = len);
+	END Pass;
+
+	PROCEDURE Test*;
+	VAR i: LONGINT;
+	BEGIN
+		Pass(3,1);
+		Pass(i,4);
+		Pass(3+i,4);
+		Pass(65000, 2); 
+	END Test;
+
+	END Test.