2
0
Эх сурвалжийг харах

Disabled stack expansion in unchecked blocks

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6378 8c9fc860-2736-0410-a75d-ab315db34111
eth.negelef 9 жил өмнө
parent
commit
b256bbb2a1

+ 20 - 19
source/FoxIntermediateBackend.Mod

@@ -1358,25 +1358,26 @@ TYPE
 				IntermediateCode.InitAddress(op1, addressType, name , 0, 0);
 				IntermediateCode.InitAddress(op1, addressType, name , 0, 0);
 				Emit(Push(-1,op1));
 				Emit(Push(-1,op1));
 				Emit(Mov(-1,fp, sp));
 				Emit(Mov(-1,fp, sp));
-				
-				NEW(call, section);
-				NEW(nocall, section);
-				reg := NewRegisterOperand(addressType);
-				IntermediateCode.InitImmediate(op1,addressType, varSize);
-				Emit(Sub(-1,reg, sp, op1));
-				BrltL(call, sp, reg);
-				IntermediateCode.InitMemory(op2, addressType,ap,ToMemoryUnits(system,system.addressSize*10));
-				BrgeL(nocall, sp, op2);
-				call.Resolve(section.pc);
-				parametersSize := ProcedureParametersSize(backend.system,procedure);
-				IntermediateCode.InitImmediate(op2,addressType, parametersSize);
-				Emit(Push(-1, op2));
-				Emit(Push(-1, reg));
-				ReleaseIntermediateOperand(reg);
-				CallThis(position, "Activities","ExpandStack",0);
-				Emit(Result(-1, sp));
-				ReleaseIntermediateOperand(reg);
-				nocall.Resolve(section.pc);
+				IF (procedure.procedureScope.body = NIL) OR ~procedure.procedureScope.body.isUnchecked THEN
+					NEW(call, section);
+					NEW(nocall, section);
+					reg := NewRegisterOperand(addressType);
+					IntermediateCode.InitImmediate(op1,addressType, varSize);
+					Emit(Sub(-1,reg, sp, op1));
+					BrltL(call, sp, reg);
+					IntermediateCode.InitMemory(op2, addressType,ap,ToMemoryUnits(system,system.addressSize*10));
+					BrgeL(nocall, sp, op2);
+					call.Resolve(section.pc);
+					parametersSize := ProcedureParametersSize(backend.system,procedure);
+					IntermediateCode.InitImmediate(op2,addressType, parametersSize);
+					Emit(Push(-1, op2));
+					Emit(Push(-1, reg));
+					ReleaseIntermediateOperand(reg);
+					CallThis(position, "Activities","ExpandStack",0);
+					Emit(Result(-1, sp));
+					ReleaseIntermediateOperand(reg);
+					nocall.Resolve(section.pc);
+				END;
 			ELSE
 			ELSE
 				Emit(Mov(-1, fp, sp));
 				Emit(Mov(-1, fp, sp));
 			END;
 			END;