go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

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:
Masm/asm_test.go | 31++++++++++++++++++++-----------
Masm/menu_test.go | 3++-
Mdebug/node.go | 4++++
Mdev/disasm/main.go | 3++-
Mdev/walk/main.go | 10++++++++--
Mvm/debug.go | 4++--
Mvm/debug_test.go | 31+++++++++++++++++--------------
Mvm/input.go | 17+++--------------
Mvm/runner.go | 21+++++++++++++++++++++
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.