aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/encoding
diff options
context:
space:
mode:
authorCarl Shapiro <cshapiro@google.com>2013-09-30 16:02:12 -0700
committerCarl Shapiro <cshapiro@google.com>2013-09-30 16:02:12 -0700
commit7a480a8c9b3c43550f232a79af43fd99716e4595 (patch)
tree60a074ba438b2775b2a14d5d5852775dcc4b1c04 /src/pkg/encoding
parent6ffd70e7f04e90301ddd8224a90859acb44aed83 (diff)
downloadgo-7a480a8c9b3c43550f232a79af43fd99716e4595.tar.xz
undo CL 14154043 / 3e485428767e
««« original CL description encoding/gob: do not hide pointer argument for the garbage collector R=golang-dev, r CC=golang-dev https://golang.org/cl/14154043 »»» R=golang-dev CC=golang-dev https://golang.org/cl/14165043
Diffstat (limited to 'src/pkg/encoding')
-rw-r--r--src/pkg/encoding/gob/decode.go12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/pkg/encoding/gob/decode.go b/src/pkg/encoding/gob/decode.go
index 5665dd12d7..3e76f4c906 100644
--- a/src/pkg/encoding/gob/decode.go
+++ b/src/pkg/encoding/gob/decode.go
@@ -654,19 +654,21 @@ func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) {
// decodeSlice decodes a slice and stores the slice header through p.
// Slices are encoded as an unsigned length followed by the elements.
-func (dec *Decoder) decodeSlice(atyp reflect.Type, state *decoderState, p unsafe.Pointer, elemOp decOp, elemWid uintptr, indir, elemIndir int, ovfl error) {
+func (dec *Decoder) decodeSlice(atyp reflect.Type, state *decoderState, p uintptr, elemOp decOp, elemWid uintptr, indir, elemIndir int, ovfl error) {
nr := state.decodeUint()
n := int(nr)
if indir > 0 {
- if *(*unsafe.Pointer)(p) == nil {
+ up := unsafe.Pointer(p)
+ if *(*unsafe.Pointer)(up) == nil {
// Allocate the slice header.
- *(*unsafe.Pointer)(p) = unsafe.Pointer(new([]unsafe.Pointer))
+ *(*unsafe.Pointer)(up) = unsafe.Pointer(new([]unsafe.Pointer))
}
+ p = *(*uintptr)(up)
}
// Allocate storage for the slice elements, that is, the underlying array,
// if the existing slice does not have the capacity.
// Always write a header at p.
- hdrp := (*reflect.SliceHeader)(p)
+ hdrp := (*reflect.SliceHeader)(unsafe.Pointer(p))
if hdrp.Cap < n {
hdrp.Data = reflect.MakeSlice(atyp, n, n).Pointer()
hdrp.Cap = n
@@ -885,7 +887,7 @@ func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProg
elemOp, elemIndir := dec.decOpFor(elemId, t.Elem(), name, inProgress)
ovfl := overflow(name)
op = func(i *decInstr, state *decoderState, p unsafe.Pointer) {
- state.dec.decodeSlice(t, state, p, *elemOp, t.Elem().Size(), i.indir, elemIndir, ovfl)
+ state.dec.decodeSlice(t, state, uintptr(p), *elemOp, t.Elem().Size(), i.indir, elemIndir, ovfl)
}
case reflect.Struct: