]> Cypherpunks repositories - gostls13.git/commitdiff
better code for allocation through indirection
authorRob Pike <r@golang.org>
Mon, 12 Oct 2009 01:07:47 +0000 (18:07 -0700)
committerRob Pike <r@golang.org>
Mon, 12 Oct 2009 01:07:47 +0000 (18:07 -0700)
R=rsc
DELTA=11  (3 added, 5 deleted, 3 changed)
OCL=35583
CL=35583

src/pkg/gob/decode.go

index 415b4b6779d16d494c6bc0c5d6cd2633554418fd..f7cff583610b46b50b7d7daa813389389de7de88 100644 (file)
@@ -355,18 +355,16 @@ type decEngine struct {
 }
 
 func decodeStruct(engine *decEngine, rtyp *reflect.StructType, b *bytes.Buffer, p uintptr, indir int) os.Error {
-       for ; indir > 0; indir-- {
+       if indir > 0 {
                up := unsafe.Pointer(p);
+               if indir > 1 {
+                       up = decIndirect(up, indir)
+               }
                if *(*unsafe.Pointer)(up) == nil {
                        // Allocate object by making a slice of bytes and recording the
                        // address of the beginning of the array. TODO(rsc).
-                       if indir > 1 {  // allocate a pointer
-                               b := make([]byte, unsafe.Sizeof((*int)(nil)));
-                               *(*unsafe.Pointer)(up) = unsafe.Pointer(&b[0]);
-                       } else {        // allocate a struct
-                               b := make([]byte, rtyp.Size());
-                               *(*unsafe.Pointer)(up) = unsafe.Pointer(&b[0]);
-                       }
+                       b := make([]byte, rtyp.Size());
+                       *(*unsafe.Pointer)(up) = unsafe.Pointer(&b[0]);
                }
                p = *(*uintptr)(up);
        }