Ver código fonte

Fixed traversal of external functions

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7330 8c9fc860-2736-0410-a75d-ab315db34111
negelef 7 anos atrás
pai
commit
ff51fc5dab
2 arquivos alterados com 13 adições e 3 exclusões
  1. 12 3
      source/Activities.Mod
  2. 1 0
      source/FoxIntermediateBackend.Mod

+ 12 - 3
source/Activities.Mod

@@ -70,11 +70,20 @@ TYPE Activity* = OBJECT {DISPOSABLE} (Queues.Item)
 	END InitializeActivity;
 
 	PROCEDURE ~Finalize;
-	VAR stackFrame {UNTRACED}: BaseTypes.StackFrame; currentActivity {UNTRACED}: Activity; stack{UNTRACED}, next{UNTRACED}: Stack; stackRecord{UNTRACED}: StackRecord;
+	VAR address: ADDRESS; stackFrame {UNTRACED}: BaseTypes.StackFrame; currentActivity {UNTRACED}: Activity; stack{UNTRACED}, next{UNTRACED}: Stack; stackRecord{UNTRACED}: StackRecord;
 	BEGIN {UNCOOPERATIVE, UNCHECKED}
-		stackFrame := framePointer;
+		address := framePointer;
 		currentActivity := SYSTEM.GetActivity ()(Activity); SYSTEM.SetActivity (SELF);
-		WHILE stackFrame # NIL DO stackFrame.Reset; stackFrame := stackFrame.previous END;
+		WHILE address # NIL DO
+			IF ODD (address) THEN
+				DEC (address);
+				stackFrame := address;
+				stackFrame.Reset;
+			ELSE
+				stackFrame := address - SIZE OF ADDRESS;
+			END;
+			address := stackFrame.previous;
+		END;
 		SYSTEM.SetActivity (currentActivity);
 		stack := firstStack;
 		REPEAT

+ 1 - 0
source/FoxIntermediateBackend.Mod

@@ -1566,6 +1566,7 @@ TYPE
 						Basic.ToSegmentedName ("BaseTypes.StackFrame",name);
 					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