diff options
Diffstat (limited to 'pkg/lang/vm/vm.go')
| -rw-r--r-- | pkg/lang/vm/vm.go | 40 |
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() +} |
