浏览代码

Patched call of Trace.Chara and added Enter and Exit stubs in order to make compilation with --traceModule=Trace work.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6335 8c9fc860-2736-0410-a75d-ab315db34111
felixf 10 年之前
父节点
当前提交
e1eaf92018
共有 2 个文件被更改,包括 22 次插入2 次删除
  1. 14 2
      source/FoxIntermediateBackend.Mod
  2. 8 0
      source/Trace.Mod

+ 14 - 2
source/FoxIntermediateBackend.Mod

@@ -5752,6 +5752,7 @@ TYPE
 		VAR
 			traceModule: SyntaxTree.Module;
 			procedure: SyntaxTree.Procedure;
+			procedureVariable: SyntaxTree.Variable;
 			s,msg: Basic.MessageString;
 			res: Operand;
 			i: LONGINT;
@@ -5766,6 +5767,9 @@ TYPE
 			BEGIN
 				procedure := traceModule.moduleScope.FindProcedure(SyntaxTree.NewIdentifier(procedureName));
 				IF procedure = NIL THEN
+					procedureVariable := traceModule.moduleScope.FindVariable(SyntaxTree.NewIdentifier(procedureName));
+				END;
+				IF (procedure = NIL) & (procedureVariable = NIL) THEN
 					s := "procedure ";
 					Strings.Append(s,backend.traceModuleName);
 					Strings.Append(s,".");
@@ -5779,9 +5783,17 @@ TYPE
 			END GetProcedure;
 
 			PROCEDURE CallProcedure;
+			VAR size: LONGINT;
 			BEGIN
-				StaticCallOperand(result,procedure);
-				Emit(Call(position,result.op,ProcedureParametersSize(system,procedure)));
+				IF procedure # NIL THEN
+					StaticCallOperand(result,procedure);
+					size := ProcedureParametersSize(system,procedure);
+				ELSE
+					Symbol(procedureVariable, result);
+					LoadValue(result, procedureVariable.type.resolved);
+					size := ParametersSize(system, procedureVariable.type.resolved(SyntaxTree.ProcedureType), FALSE);
+				END;
+				Emit(Call(position,result.op,size));
 			END CallProcedure;
 
 			PROCEDURE String(CONST s: ARRAY OF CHAR);

+ 8 - 0
source/Trace.Mod

@@ -8,6 +8,14 @@ VAR
 	Char*: CharProc;
 	Color*: PROCEDURE (c: SHORTINT);
 
+PROCEDURE Enter*;
+BEGIN
+END Enter;
+
+PROCEDURE Exit*;
+BEGIN
+END Exit;
+
 (** Send the specified characters to the trace output (cf. Streams.Sender). *)
 PROCEDURE Send*(CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT);
 BEGIN {UNCOOPERATIVE, UNCHECKED} INC (len, ofs); ASSERT (len <= LEN (buf)); WHILE ofs # len DO Char (buf[ofs]); INC (ofs); END; res := 0;