about summary refs log tree commit diff
path: root/pkg/lang/vm/vm.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/vm.go')
-rw-r--r--pkg/lang/vm/vm.go23
1 files changed, 20 insertions, 3 deletions
diff --git a/pkg/lang/vm/vm.go b/pkg/lang/vm/vm.go
index 0de8fb9..8fdc0d5 100644
--- a/pkg/lang/vm/vm.go
+++ b/pkg/lang/vm/vm.go
@@ -89,6 +89,9 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 	case code.OpPushObject:
 		panic("not implemented")
 
+	case code.OpDrop:
+		_, err = vm.stack.Top().Pop()
+
 	case code.OpGetGlobal:
 		panic("not implemented")
 	case code.OpGetLocal:
@@ -98,6 +101,8 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 		err = vm.execGetLocal(int(offset))
 	case code.OpGetMember:
 		panic("not implemented")
+	case code.OpGetMethod:
+		panic("not implemented")
 	case code.OpGetArg:
 		vm.execGetArg()
 	case code.OpGetEnv:
@@ -109,18 +114,30 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 		err = vm.execSub()
 	case code.OpIndex:
 		err = vm.execIndex()
+	case code.OpLte:
+		err = vm.execLte()
 	case code.OpCall:
 		panic("not implemented")
 
 	case code.OpJmp:
 		pc, _ := vm.code.GetUint(vm.pc)
 		vm.pc = int(pc)
-	case code.OpJez:
-		panic("not implemented")
-
+	case code.OpJt:
+		pc, advance := vm.code.GetUint(vm.pc)
+		vm.pc += advance
+		err = vm.execJumpIf(int(pc), true)
+	case code.OpJf:
+		pc, advance := vm.code.GetUint(vm.pc)
+		vm.pc += advance
+		err = vm.execJumpIf(int(pc), false)
 	case code.OpRet:
 		panic("not implemented")
 
+	case code.OpTempArrLen:
+		err = vm.execTempArrLen()
+	case code.OpTempArrPush:
+		err = vm.execTempArrPush()
+
 	default:
 		err = ErrInvalidOp{Op: uint8(op)}
 	}