summaryrefslogtreecommitdiff
path: root/codegen/interpreter.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-08-29 18:22:13 +0200
committerMarc Vertes <mvertes@free.fr>2023-08-29 18:22:13 +0200
commit0f4bfe6e70263fbeb580014b62632f403b29b414 (patch)
treede750b60a6c0027b36accf9f0596c3e651309cda /codegen/interpreter.go
parenta3ab9ef5be74cb54a87674aa48abb0c46f9c58f6 (diff)
gint: add an interactive REPL
Diffstat (limited to 'codegen/interpreter.go')
-rw-r--r--codegen/interpreter.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/codegen/interpreter.go b/codegen/interpreter.go
index 8527631..b26b403 100644
--- a/codegen/interpreter.go
+++ b/codegen/interpreter.go
@@ -27,12 +27,21 @@ func (i *Interpreter) Eval(src string) (err error) {
if debug {
n.Dot(os.Getenv("DOT"), "")
}
+ offset := len(i.Code)
+ i.PopExit() // Remove last exit from previous run.
if err = i.CodeGen(n); err != nil {
return err
}
- i.Emit(n, vm1.Exit)
i.Push(i.Data...)
- i.PushCode(i.Code)
- i.SetIP(i.Entry)
+ i.PushCode(i.Code[offset:]...)
+ i.PushCode([]int64{0, vm1.Exit})
+ i.SetIP(max(offset, i.Entry))
return i.Run()
}
+
+func max(a, b int) int {
+ if a > b {
+ return a
+ }
+ return b
+}