runtime: introduce unsafe.New and unsafe.NewArray
    to provide functionality previously hacked in to
    reflect and gob.

R=r
https://golang.org/cl/165076
diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go
index c71f4dd..34393f9 100644
--- a/src/pkg/reflect/value.go
+++ b/src/pkg/reflect/value.go
@@ -595,15 +595,11 @@
 // MakeSlice creates a new zero-initialized slice value
 // for the specified slice type, length, and capacity.
 func MakeSlice(typ *SliceType, len, cap int) *SliceValue {
-	s := new(SliceHeader);
-	size := typ.Elem().Size() * uintptr(cap);
-	if size == 0 {
-		size = 1
-	}
-	data := make([]uint8, size);
-	s.Data = uintptr(addr(&data[0]));
-	s.Len = len;
-	s.Cap = cap;
+	s := &SliceHeader{
+		Data: uintptr(unsafe.NewArray(typ.Elem(), cap)),
+		Len: len,
+		Cap: cap,
+	};
 	return newValue(typ, addr(s), true).(*SliceValue);
 }
 
@@ -1270,13 +1266,8 @@
 
 // MakeZero returns a zero Value for the specified Type.
 func MakeZero(typ Type) Value {
-	// TODO: this will have to move into
-	// the runtime proper in order to play nicely
-	// with the garbage collector.
-	size := typ.Size();
-	if size == 0 {
-		size = 1
+	if typ == nil {
+		return nil
 	}
-	data := make([]uint8, size);
-	return newValue(typ, addr(&data[0]), true);
+	return newValue(typ, addr(unsafe.New(typ)), true);
 }