Преглед на файлове

goprotobuf: update to loss of unsafe.Unreflect, unsafe.New

R=rsc
CC=golang-dev
http://codereview.appspot.com/5661045
Rob Pike преди 14 години
родител
ревизия
7a788136fd
променени са 2 файла, в които са добавени 11 реда и са изтрити 11 реда
  1. 9 9
      proto/decode.go
  2. 2 2
      proto/encode.go

+ 9 - 9
proto/decode.go

@@ -355,7 +355,7 @@ func (o *Buffer) unmarshalType(t reflect.Type, is_group bool, base uintptr) erro
 		if !ok {
 			// Maybe it's an extension?
 			o.ptr = base // copy the address here to avoid a heap allocation.
-			iv := unsafe.Unreflect(t, unsafe.Pointer(&o.ptr))
+			iv := reflect.NewAt(t, unsafe.Pointer(&o.ptr)).Elem().Interface()
 			if e, ok := iv.(extendableProto); ok && isExtensionField(e, int32(tag)) {
 				if err = o.skip(st, tag, wire); err == nil {
 					e.ExtensionMap()[int32(tag)] = Extension{enc: append([]byte(nil), o.buf[oi:o.index]...)}
@@ -635,8 +635,8 @@ func (o *Buffer) dec_slice_slice_byte(p *Properties, base uintptr) error {
 func (o *Buffer) dec_struct_group(p *Properties, base uintptr) error {
 	ptr := (**struct{})(unsafe.Pointer(base + p.offset))
 	typ := p.stype.Elem()
-	structv := unsafe.New(typ)
-	bas := uintptr(structv)
+	bas := reflect.New(typ).Pointer()
+	structv := unsafe.Pointer(bas)
 	*ptr = (*struct{})(structv)
 
 	err := o.unmarshalType(p.stype, true, bas)
@@ -653,12 +653,12 @@ func (o *Buffer) dec_struct_message(p *Properties, base uintptr) (err error) {
 
 	ptr := (**struct{})(unsafe.Pointer(base + p.offset))
 	typ := p.stype.Elem()
-	structv := unsafe.New(typ)
-	bas := uintptr(structv)
+	bas := reflect.New(typ).Pointer()
+	structv := unsafe.Pointer(bas)
 	*ptr = (*struct{})(structv)
 
 	// If the object can unmarshal itself, let it.
-	iv := unsafe.Unreflect(p.stype, unsafe.Pointer(ptr))
+	iv := reflect.NewAt(p.stype, unsafe.Pointer(ptr)).Elem().Interface()
 	if u, ok := iv.(Unmarshaler); ok {
 		return u.Unmarshal(raw)
 	}
@@ -692,8 +692,8 @@ func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base uintptr) er
 	y := *v
 
 	typ := p.stype.Elem()
-	structv := unsafe.New(typ)
-	bas := uintptr(structv)
+	bas := reflect.New(typ).Pointer()
+	structv := unsafe.Pointer(bas)
 	y = append(y, (*struct{})(structv))
 	*v = y
 
@@ -708,7 +708,7 @@ func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base uintptr) er
 	}
 
 	// If the object can unmarshal itself, let it.
-	iv := unsafe.Unreflect(p.stype, unsafe.Pointer(&y[len(y)-1]))
+	iv := reflect.NewAt(p.stype, unsafe.Pointer(&y[len(y)-1])).Elem().Interface()
 	if u, ok := iv.(Unmarshaler); ok {
 		return u.Unmarshal(raw)
 	}

+ 2 - 2
proto/encode.go

@@ -273,7 +273,7 @@ func isNil(v reflect.Value) bool {
 // Encode a message struct.
 func (o *Buffer) enc_struct_message(p *Properties, base uintptr) error {
 	// Can the object marshal itself?
-	iv := unsafe.Unreflect(p.stype, unsafe.Pointer(base+p.offset))
+	iv := reflect.NewAt(p.stype, unsafe.Pointer(base+p.offset)).Elem().Interface()
 	if m, ok := iv.(Marshaler); ok {
 		if isNil(reflect.ValueOf(iv)) {
 			return ErrNil
@@ -484,7 +484,7 @@ func (o *Buffer) enc_slice_struct_message(p *Properties, base uintptr) error {
 		}
 
 		// Can the object marshal itself?
-		iv := unsafe.Unreflect(p.stype, unsafe.Pointer(&s[i]))
+		iv := reflect.NewAt(p.stype, unsafe.Pointer(&s[i])).Elem().Interface()
 		if m, ok := iv.(Marshaler); ok {
 			if isNil(reflect.ValueOf(iv)) {
 				return ErrNil