From 32ec3e1186b3ed29e910ad60a18f956b823ddc23 Mon Sep 17 00:00:00 2001 From: Mel Date: Wed, 6 Jul 2022 02:05:58 +0200 Subject: Increment hidden i variable in ForIn code --- pkg/lang/compiler/compiler.go | 16 ++++++++++++++++ pkg/lang/compiler/compiler_test.go | 13 +++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'pkg/lang') diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go index 3a5efd9..c51728f 100644 --- a/pkg/lang/compiler/compiler.go +++ b/pkg/lang/compiler/compiler.go @@ -204,6 +204,11 @@ func (comp *Compiler) compileForInStmt(t *code.Builder, forInStmt ast.StmtForIn) // get_local 1 // index // set_local 2 + + // get_local 1 + // push_int 1 + // add + // set_local 1 // 3. Do block // ... // 4. Repeat jump: @@ -259,6 +264,17 @@ func (comp *Compiler) compileForInStmt(t *code.Builder, forInStmt ast.StmtForIn) doPreparationTarget.AppendOp(code.OpSetLocal) doPreparationTarget.AppendInt(int64(nameLocal)) + doPreparationTarget.AppendOp(code.OpGetLocal) + doPreparationTarget.AppendInt(int64(iLocal)) + + doPreparationTarget.AppendOp(code.OpPushInt) + doPreparationTarget.AppendInt(1) + + doPreparationTarget.AppendOp(code.OpAdd) + + doPreparationTarget.AppendOp(code.OpSetLocal) + doPreparationTarget.AppendInt(int64(iLocal)) + // Do block doTarget := code.NewBuilder() if err := comp.compileBlockNode(&doTarget, forInStmt.Do); err != nil { diff --git a/pkg/lang/compiler/compiler_test.go b/pkg/lang/compiler/compiler_test.go index 326ad68..f3a20a5 100644 --- a/pkg/lang/compiler/compiler_test.go +++ b/pkg/lang/compiler/compiler_test.go @@ -302,17 +302,17 @@ func TestForIn(t *testing.T) { push_array get_local 0 - get_member "$push" + get_member "push" push_int 1 call 1 get_local 0 - get_member "$push" + get_member "push" push_int 2 call 1 get_local 0 - get_member "$push" + get_member "push" push_int 3 call 1 @@ -322,7 +322,7 @@ func TestForIn(t *testing.T) { @check: get_local 1 get_local 0 - get_member "$length" + get_member "length" call 0 lt @@ -333,6 +333,11 @@ func TestForIn(t *testing.T) { index set_local 2 + get_local 1 + push_int 1 + add + set_local 1 + push_string "say" get_local 2 call 1 -- cgit 1.4.1