From: Rob Pike Date: Mon, 12 Oct 2009 01:07:47 +0000 (-0700) Subject: better code for allocation through indirection X-Git-Tag: weekly.2009-11-06~351 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c0e0f82e49f5afbc89db1092fe56d31c16d73523;p=gostls13.git better code for allocation through indirection R=rsc DELTA=11 (3 added, 5 deleted, 3 changed) OCL=35583 CL=35583 --- diff --git a/src/pkg/gob/decode.go b/src/pkg/gob/decode.go index 415b4b6779..f7cff58361 100644 --- a/src/pkg/gob/decode.go +++ b/src/pkg/gob/decode.go @@ -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); }