seen map[TypeId] *wireType; // which types we've already seen described
state *decodeState; // reads data from in-memory buffer
countState *decodeState; // reads counts from wire
+ buf []byte;
oneByte []byte;
}
return err;
}
+ // Allocate the buffer.
+ if nbytes > uint64(len(dec.buf)) {
+ dec.buf = make([]byte, nbytes + 1000);
+ }
+ dec.state.b = bytes.NewBuffer(dec.buf[0:nbytes]);
+
// Read the data
- buf := make([]byte, nbytes); // TODO(r): avoid repeated allocation
var n int;
- n, err = dec.r.Read(buf);
+ n, err = dec.r.Read(dec.buf[0:nbytes]);
if err != nil {
return err;
}
return os.ErrorString("gob decode: short read");
}
- dec.state.b = bytes.NewBuffer(buf); // TODO(r): avoid repeated allocation
// Receive a type id.
id := TypeId(decodeInt(dec.state));
if dec.state.err != nil {
return dec.state.err
}
+ // Is it a type?
if id < 0 { // 0 is the error state, handled above
// If the id is negative, we have a type.
dec.recvType(-id);
continue;
}
- // we have a value
+ // No, it's a value.
info := getTypeInfo(rt);
// Check type compatibility.
newEt1 := new(ET1);
dec.Decode(newEt1);
if dec.state.err != nil {
- t.Fatalf("error decoding ET1:", dec.state.err);
+ t.Fatal("error decoding ET1:", dec.state.err);
}
if !reflect.DeepEqual(et1, newEt1) {
newEt1 = new(ET1);
dec.Decode(newEt1);
if dec.state.err != nil {
- t.Fatalf("round 2: error decoding ET1:", dec.state.err);
+ t.Fatal("round 2: error decoding ET1:", dec.state.err);
}
if !reflect.DeepEqual(et1, newEt1) {
t.Fatalf("round 2: invalid data for et1: expected %+v; got %+v\n", *et1, *newEt1);
newEt2 := new(ET2);
dec.Decode(newEt2);
if dec.state.err == nil {
- t.Fatalf("round 3: expected `bad type' error decoding ET2");
+ t.Fatal("round 3: expected `bad type' error decoding ET2");
}
}