Forráskód Böngészése

Push immediate as descriptor of callback procedures (C-calling convention)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8493 8c9fc860-2736-0410-a75d-ab315db34111
negelef 6 éve
szülő
commit
453b5d18b8
1 módosított fájl, 11 hozzáadás és 7 törlés
  1. 11 7
      source/FoxIntermediateBackend.Mod

+ 11 - 7
source/FoxIntermediateBackend.Mod

@@ -1567,15 +1567,19 @@ TYPE
 				END;
 
 				IF backend.cooperative THEN
-					IF (procedure # NIL) & (HasPointers (procedure.procedureScope) OR HasVariableParameters (procedure.procedureScope) OR IsNested (procedure)) THEN
-						GetCodeSectionNameForSymbol(procedure, name);
-						Basic.SuffixSegmentedName (name, Basic.MakeString ("@StackDescriptor"));
+					IF callconv IN {SyntaxTree.WinAPICallingConvention, SyntaxTree.CCallingConvention} THEN
+						Emit(Push(Basic.invalidPosition, one)) ;
 					ELSE
-						Basic.ToSegmentedName ("BaseTypes.StackFrame",name);
+						IF (procedure # NIL) & (HasPointers (procedure.procedureScope) OR HasVariableParameters (procedure.procedureScope) OR IsNested (procedure)) THEN
+							GetCodeSectionNameForSymbol(procedure, name);
+							Basic.SuffixSegmentedName (name, Basic.MakeString ("@StackDescriptor"));
+						ELSE
+							Basic.ToSegmentedName ("BaseTypes.StackFrame",name);
+						END;
+						IntermediateCode.InitAddress(op1, addressType, name , 0, 0);
+						IntermediateCode.AddOffset(op1, 1);
+						Emit(Push(Basic.invalidPosition,op1));
 					END;
-					IntermediateCode.InitAddress(op1, addressType, name , 0, 0);
-					IntermediateCode.AddOffset(op1, 1);
-					Emit(Push(Basic.invalidPosition,op1));
 					Emit(Mov(Basic.invalidPosition,fp, sp));
 					IF (body # NIL) & (body.code = NIL) & ~procedure.procedureScope.body.isUnchecked THEN
 						NEW(call, section);