Skip to content

Commit 192b6cb

Browse files
committed
typeset: finish plain coder
1 parent e7625a3 commit 192b6cb

File tree

4 files changed

+122
-28
lines changed

4 files changed

+122
-28
lines changed

internal/plain/plain.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,35 @@ type Coder interface {
9494
Decoder
9595
}
9696

97+
func TestRoundTrip(c Coder, verbose bool) error {
98+
var buf = new(bytes.Buffer)
99+
if err := c.PlainEncode(buf); err != nil {
100+
return fmt.Errorf("round trip, enc1: %w", err)
101+
}
102+
d := buf.Bytes()
103+
s1 := string(d)
104+
if verbose {
105+
fmt.Printf("encoded\n```\n%s```\n", s1)
106+
}
107+
buf = bytes.NewBuffer(d)
108+
if err := c.PlainDecode(buf); err != nil {
109+
return fmt.Errorf("round trip, dec: %w", err)
110+
}
111+
buf = new(bytes.Buffer)
112+
if err := c.PlainEncode(buf); err != nil {
113+
return fmt.Errorf("round trip, enc2: %w", err)
114+
}
115+
d = buf.Bytes()
116+
s2 := string(d)
117+
if verbose {
118+
fmt.Printf("encode2\n```\n%s```\n", s2)
119+
}
120+
if s1 != s2 {
121+
return fmt.Errorf("\n%s\n!=\n%s\n", s1, s2)
122+
}
123+
return nil
124+
}
125+
97126
func EncodeDecode(c Coder) error {
98127
var buf = new(bytes.Buffer)
99128
if err := c.PlainEncode(buf); err != nil {

typeset/node.go

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package typeset
1616

1717
import (
18-
"bufio"
1918
"fmt"
2019
"io"
2120
)
@@ -42,13 +41,16 @@ type named struct {
4241
}
4342

4443
func (n named) PlainEncode(w io.Writer) error {
45-
_, err := fmt.Fprintf(w, "%s:%08x", n.name, n.typ)
44+
_, err := fmt.Fprintf(w, "%s %08x", n.name, n.typ)
4645
return err
4746
}
4847

4948
func (n *named) PlainDecode(r io.Reader) error {
50-
_, err := fmt.Fscanf(r, "%s:%08x", &n.name, &n.typ)
51-
return err
49+
m, err := fmt.Fscanf(r, "%s %08x", &n.name, &n.typ)
50+
if err != nil {
51+
return fmt.Errorf("decode named n=%d: %w", m, err)
52+
}
53+
return nil
5254
}
5355

5456
func (n *node) PlainEncode(w io.Writer) error {
@@ -83,7 +85,7 @@ func (n *node) PlainEncode(w io.Writer) error {
8385
if err != nil {
8486
return err
8587
}
86-
err = wrapJoinEncode(w, "(", ", ", ")", n.params)
88+
err = wrapJoinEncode(w, "(", ", ", ") ", n.params)
8789
if err != nil {
8890
return err
8991
}
@@ -118,22 +120,22 @@ func (n *node) PlainDecode(r io.Reader) error {
118120
case Func:
119121
err = n.decodeFunc(r)
120122
}
121-
return nil
123+
return err
122124
}
123125

124126
func (n *node) decodeFunc(r io.Reader) error {
125127
buf := make([]byte, 2)
126128
_, err := io.ReadFull(r, buf)
127129
if err != nil {
128-
return err
130+
return fmt.Errorf("fn hdr: %w", err)
129131
}
130132
n.key = NoType
131133
switch buf[0] {
132134
case 'f':
133135
case 'm':
134136
_, err = fmt.Fscanf(r, "%08x", &n.key)
135137
if err != nil {
136-
return err
138+
return fmt.Errorf("key %w", err)
137139
}
138140
default:
139141
return fmt.Errorf("unexpected '%s'", string(buf))
@@ -146,11 +148,14 @@ func (n *node) decodeFunc(r io.Reader) error {
146148
default:
147149
return fmt.Errorf("unexpected '%s'", string(buf))
148150
}
149-
err = wrapJoinDecode(r, "(", ", ", ")", &n.params)
151+
err = wrapJoinDecode(r, "(", ", ", ") ", &n.params)
150152
if err != nil {
151-
return err
153+
return fmt.Errorf("params %w", err)
152154
}
153155
err = wrapJoinDecode(r, "(", ", ", ")", &n.results)
156+
if err != nil {
157+
return fmt.Errorf("results %w", err)
158+
}
154159

155160
return nil
156161
}
@@ -179,34 +184,69 @@ func wrapJoinEncode(w io.Writer, left, sep, right string, elts []named) error {
179184
return err
180185
}
181186

187+
type bb struct {
188+
r io.Reader
189+
b []byte // size 1
190+
buf bool
191+
}
192+
193+
func newbb(r io.Reader) *bb {
194+
return &bb{r: r, b: make([]byte, 1), buf: false}
195+
}
196+
197+
func (bb *bb) Read(d []byte) (int, error) {
198+
n := 0
199+
var nn int
200+
var err error
201+
if bb.buf && len(d) > 0 {
202+
d[0] = bb.b[0]
203+
bb.buf = false
204+
d = d[1:]
205+
n++
206+
nn, err = bb.r.Read(d)
207+
} else {
208+
nn, err = bb.r.Read(d)
209+
}
210+
return nn + n, err
211+
}
212+
213+
func (bb *bb) PeekByte() (byte, error) {
214+
if bb.buf {
215+
return 0, fmt.Errorf("already read %s", string(bb.b))
216+
}
217+
218+
_, err := io.ReadFull(bb.r, bb.b)
219+
if err != nil {
220+
return 0, err
221+
}
222+
bb.buf = true
223+
return bb.b[0], nil
224+
}
225+
182226
func wrapJoinDecode(r io.Reader, left, sep, right string, elts *[]named) error {
183-
br := bufio.NewReader(r)
184-
_ = br
227+
br := newbb(r)
185228
err := expect(r, left)
186229
if err != nil {
187230
return err
188231
}
189232
for {
190-
b, err := br.ReadByte()
233+
b, err := br.PeekByte()
191234
if err != nil {
192-
return err
193-
}
194-
if err = br.UnreadByte(); err != nil {
195-
return err
235+
return fmt.Errorf("peek %w", err)
196236
}
197237
switch b {
198238
case sep[0]:
199-
err = expect(r, sep)
239+
err = expect(br, sep)
200240
case right[0]:
201-
return expect(r, right)
241+
return expect(br, right)
202242
default:
203243
n := len(*elts)
204244
*elts = append(*elts, named{})
205245
elt := &(*elts)[n]
206246
err = elt.PlainDecode(br)
207247
}
208248
if err != nil {
209-
return err
249+
return fmt.Errorf("sep or dec: %w\n", err)
210250
}
211251
}
212252
}

typeset/plain.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ func (t *T) PlainEncode(w io.Writer) error {
2828
for i := int(_endType); i < N; i++ {
2929
node := &t.nodes[i]
3030
if err = node.PlainEncode(w); err != nil {
31-
return err
31+
return fmt.Errorf("typeset encode node %d: %w", i, err)
3232
}
3333
_, err = fmt.Fprintf(w, "\n")
34+
if err != nil {
35+
return fmt.Errorf("typeset encode eol %d: %w", i, err)
36+
}
3437
}
3538
return nil
3639
}
@@ -41,7 +44,7 @@ func (t *T) PlainDecode(r io.Reader) error {
4144
var H int
4245
_, err := fmt.Fscanf(r, "%d:%d\n", &N, &H)
4346
if err != nil {
44-
return err
47+
return fmt.Errorf("typeset decode hdr: %w", err)
4548
}
4649
tt.hash = make([]Type, H)
4750
copy(tt.hash[:_endType], t.hash[:_endType])
@@ -53,14 +56,14 @@ func (t *T) PlainDecode(r io.Reader) error {
5356
node := &tt.nodes[ty]
5457
node.zero()
5558
if err = node.PlainDecode(r); err != nil {
56-
return err
59+
return fmt.Errorf("typeset decode node %d: %w", ty, err)
5760
}
58-
_, err = io.ReadFull(r, eol)
61+
n, err := io.ReadFull(r, eol)
5962
if err != nil {
60-
return err
63+
return fmt.Errorf("typeset decode eol %d: %d %w", ty, n, err)
6164
}
6265
if eol[0] != byte('\n') {
63-
return fmt.Errorf("expected eol")
66+
return fmt.Errorf("expected eol got '%s'", string(eol))
6467
}
6568
node.hash = tt.hashCode(ty)
6669
hi := node.hash % uint32(H)

typeset/t_test.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ package typeset
1616

1717
import (
1818
"bytes"
19+
"go/token"
1920
"go/types"
20-
"os"
2121
"testing"
22+
23+
"github.com/go-air/pal/internal/plain"
2224
)
2325

2426
func TestTypeSetGrow(t *testing.T) {
@@ -28,7 +30,27 @@ func TestTypeSetGrow(t *testing.T) {
2830
for i := 0; i < 2025; i++ {
2931
palBase = ts.getPointer(palBase)
3032
}
31-
ts.PlainEncode(os.Stdout)
33+
//ts.PlainEncode(os.Stdout)
34+
if err := plain.TestRoundTrip(ts, false); err != nil {
35+
t.Error(err)
36+
}
37+
}
38+
39+
func TestTypeSetFunc(t *testing.T) {
40+
ts := New()
41+
params := types.NewTuple(
42+
types.NewVar(token.NoPos, nil, "p1", types.Typ[types.Int64]),
43+
types.NewVar(token.NoPos, nil, "p2", types.Typ[types.Int64]),
44+
types.NewVar(token.NoPos, nil, "p3", types.Typ[types.Float64]))
45+
results := types.NewTuple(
46+
types.NewVar(token.NoPos, nil, "r1", types.Typ[types.Int64]),
47+
types.NewVar(token.NoPos, nil, "r2", types.Typ[types.Int64]))
48+
sig := types.NewSignature(nil, params, results, false)
49+
_ = ts.FromGoType(sig)
50+
//ts.PlainEncode(os.Stdout)
51+
if err := plain.TestRoundTrip(ts, false); err != nil {
52+
t.Error(err)
53+
}
3254
}
3355

3456
func TestTypeSet(t *testing.T) {

0 commit comments

Comments
 (0)