Fix a proto encoding crasher whereby a nil in a repeated group field would crash the server.

Also fix the reflect bug that was exposed by this bug.

R=r
APPROVED=rsc
DELTA=162  (103 added, 32 deleted, 27 changed)
OCL=30125
CL=30319
diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go
index 903b0f5..987acd4 100644
--- a/src/pkg/reflect/all_test.go
+++ b/src/pkg/reflect/all_test.go
@@ -611,3 +611,10 @@
 		t.Errorf("Set(234) changed i to %d", i.(int));
 	}
 }
+
+func TestNilPtrValueSub(t *testing.T) {
+	var pi *int;
+	if pv := NewValue(pi).(PtrValue); pv.Sub() != nil {
+		t.Error("NewValue((*int)(nil)).(PtrValue).Sub() != nil");
+	}
+}
diff --git a/src/pkg/reflect/deepequal.go b/src/pkg/reflect/deepequal.go
index 57b5248..5c3cd4a 100644
--- a/src/pkg/reflect/deepequal.go
+++ b/src/pkg/reflect/deepequal.go
@@ -12,6 +12,12 @@
 // comparisons that have already been seen, which allows short circuiting on
 // recursive types.
 func deepValueEqual(v1, v2 Value, visited map[Addr]Addr) bool {
+	if v1 == nil {
+		return v2 == nil
+	}
+	if v2 == nil {
+		return false
+	}
 	if v1.Kind() != v2.Kind() {
 		return false;
 	}
diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go
index d4783d5..5c39583 100644
--- a/src/pkg/reflect/value.go
+++ b/src/pkg/reflect/value.go
@@ -512,7 +512,14 @@
 	return *(*Addr)(v.addr)
 }
 
+func (v *ptrValueStruct) IsNil() bool {
+	return uintptr(*(*Addr)(v.addr)) == 0
+}
+
 func (v *ptrValueStruct) Sub() Value {
+	if v.IsNil() {
+		return nil
+	}
 	return newValueAddr(v.typ.(PtrType).Sub(), v.Get());
 }
 
@@ -526,10 +533,6 @@
 	*(*Addr)(v.addr) = subv.Addr();
 }
 
-func (v *ptrValueStruct) IsNil() bool {
-	return uintptr(*(*Addr)(v.addr)) == 0
-}
-
 func ptrCreator(typ Type, addr Addr) Value {
 	return &ptrValueStruct{ commonValue{PtrKind, typ, addr} };
 }