diff options
| author | Mel <einebeere@gmail.com> | 2022-05-27 00:09:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 00:09:27 +0000 |
| commit | c2d4bf51de9a2d721168c62b14b89f5281ed366e (patch) | |
| tree | 09329cd24249e46fe6660fa9bd1f0efac29af38f /pkg/lang/vm/vm.go | |
| parent | 3f4efe745a0404953266476ec52db54b182de2f8 (diff) | |
| download | jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.tar.zst jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.zip | |
VM ARC
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() +} |
