Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 2893b80

Browse files
Use a temporary reg when generating repeat for each bytecode
This avoids problems with stale or unpredicable data being in the register and being passed to iterators as the wrong type.
1 parent 9fa7248 commit 2893b80

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

toolchain/lc-compile/src/generate.g

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,18 @@
871871
'rule' DestroyParameterRegisters(nil):
872872
-- nothing
873873
874+
'action' RemoveIndexFromInvokeSignature(INVOKESIGNATURE, INT -> INVOKESIGNATURE)
875+
876+
'rule' RemoveIndexFromInvokeSignature(invokesignature(_, Index, Remaining), RemoveIndex -> Remaining):
877+
eq(Index, RemoveIndex)
878+
879+
'rule' RemoveIndexFromInvokeSignature(invokesignature(Mode, Index, Tail), RemoveIndex -> ChangedSig):
880+
RemoveIndexFromInvokeSignature(Tail, RemoveIndex -> ChangedTail)
881+
where(invokesignature(Mode, Index, ChangedTail) -> ChangedSig)
882+
883+
'rule' RemoveIndexFromInvokeSignature(nil, _ -> nil):
884+
885+
874886
'sweep' DestroyVariableRegisters(ANY)
875887
876888
'rule' DestroyVariableRegisters(STATEMENT'variable(_, Id, _)):
@@ -1081,21 +1093,34 @@
10811093
10821094
EmitPosition(Position)
10831095
EmitCreateRegister(-> IteratorReg)
1096+
EmitCreateRegister(-> IterationVarTempReg)
10841097
EmitAssignUndefined(IteratorReg)
1098+
EmitAssignUndefined(IterationVarTempReg)
10851099
GenerateExpression(Result, Context, Container -> TargetReg)
1086-
1087-
EmitResolveLabel(RepeatHead)
1100+
1101+
-- Remove the variable of iteration from the argument list as a
1102+
-- temporary will be used in the invoke
10881103
GenerateDefinitionGroupForInvokes(IteratorInvokes, iterate, Arguments -> Index, Signature)
1089-
GenerateInvoke_EvaluateArguments(Result, Context, Signature, Arguments)
1104+
RemoveIndexFromInvokeSignature(Signature, 0 -> RemainingSignature)
1105+
where(Arguments -> expressionlist(IterationVar, RemainingArgs))
1106+
1107+
EmitResolveLabel(RepeatHead)
1108+
GenerateInvoke_EvaluateArgumentForOut(Result, Context, IterationVar)
1109+
GenerateInvoke_EvaluateArguments(Result, Context, RemainingSignature, RemainingArgs)
10901110
EmitCreateRegister(-> ContinueReg)
10911111
EmitBeginInvoke(Index, Context, ContinueReg)
10921112
EmitContinueInvoke(IteratorReg)
1093-
GenerateInvoke_EmitInvokeArguments(Arguments)
1113+
EmitContinueInvoke(IterationVarTempReg)
1114+
GenerateInvoke_EmitInvokeArguments(RemainingArgs)
10941115
EmitContinueInvoke(TargetReg)
10951116
EmitEndInvoke()
10961117
10971118
EmitJumpIfFalse(ContinueReg, RepeatTail)
1098-
1119+
1120+
-- Iteration successful, copy the temporary iteration var into its place
1121+
EmitGetRegisterAttachedToExpression(IterationVar -> IterationVarReg)
1122+
EmitAssign(IterationVarReg, IterationVarTempReg)
1123+
10991124
GenerateInvoke_AssignArguments(Result, Context, Signature, Arguments)
11001125
GenerateInvoke_FreeArguments(Arguments)
11011126

0 commit comments

Comments
 (0)