瀏覽代碼

Patched Trace of String parameters
Patched Section name

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6913 8c9fc860-2736-0410-a75d-ab315db34111

felixf 8 年之前
父節點
當前提交
69c6db7586
共有 1 個文件被更改,包括 10 次插入7 次删除
  1. 10 7
      source/FoxIntermediateBackend.Mod

+ 10 - 7
source/FoxIntermediateBackend.Mod

@@ -3110,11 +3110,11 @@ TYPE
 
 		BEGIN
 			type := type.resolved;
-			IF IsOpenArray(type)  THEN
+			IF IsOpenArray(type)   THEN
 				ASSERT(tag.mode # IntermediateCode.ModeImmediate);
 				RETURN  GetLength(type.resolved(SyntaxTree.ArrayType),0)
 			ELSE
-				RETURN IntermediateCode.Immediate(addressType,1)
+				RETURN IntermediateCode.Immediate(addressType,StaticArrayNumElements(type))
 			END;
 		END GetArrayLength;
 		
@@ -6335,11 +6335,14 @@ TYPE
 				END;
 			END Address;
 
-			PROCEDURE StringOperand(op,tag: IntermediateCode.Operand);
+			PROCEDURE StringOperand(op: Operand; type: SyntaxTree.Type);
+			VAR len: IntermediateCode.Operand;
 			BEGIN
 				IF GetProcedure("String") THEN
-					Emit(Push(position,tag));
-					Emit(Push(position,op));
+					len := GetArrayLength(type, op.tag);
+					Emit(Push(position,len));
+					ReleaseIntermediateOperand(len);
+					Emit(Push(position,op.op));
 					CallProcedure;
 				END;
 			END StringOperand;
@@ -6385,7 +6388,7 @@ TYPE
 					String(msg);
 					IF SemanticChecker.IsStringType(expression.type) THEN
 						Designate(expression,res);
-						StringOperand(res.op,res.tag);
+						StringOperand(res, expression.type);
 					ELSE
 						Evaluate(expression,res);
 						IF expression.type.resolved IS SyntaxTree.IntegerType THEN
@@ -11060,7 +11063,7 @@ TYPE
 			IF ReflectionSupport &  implementationVisitor.newObjectFile & ~simple & ~implementationVisitor.backend.cooperative THEN 
 				NEW(moduleNamePool, 32);
 				(*! require GC protection *)
-				modulePointerSection := Block("Heaps","ArrayBlockDesc","@ModulePointerArray", modulePointerSectionOffset);
+				modulePointerSection := Block("Heaps","ArrayBlockDesc",".@ModulePointerArray", modulePointerSectionOffset);
 				name := "Heaps.AnyPtr";
 				offset := ToMemoryUnits(module.system,TypeRecordBaseOffset*module.system.addressSize);
 				(* set base pointer *)