]> Cypherpunks repositories - gostls13.git/commitdiff
clean up the decode loop and fix a couple of bad prints
authorRob Pike <r@golang.org>
Thu, 16 Jul 2009 20:05:46 +0000 (13:05 -0700)
committerRob Pike <r@golang.org>
Thu, 16 Jul 2009 20:05:46 +0000 (13:05 -0700)
R=rsc
DELTA=15  (8 added, 2 deleted, 5 changed)
OCL=31738
CL=31738

src/pkg/gob/decoder.go
src/pkg/gob/encoder_test.go

index e824ac754cc43ba6f6cff91466dad64be3ee438b..9257f7c23a28c18f18575378e3ed41bd61e28ad1 100644 (file)
@@ -19,6 +19,7 @@ type Decoder struct {
        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;
 }
 
@@ -63,10 +64,15 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
                        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;
                }
@@ -74,13 +80,13 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
                        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);
@@ -90,7 +96,7 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
                        continue;
                }
 
-               // we have a value
+               // No, it's a value.
                info := getTypeInfo(rt);
 
                // Check type compatibility.
index b4e9f5b553fc27ab9bfaba47d30c6b9d314901dc..6a4a53734171a14105a29243a2dd52d3a9dc6be3 100644 (file)
@@ -171,7 +171,7 @@ func TestEncoderDecoder(t *testing.T) {
        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) {
@@ -185,7 +185,7 @@ func TestEncoderDecoder(t *testing.T) {
        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);
@@ -202,7 +202,7 @@ func TestEncoderDecoder(t *testing.T) {
        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");
        }
 }