commit 1da16595e726192646d6b24b8142fe1f1f6d4200
parent b28303433f177811a5b813bd59cd08b1be1f2415
Author: lash <dev@holbrook.no>
Date: Fri, 20 Dec 2024 08:32:23 +0000
Rehabilitate vm parse, export rewind vm state
Diffstat:
9 files changed, 79 insertions(+), 45 deletions(-)
diff --git a/asm/asm_test.go b/asm/asm_test.go
@@ -163,7 +163,8 @@ func TestParserInit(t *testing.T) {
b = vm.NewLine(b, vm.INCMP, []string{"pinky", "inky"}, nil, nil)
b = vm.NewLine(b, vm.LOAD, []string{"foo"}, []byte{42}, nil)
b = vm.NewLine(b, vm.MOUT, []string{"bar", "barbarbaz"}, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
n, err := Parse(s, nil)
@@ -178,7 +179,8 @@ func TestParserInit(t *testing.T) {
func TestParserSized(t *testing.T) {
var b []byte
b = vm.NewLine(b, vm.LOAD, []string{"foo"}, []byte{42}, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -198,7 +200,8 @@ func TestParserSized(t *testing.T) {
func TestParseDisplay(t *testing.T) {
var b []byte
b = vm.NewLine(b, vm.MOUT, []string{"foo", "baz_ba_zbaz"}, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -220,7 +223,8 @@ func TestParseDouble(t *testing.T) {
t.Skip("foo")
var b []byte
b = vm.NewLine(b, vm.INCMP, []string{"foo", "bar"}, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -286,7 +290,8 @@ func TestParseMenuZeroPrefix(t *testing.T) {
func TestParseSingle(t *testing.T) {
var b []byte
b = vm.NewLine(b, vm.MAP, []string{"xyzzy"}, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -306,7 +311,8 @@ func TestParseSingle(t *testing.T) {
func TestParseSig(t *testing.T) {
b := vm.NewLine(nil, vm.CATCH, []string{"plugh"}, []byte{0x02, 0x9a}, []uint8{0x2a})
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -328,7 +334,7 @@ func TestParseSig(t *testing.T) {
}
b = vm.NewLine(nil, vm.CATCH, []string{"plugh"}, []byte{0x01}, []uint8{0x0})
- s, err = vm.ToString(b)
+ s, err = ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r = bytes.NewBuffer(nil)
@@ -362,8 +368,9 @@ func TestParseCroak(t *testing.T) {
func TestParseNoarg(t *testing.T) {
var b []byte
+ ph := vm.NewParseHandler().WithDefaultHandlers()
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
- s, err := vm.ToString(b)
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -388,7 +395,8 @@ func TestParserWriteMultiple(t *testing.T) {
b = vm.NewLine(b, vm.INCMP, []string{"pinky", "inky"}, nil, nil)
b = vm.NewLine(b, vm.LOAD, []string{"foo"}, []byte{42}, nil)
b = vm.NewLine(b, vm.MOUT, []string{"bar", "bar_barb_az"}, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s\n", s)
r := bytes.NewBuffer(nil)
@@ -413,7 +421,7 @@ func TestParserWriteMultiple(t *testing.T) {
t.Fatalf("expected result:\n\t%v, got:\n\t%x", r_expect_hex, rb)
}
- _, err = vm.ParseAll(rb, nil)
+ _, err = ph.ParseAll(rb)
if err != nil {
t.Fatal(err)
}
@@ -425,7 +433,8 @@ func TestParserCapQuote(t *testing.T) {
b = vm.NewLine(b, vm.MOUT, []string{"b", "Bar"}, nil, nil)
b = vm.NewLine(b, vm.MOUT, []string{"c", "baz"}, nil, nil)
b = vm.NewLine(b, vm.MSINK, nil, nil, nil)
- s, err := vm.ToString(b)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ s, err := ph.ToString(b)
log.Printf("parsing:\n%s", s)
r := bytes.NewBuffer(nil)
diff --git a/asm/menu_test.go b/asm/menu_test.go
@@ -9,6 +9,7 @@ import (
func TestMenuInterpreter(t *testing.T) {
m := NewMenuProcessor()
+ ph := vm.NewParseHandler().WithDefaultHandlers()
err := m.Add("DOWN", "0", "inky", "foo")
if err != nil {
t.Fatal(err)
@@ -30,7 +31,7 @@ func TestMenuInterpreter(t *testing.T) {
t.Errorf("expected error on invalid menu item 'BOGUS'")
}
b := m.ToLines()
- r, err := vm.ToString(b)
+ r, err := ph.ToString(b)
if err != nil {
t.Fatal(err)
}
diff --git a/debug/node.go b/debug/node.go
@@ -32,3 +32,7 @@ func (n *Node) Connect(peer Node) bool {
n.conn = append(n.conn, peer.Name)
return true
}
+
+func (n *Node) String() string {
+ return n.Name
+}
diff --git a/dev/disasm/main.go b/dev/disasm/main.go
@@ -18,7 +18,8 @@ func main() {
fmt.Fprintf(os.Stderr, "read error: %v", err)
os.Exit(1)
}
- r, err := vm.ToString(v)
+ ph := vm.NewParseHandler().WithDefaultHandlers()
+ r, err := ph.ToString(v)
if err != nil {
fmt.Fprintf(os.Stderr, "parse error: %v", err)
os.Exit(1)
diff --git a/dev/walk/main.go b/dev/walk/main.go
@@ -6,12 +6,17 @@ import (
"fmt"
"os"
- "git.defalsify.org/vise.git/vm"
+ "git.defalsify.org/vise.git/debug"
"git.defalsify.org/vise.git/resource"
+ "git.defalsify.org/vise.git/logging"
fsdb "git.defalsify.org/vise.git/db/fs"
)
+var (
+ logg = logging.NewVanilla()
+)
+
func main() {
var dir string
var root string
@@ -32,7 +37,8 @@ func main() {
rs := resource.NewDbResource(rsStore)
//rs = rs.With(db.DATATYPE_STATICLOAD)
- ph := vm.NewParseHandler().WithDefaultHandlers().WithWriter(os.Stdout)
+ //ph := vm.NewParseHandler().WithDefaultHandlers().WithWriter(os.Stdout)
+ ph := debug.NewNodeParseHandler("root").WithWriter(os.Stdout)
b, err := rs.GetCode(ctx, root)
if err != nil {
diff --git a/vm/debug.go b/vm/debug.go
@@ -226,12 +226,12 @@ func (ph *ParseHandler) ParseAll(b []byte) (int, error) {
}
case HALT:
b, err = ParseHalt(b)
- if err != nil {
+ if err == nil {
err = ph.Halt()
}
case MSINK:
b, err = ParseMSink(b)
- if err != nil {
+ if err == nil {
err = ph.MSink()
}
case MOUT:
diff --git a/vm/debug_test.go b/vm/debug_test.go
@@ -11,8 +11,9 @@ func TestToString(t *testing.T) {
var expect string
var err error
+ ph := NewParseHandler().WithDefaultHandlers()
b = NewLine(nil, CATCH, []string{"xyzzy"}, []byte{0x0d}, []uint8{1})
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -22,7 +23,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, CROAK, nil, []byte{0x0d}, []uint8{1})
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -32,7 +33,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, LOAD, []string{"foo"}, []byte{0x0a}, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -42,7 +43,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, RELOAD, []string{"bar"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -52,7 +53,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MAP, []string{"inky_pinky"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -62,7 +63,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MOVE, []string{"blinky_clyde"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -72,7 +73,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, HALT, nil, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -82,7 +83,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, INCMP, []string{"13", "baz"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -92,7 +93,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MNEXT, []string{"11", "nextmenu"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -103,7 +104,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MPREV, []string{"222", "previous menu item"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -114,7 +115,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MOUT, []string{"1", "foo"}, nil, nil)
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -125,7 +126,7 @@ func TestToString(t *testing.T) {
}
b = NewLine(nil, MSINK, nil, nil, nil) //[]uint8{0x42, 0x2a})
- r, err = ToString(b)
+ r, err = ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -137,12 +138,13 @@ func TestToString(t *testing.T) {
}
func TestToStringMultiple(t *testing.T) {
+ ph := NewParseHandler().WithDefaultHandlers()
b := NewLine(nil, INCMP, []string{"1", "foo"}, nil, nil)
b = NewLine(b, INCMP, []string{"2", "bar"}, nil, nil)
b = NewLine(b, CATCH, []string{"aiee"}, []byte{0x02, 0x9a}, []uint8{0})
b = NewLine(b, LOAD, []string{"inky"}, []byte{0x2a}, nil)
b = NewLine(b, HALT, nil, nil, nil)
- r, err := ToString(b)
+ r, err := ph.ToString(b)
if err != nil {
t.Fatal(err)
}
@@ -158,12 +160,13 @@ HALT
}
func TestVerifyMultiple(t *testing.T) {
+ ph := NewParseHandler().WithDefaultHandlers()
b := NewLine(nil, INCMP, []string{"1", "foo"}, nil, nil)
b = NewLine(b, INCMP, []string{"2", "bar"}, nil, nil)
b = NewLine(b, CATCH, []string{"aiee"}, []byte{0x02, 0x9a}, []uint8{0})
b = NewLine(b, LOAD, []string{"inky"}, []byte{0x2a}, nil)
b = NewLine(b, HALT, nil, nil, nil)
- n, err := ParseAll(b, nil)
+ n, err := ph.ParseAll(b)
if err != nil {
t.Fatal(err)
}
diff --git a/vm/input.go b/vm/input.go
@@ -163,20 +163,9 @@ func applyTarget(target []byte, st *state.State, ca cache.Memory, ctx context.Co
return sym, idx, err
}
case "^":
- notTop := true
- for notTop {
- notTop, err := st.Top()
- if notTop {
- break
- }
- sym, err = st.Up()
- if err != nil {
- return sym, idx, err
- }
- err = ca.Pop()
- if err != nil {
- return sym, idx, err
- }
+ sym, err = Rewind(sym, st, ca)
+ if err != nil {
+ return sym, idx, err
}
case ".":
st.Same()
diff --git a/vm/runner.go b/vm/runner.go
@@ -83,6 +83,27 @@ func(vmi *Vm) Reset() {
}
}
+func Rewind(sym string, st *state.State, ca cache.Memory) (string, error) {
+ var err error
+ notTop := true
+ for notTop {
+ //notTop, err := st.Top()
+ notTop, err = st.Top()
+ if notTop {
+ break
+ }
+ sym, err = st.Up()
+ if err != nil {
+ break
+ }
+ err = ca.Pop()
+ if err != nil {
+ break
+ }
+ }
+ return sym, err
+}
+
// Run extracts individual op codes and arguments and executes them.
//
// Each step may update the state.