浏览代码

VARPAR support

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6654 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 年之前
父节点
当前提交
7ee8ff5340
共有 1 个文件被更改,包括 27 次插入2 次删除
  1. 27 2
      source/FoxInterpreterSymbols.Mod

+ 27 - 2
source/FoxInterpreterSymbols.Mod

@@ -323,16 +323,39 @@ TYPE
 			stack.PushA(adr);
 		END PushAddress;
 		
-		PROCEDURE Push*(v: Value): BOOLEAN;
+		PROCEDURE Push*(v: Result): BOOLEAN;
 		VAR type: Modules.EntryType;
 			s: SHORTINT; i: INTEGER; l: LONGINT; h: HUGEINT; 
 			r: REAL; x: LONGREAL;
 			b: BOOLEAN;
 			set: SET;
+			var: BOOLEAN;
 		BEGIN
 			IF (proc.parameters = NIL) OR (index >= LEN(proc.parameters)) THEN RETURN FALSE END; 
 			type := proc.parameters[index].type;
+			var := 1 IN proc.parameters[index].flags;
 			INC(index);
+			IF var THEN
+				IF type.subclass = 0X THEN
+					CASE type.class OF
+						sfTypeCHAR .. sfTypePointerToArray:
+						 stack.PushA(v.Address());
+						 RETURN TRUE;
+					ELSE
+						RETURN FALSE
+					END;
+				ELSIF type.subclass = sfTypeOpenArray THEN
+					CASE type.class OF
+					sfTypeCHAR, sfTypeCHAR8:
+						IF v IS StringValue THEN
+							stack.PushSz(LEN(v(StringValue).value));
+							stack.PushA(ADDRESSOF(v(StringValue).value[0])); 
+							RETURN TRUE;
+						END;
+					END;
+				END;
+			ELSE
+			WITH v: Value DO 
 			IF type.subclass = 0X THEN
 				CASE type.class OF
 				sfTypeSHORTINT,sfTypeSIGNED8 : 
@@ -382,9 +405,11 @@ TYPE
 					IF v IS StringValue THEN
 						stack.PushSz(LEN(v(StringValue).value));
 						stack.PushA(ADDRESSOF(v(StringValue).value[0])); 
+						RETURN TRUE;
 					END;
 				END;
-				RETURN TRUE;
+			END;
+			END;
 			END;
 			RETURN FALSE;
 		END Push;