goprotobuf: remove unsafe from the extensions code.
R=golang-dev, r, dsymonds
CC=golang-dev
http://codereview.appspot.com/5306047
diff --git a/proto/extensions.go b/proto/extensions.go
index f1c52cc..eb4b64d 100644
--- a/proto/extensions.go
+++ b/proto/extensions.go
@@ -39,7 +39,6 @@
"os"
"reflect"
"strconv"
- "unsafe"
)
// ExtensionRange represents a range of message extensions for a protocol buffer.
@@ -198,15 +197,15 @@
props := &Properties{}
props.Init(t, "irrelevant_name", extension.Tag, 0)
- base := unsafe.New(t)
- if t.Elem().Kind() == reflect.Struct {
- // props.dec will be dec_struct_message.
- *(*unsafe.Pointer)(base) = unsafe.New(t.Elem())
- }
- if err := props.dec(o, props, uintptr(base)); err != nil {
+ // t is a pointer, likely to a struct.
+ // Allocate a "field" to store the pointer itself; the
+ // struct pointer will be stored here. We pass
+ // the address of this field to props.dec.
+ value := reflect.New(t).Elem()
+ if err := props.dec(o, props, value.UnsafeAddr()); err != nil {
return nil, err
}
- return unsafe.Unreflect(t, base), nil
+ return value.Interface(), nil
}
// GetExtensions returns a slice of the extensions present in pb that are also listed in es.