|
@@ -3003,7 +3003,7 @@ TYPE
|
|
|
|
|
|
|
|
|
|
PROCEDURE ResetVariables (scope: SyntaxTree.ProcedureScope);
|
|
PROCEDURE ResetVariables (scope: SyntaxTree.ProcedureScope);
|
|
- VAR variable: SyntaxTree.Variable; parameter: SyntaxTree.Parameter; previousScope: SyntaxTree.Scope; pc: LONGINT;
|
|
|
|
|
|
+ VAR variable: SyntaxTree.Variable; parameter: SyntaxTree.Parameter; previousScope: SyntaxTree.Scope; prevOffset: SIZE; pc: LONGINT;
|
|
|
|
|
|
PROCEDURE Reset (symbol: SyntaxTree.Symbol);
|
|
PROCEDURE Reset (symbol: SyntaxTree.Symbol);
|
|
VAR operand: Operand;
|
|
VAR operand: Operand;
|
|
@@ -3017,16 +3017,18 @@ TYPE
|
|
previousScope := currentScope;
|
|
previousScope := currentScope;
|
|
currentScope := scope;
|
|
currentScope := scope;
|
|
pc := section.pc;
|
|
pc := section.pc;
|
|
|
|
+ prevOffset := MAX(SIZE);
|
|
variable := scope.firstVariable;
|
|
variable := scope.firstVariable;
|
|
WHILE variable # NIL DO
|
|
WHILE variable # NIL DO
|
|
- IF variable.NeedsTrace() THEN
|
|
|
|
|
|
+ IF variable.NeedsTrace() & (variable.offsetInBits # prevOffset) (* multiple temporaries *) THEN
|
|
Reset (variable);
|
|
Reset (variable);
|
|
|
|
+ prevOffset := variable.offsetInBits;
|
|
END;
|
|
END;
|
|
variable := variable.nextVariable;
|
|
variable := variable.nextVariable;
|
|
END;
|
|
END;
|
|
parameter := scope.ownerProcedure.type(SyntaxTree.ProcedureType).firstParameter;
|
|
parameter := scope.ownerProcedure.type(SyntaxTree.ProcedureType).firstParameter;
|
|
WHILE parameter # NIL DO
|
|
WHILE parameter # NIL DO
|
|
- IF parameter.NeedsTrace() & ~IsVariableParameter(parameter) & (parameter.kind # SyntaxTree.ConstParameter) THEN
|
|
|
|
|
|
+ IF parameter.NeedsTrace() & ~IsVariableParameter(parameter) & (parameter.kind # SyntaxTree.ConstParameter) THEN
|
|
Reset (parameter);
|
|
Reset (parameter);
|
|
END;
|
|
END;
|
|
parameter := parameter.nextParameter;
|
|
parameter := parameter.nextParameter;
|
|
@@ -6875,7 +6877,13 @@ TYPE
|
|
Assign(reference,variable.initializer);
|
|
Assign(reference,variable.initializer);
|
|
ELSIF temporary THEN
|
|
ELSIF temporary THEN
|
|
IF SemanticChecker.IsPointerType(variable.type) THEN
|
|
IF SemanticChecker.IsPointerType(variable.type) THEN
|
|
- IF backend.writeBarriers THEN
|
|
|
|
|
|
+ IF backend.cooperative THEN
|
|
|
|
+ SaveRegisters();ReleaseUsedRegisters(saved);
|
|
|
|
+ Symbol(variable, operand);
|
|
|
|
+ CallAssignPointer(operand.op, nil);
|
|
|
|
+ ReleaseOperand(operand);
|
|
|
|
+ RestoreRegisters(saved);
|
|
|
|
+ ELSIF backend.writeBarriers THEN
|
|
SaveRegisters();ReleaseUsedRegisters(saved);
|
|
SaveRegisters();ReleaseUsedRegisters(saved);
|
|
Symbol(variable, operand);
|
|
Symbol(variable, operand);
|
|
Emit(Push(position,operand.op));
|
|
Emit(Push(position,operand.op));
|
|
@@ -7171,7 +7179,7 @@ TYPE
|
|
END;
|
|
END;
|
|
scope := currentScope;
|
|
scope := currentScope;
|
|
(*
|
|
(*
|
|
- variable := NIL; (* disable free variable managemenet for the time being -- does not work *)
|
|
|
|
|
|
+ v := NIL; (* disable free variable managemenet for the time being *)
|
|
*)
|
|
*)
|
|
name := temporaries.GetUID();
|
|
name := temporaries.GetUID();
|
|
|
|
|