diff --git a/src/trealla b/src/trealla index 74d0e85..8aeeb27 160000 --- a/src/trealla +++ b/src/trealla @@ -1 +1 @@ -Subproject commit 74d0e853e60b99a1f1258c56fc06e8dad9f5fd2a +Subproject commit 8aeeb27f516d362a231c81e08d2588fe706c1f92 diff --git a/trealla/interop.go b/trealla/interop.go index 8b4ed37..01b3e12 100644 --- a/trealla/interop.go +++ b/trealla/interop.go @@ -94,9 +94,9 @@ func (pl *prolog) hostCall( /*c *wasmtime.Caller,*/ subquery, msgptr, msgsize, r if err := subq.readOutput(); err != nil { return 0, wasmtime.NewTrap(err.Error()) } - if _, err := pl.pl_capture.Call(pl.store, pl.ptr); err != nil { - return 0, wasmtime.NewTrap(err.Error()) - } + // if _, err := pl.pl_capture.Call(pl.store, pl.ptr); err != nil { + // return 0, wasmtime.NewTrap(err.Error()) + // } return wasmTrue, nil } diff --git a/trealla/libtpl.wasm b/trealla/libtpl.wasm index 9adb813..41369dd 100755 Binary files a/trealla/libtpl.wasm and b/trealla/libtpl.wasm differ diff --git a/trealla/prolog.go b/trealla/prolog.go index 0d49f62..b7863bb 100644 --- a/trealla/prolog.go +++ b/trealla/prolog.go @@ -50,16 +50,17 @@ type prolog struct { spawning map[int32]*query limiter chan struct{} - ptr int32 - realloc wasmFunc - free wasmFunc - pl_consult wasmFunc - pl_capture wasmFunc - pl_capture_read wasmFunc - pl_capture_free wasmFunc - pl_query wasmFunc - pl_redo wasmFunc - pl_done wasmFunc + ptr int32 + realloc wasmFunc + free wasmFunc + pl_consult wasmFunc + pl_capture wasmFunc + pl_capture_read wasmFunc + pl_capture_reset wasmFunc + pl_capture_free wasmFunc + pl_query wasmFunc + pl_redo wasmFunc + pl_done wasmFunc procs map[string]Predicate @@ -182,6 +183,11 @@ func (pl *prolog) init(parent *prolog) error { return err } + pl.pl_capture_reset, err = pl.function("pl_capture_reset") + if err != nil { + return err + } + pl.pl_capture_free, err = pl.function("pl_capture_free") if err != nil { return err @@ -261,6 +267,11 @@ func (pl *prolog) init(parent *prolog) error { } pl.ptr = ptr.(int32) + _, err = pl.pl_capture.Call(pl.store, pl.ptr) + if err != nil { + return err + } + if err := pl.loadBuiltins(); err != nil { return fmt.Errorf("trealla: failed to load builtins: %w", err) } diff --git a/trealla/query.go b/trealla/query.go index 22b9712..5c374e6 100644 --- a/trealla/query.go +++ b/trealla/query.go @@ -116,6 +116,7 @@ func (q *query) readOutput() error { if err != nil { return err } + defer pl.pl_capture_reset.Call(pl.store, pl.ptr) stdoutlen := pl.indirect(q.stdoutlen) stdoutptr := pl.indirect(q.stdoutptr) @@ -134,7 +135,7 @@ func (q *query) readOutput() error { } q.stderr.WriteString(stderr) - pl.pl_capture_free.Call(pl.store, pl.ptr) + // pl.pl_capture_free.Call(pl.store, pl.ptr) return nil } @@ -208,11 +209,6 @@ func (pl *prolog) start(ctx context.Context, goal string, options ...QueryOption ch <- fmt.Errorf("trealla: panic: %v", ex) } }() - _, err := pl.pl_capture.Call(pl.store, pl.ptr) - if err != nil { - ch <- err - return - } v, err := pl.pl_query.Call(pl.store, pl.ptr, goalstr.ptr, subqptr, 0) if err == nil { @@ -294,12 +290,6 @@ func (q *query) redo(ctx context.Context) bool { } }() - _, err := pl.pl_capture.Call(pl.store, pl.ptr) - if err != nil { - ch <- err - return - } - v, err := pl.pl_redo.Call(pl.store, q.subquery) if err == nil { ret = v.(int32)