From 851c793da43be9e4d3319afe440d603c85834045 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 31 Aug 2023 17:53:54 +0200 Subject: codegen: fix interpreter re-entrance So multiple successive incremental Evals function correctly. Also improve the following: - Apply the same Eval API to vm0 and vm1 - parser: dot diagram display is now synchronous - codegen: outsource complex code generation for readability - vm1: Pop take the number of values to pop as operand --- vm0/vm.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'vm0/vm.go') diff --git a/vm0/vm.go b/vm0/vm.go index 8d0b49e..e26e20f 100644 --- a/vm0/vm.go +++ b/vm0/vm.go @@ -23,7 +23,7 @@ func New(p *parser.Parser) (i *Interp) { return i } -func (i *Interp) Eval(src string) (err error) { +func (i *Interp) Eval(src string) (res any, err error) { n := &parser.Node{} if n.Child, err = i.Parse(src); err != nil { return @@ -32,7 +32,7 @@ func (i *Interp) Eval(src string) (err error) { n.Dot(os.Getenv("DOT"), "") } for _, nod := range n.Child { - if _, err = i.Run(nod, ""); err != nil { + if err = i.Run(nod, ""); err != nil { break } } @@ -40,7 +40,7 @@ func (i *Interp) Eval(src string) (err error) { } // Run implements a stack based virtual machine which directly walks the AST. -func (i *Interp) Run(node *parser.Node, scope string) (res []any, err error) { +func (i *Interp) Run(node *parser.Node, scope string) (err error) { stop := false node.Walk2(nil, 0, func(n, a *parser.Node, k int) (ok bool) { @@ -129,7 +129,7 @@ func (i *Interp) Run(node *parser.Node, scope string) (res []any, err error) { } return true }) - return nil, nil + return nil } // getSym searches for an existing symbol starting from the deepest scope. -- cgit v1.2.3