about summary refs log tree commit diff
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/lang/compiler/compiler.go16
-rw-r--r--pkg/lang/compiler/compiler_test.go13
2 files changed, 25 insertions, 4 deletions
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