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.