commit 2bffe532f21eb6450794553e382da370be2b98de
parent bc0a2b3cd33c6eb6cb07f2e53bc2310779bb63cb
Author: lash <dev@holbrook.no>
Date: Tue, 4 Feb 2025 13:22:33 +0000
Add bytecode guard to exported engine reset
Diffstat:
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/engine/db.go b/engine/db.go
@@ -576,7 +576,7 @@ func (en *DefaultEngine) Flush(ctx context.Context, w io.Writer) (int, error) {
l += n
}
if en.exiting {
- _, err = en.Reset(ctx)
+ _, err = en.reset(ctx)
en.exiting = false
}
@@ -585,6 +585,17 @@ func (en *DefaultEngine) Flush(ctx context.Context, w io.Writer) (int, error) {
// start execution over at top node while keeping current state of client error flags.
func (en *DefaultEngine) Reset(ctx context.Context) (bool, error) {
+ b, err := en.st.GetCode()
+ if err != nil {
+ return false, err
+ }
+ if len(b) > 0 {
+ return false, ErrCodeRemaining
+ }
+ return en.reset(ctx)
+}
+
+func (en *DefaultEngine) reset(ctx context.Context) (bool, error) {
var err error
var isTop bool
logg.DebugCtxf(ctx, "entering engine reset", "state", en.st)
diff --git a/engine/engine.go b/engine/engine.go
@@ -2,9 +2,14 @@ package engine
import (
"context"
+ "fmt"
"io"
)
+var (
+ ErrCodeRemaining = fmt.Errorf("bytecode remaining")
+)
+
// EngineIsh defines the interface for execution engines that handle vm initialization and execution, and rendering outputs.
type Engine interface {
// Init sets the engine up for vm execution. It must be called before Exec.