go-vise

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

commit b8c8802421721c4d1a1d2022669602044de6b20c
parent be736c1ff6ab4ffad78cfb7ec461d83fa3fb5d36
Author: lash <dev@holbrook.no>
Date:   Wed,  5 Apr 2023 11:22:13 +0100

Fix bad int render for sig

Diffstat:
Mgo/asm/asm.go | 115+++++++++++++++----------------------------------------------------------------
Mgo/asm/asm_test.go | 12+++++++++---
2 files changed, 30 insertions(+), 97 deletions(-)

diff --git a/go/asm/asm.go b/go/asm/asm.go @@ -7,7 +7,6 @@ import ( "io" "log" "math" -// "strconv" "strings" "github.com/alecthomas/participle/v2" @@ -23,49 +22,15 @@ type Asm struct { type Display struct { Sym string `@Sym Whitespace` - //Val string `Quote (@Desc @Whitespace?)+ Quote Whitespace` - Val string `Quote (@Sym @Whitespace?)+ Quote Whitespace? EOL` + Val string `Quote (@Sym @Whitespace?)+ Quote` } func(d Display) String() string { return fmt.Sprintf("Display: %v %v", d.Sym, d.Val) } -type Sig struct { - Sym string `@Sym Whitespace` - Size uint32 `@Size Whitespace` - Val uint8 `@Size Whitespace? EOL` -} -// -//func(s Sig) Capture(v []string) error { -// log.Printf("considering capture %v %v", v[0], len(v)) -// if len(v) < 3 { -// return nil -// } -// s.Sym = v[0] -// r, err := strconv.Atoi(v[1]) -// if err != nil { -// return err -// } -// s.Size = uint32(r) -// r, err = strconv.Atoi(v[2]) -// if err != nil { -// return err -// } -// if r != 0 { -// r = 1 -// } -// s.Val = uint8(r) -// log.Printf("after considering capture: %v", s) -// return nil -//} - -func(s Sig) String() string { - return fmt.Sprintf("Sig: %v %v %v", s.Sym, s.Size, s.Val) -} - type Single struct { - One string `@Sym Whitespace? EOL` + One string `@Sym` } func(s Single) String() string { @@ -74,7 +39,7 @@ func(s Single) String() string { type Double struct { One string `@Sym Whitespace` - Two string `@Sym Whitespace? EOL` + Two string `@Sym` } func(d Double) String() string { @@ -83,12 +48,7 @@ func(d Double) String() string { type Sized struct { Sym string `@Sym Whitespace` - Size uint32 `@Size Whitespace? EOL` -} - -func(s Sized) Capture(v []Sized) error { - log.Printf("foofofofofo") - return fmt.Errorf("foo foo foo") + Size uint32 `@Size` } func(s Sized) String() string { @@ -96,20 +56,20 @@ func(s Sized) String() string { } type Arg struct { - ArgNone string "Discard?" ArgDisplay *Display `@@?` ArgSized *Sized `@@?` - ArgSig *Sig `@@?` + ArgFlag *uint8 `@Size?` ArgDouble *Double `@@?` ArgSingle *Single `@@?` + ArgNone string `Whitespace? EOL` } func (a Arg) String() string { if a.ArgDisplay != nil { return fmt.Sprintf("%s", a.ArgDisplay) } - if a.ArgSig != nil { - return fmt.Sprintf("%s", a.ArgSig) + if a.ArgFlag != nil { + return fmt.Sprintf("Flag: %v", *a.ArgFlag) } if a.ArgSized != nil { return fmt.Sprintf("%s", a.ArgSized) @@ -330,14 +290,9 @@ func parseSized(op vm.Opcode, arg Arg, w io.Writer) (int, error) { return rn, err } -func parseSig(op vm.Opcode, arg Arg, w io.Writer) (int, error) { +func parseNoarg(op vm.Opcode, arg Arg, w io.Writer) (int, error) { var rn int - v := arg.ArgSig - if v == nil { - return 0, nil - } - b := bytes.NewBuffer(nil) n, err := writeOpcode(op, b) @@ -345,30 +300,6 @@ func parseSig(op vm.Opcode, arg Arg, w io.Writer) (int, error) { if err != nil { return rn, err } - - n, err = writeSym(v.Sym, b) - rn += n - if err != nil { - return rn, err - } - - n, err = writeSize(v.Size, b) - rn += n - if err != nil { - return rn, err - } - - if v.Val == 0 { - n, err = b.Write([]byte{0x00}) - } else { - n, err = b.Write([]byte{0x01}) - } - rn += n - if err != nil { - return rn, err - } - - if w != nil { rn, err = w.Write(b.Bytes()) } else { @@ -377,22 +308,21 @@ func parseSig(op vm.Opcode, arg Arg, w io.Writer) (int, error) { return rn, err } -func parseNoarg(op vm.Opcode, arg Arg, w io.Writer) (int, error) { +func parseFlag(op vm.Opcode, arg Arg, w io.Writer) (int, error) { var rn int + var err error - b := bytes.NewBuffer(nil) - - n, err := writeOpcode(op, b) - rn += n - if err != nil { - return rn, err + v := arg.ArgFlag + if v == nil { + return 0, nil } if w != nil { - rn, err = w.Write(b.Bytes()) + rn, err = w.Write([]byte{*v}) } else { rn = 0 } return rn, err + } func Parse(s string, w io.Writer) (int, error) { @@ -412,17 +342,14 @@ func Parse(s string, w io.Writer) (int, error) { } if n > 0 { rn += n - continue - } - n, err = parseDisplay(op, v.OpArg, w) - if err != nil { - return n, err - } - if n > 0 { + n, err = parseFlag(op, v.OpArg, w) + if err != nil { + return n, err + } rn += n continue } - n, err = parseSig(op, v.OpArg, w) + n, err = parseDisplay(op, v.OpArg, w) if err != nil { return n, err } diff --git a/go/asm/asm_test.go b/go/asm/asm_test.go @@ -182,12 +182,18 @@ func TestParserWriteMultiple(t *testing.T) { if n != n_expect { t.Fatalf("expected total %v bytes output, got %v", n_expect, n) } - r_expect_hex := "000700010578797a7a7902029a000804696e6b790570696e6b79000303666f6f023432000a036261720b626172206261726220617a" + r_expect_hex := "000700010578797a7a7902029a01000804696e6b790570696e6b79000303666f6f012a000a036261720b626172206261726220617a" r_expect, err := hex.DecodeString(r_expect_hex) if err != nil { t.Fatal(err) } - if !bytes.Equal(r.Bytes(), r_expect) { - t.Fatalf("expected result %v, got %x", r_expect_hex, r.Bytes()) + rb := r.Bytes() + if !bytes.Equal(rb, r_expect) { + t.Fatalf("expected result %v, got %x", r_expect_hex, rb) + } + + _, err = vm.ParseAll(rb, nil) + if err != nil { + t.Fatal(err) } }