浏览代码

Disable call of body of a cell when no body exists (.e.g for engines).

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

+ 23 - 22
source/FoxIntermediateBackend.Mod

@@ -8039,28 +8039,29 @@ TYPE
 					END;
 					
 					(* start *)
-
-					Symbol(temporaryVariable,l); (*Designate(temporaryVariable,l)*)
-					ToMemory(l.op, addressType, 0);
-					Designate(p0,s0);
-					ToMemory(s0.op,addressType,0);
-					Emit(Mov(position,s0.op,l.op));
-					ReleaseOperand(l);
-					ReleaseOperand(s0);
-					result.tag := emptyOperand;					
-					
-					(* push cell *)
-					Symbol(temporaryVariable, l);
-					ToMemory(l.op,addressType,0);
-					Emit(Push(-1,l.op));
-					(* push delegate *)
-					Emit(Push(-1,l.op));
-					ReleaseOperand(l);
-					StaticCallOperand(s1,baseType(SyntaxTree.CellType).cellScope.bodyProcedure);
-					Emit(Push(position, s1.op));
-					ReleaseOperand(s1);
-					
-					CallThis(position,"ActiveCellsRuntime","Start",3);
+					IF baseType(SyntaxTree.CellType).cellScope.bodyProcedure # NIL THEN
+						Symbol(temporaryVariable,l); (*Designate(temporaryVariable,l)*)
+						ToMemory(l.op, addressType, 0);
+						Designate(p0,s0);
+						ToMemory(s0.op,addressType,0);
+						Emit(Mov(position,s0.op,l.op));
+						ReleaseOperand(l);
+						ReleaseOperand(s0);
+						result.tag := emptyOperand;					
+						
+						(* push cell *)
+						Symbol(temporaryVariable, l);
+						ToMemory(l.op,addressType,0);
+						Emit(Push(-1,l.op));
+						(* push delegate *)
+						Emit(Push(-1,l.op));
+						ReleaseOperand(l);
+						StaticCallOperand(s1,baseType(SyntaxTree.CellType).cellScope.bodyProcedure);
+						Emit(Push(position, s1.op));
+						ReleaseOperand(s1);
+						
+						CallThis(position,"ActiveCellsRuntime","Start",3);
+					END;
 
 					(*IF temporaryVariable # NIL THEN
 						end := NewLabel();