|
871 | 871 | 'rule' DestroyParameterRegisters(nil): |
872 | 872 | -- nothing |
873 | 873 |
|
| 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 | +
|
874 | 886 | 'sweep' DestroyVariableRegisters(ANY) |
875 | 887 |
|
876 | 888 | 'rule' DestroyVariableRegisters(STATEMENT'variable(_, Id, _)): |
|
1081 | 1093 | |
1082 | 1094 | EmitPosition(Position) |
1083 | 1095 | EmitCreateRegister(-> IteratorReg) |
| 1096 | + EmitCreateRegister(-> IterationVarTempReg) |
1084 | 1097 | EmitAssignUndefined(IteratorReg) |
| 1098 | + EmitAssignUndefined(IterationVarTempReg) |
1085 | 1099 | 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 |
1088 | 1103 | 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) |
1090 | 1110 | EmitCreateRegister(-> ContinueReg) |
1091 | 1111 | EmitBeginInvoke(Index, Context, ContinueReg) |
1092 | 1112 | EmitContinueInvoke(IteratorReg) |
1093 | | - GenerateInvoke_EmitInvokeArguments(Arguments) |
| 1113 | + EmitContinueInvoke(IterationVarTempReg) |
| 1114 | + GenerateInvoke_EmitInvokeArguments(RemainingArgs) |
1094 | 1115 | EmitContinueInvoke(TargetReg) |
1095 | 1116 | EmitEndInvoke() |
1096 | 1117 |
|
1097 | 1118 | 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 | +
|
1099 | 1124 | GenerateInvoke_AssignArguments(Result, Context, Signature, Arguments) |
1100 | 1125 | GenerateInvoke_FreeArguments(Arguments) |
1101 | 1126 | |
|
0 commit comments