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.go40
1 files changed, 32 insertions, 8 deletions
diff --git a/pkg/lang/vm/vm.go b/pkg/lang/vm/vm.go
index dfe1ae2..d896d88 100644
--- a/pkg/lang/vm/vm.go
+++ b/pkg/lang/vm/vm.go
@@ -1,21 +1,24 @@
 package vm
 
 import (
-	"fmt"
 	"jinx/pkg/lang/vm/code"
+	"jinx/pkg/lang/vm/mem"
+	"jinx/pkg/lang/vm/value"
 )
 
 type VM struct {
-	code  *code.Code
-	pc    int
-	stack Stack
+	code   *code.Code
+	pc     int
+	stack  Stack
+	memory mem.Mem
 }
 
 func New(code *code.Code) *VM {
 	return &VM{
-		code:  code,
-		pc:    0,
-		stack: NewStack(),
+		code:   code,
+		pc:     0,
+		stack:  NewStack(),
+		memory: mem.New(),
 	}
 }
 
@@ -25,7 +28,8 @@ func (vm *VM) GetResult() (string, error) {
 		return "", err
 	}
 
-	return fmt.Sprintf("%v", res.Data()), nil
+	str := res.Data().String(&vm.memory)
+	return str, nil
 }
 
 func (vm *VM) Run() error {
@@ -150,3 +154,23 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 
 	return stepDecisionContinue, err
 }
+
+func (vm *VM) popAndDrop() (value.Value, error) {
+	v, err := vm.stack.Pop()
+	if err != nil {
+		return value.Value{}, err
+	}
+	v.Drop(&vm.memory)
+	return v, nil
+}
+
+func (vm *VM) popCallAndDrop() (int, error) {
+	for !vm.stack.ReachedBaseOfCall() {
+		_, err := vm.popAndDrop()
+		if err != nil {
+			return 0, err
+		}
+	}
+
+	return vm.stack.PopCall()
+}