internal/impl: weak field bugfixes

Fix a reversed error check in impl.Export{}.WeakNil.

Check to see if we have a type for the weak field on marshal/size.

Treat a typed nil valued in XXX_Weak as not indicating presence for
the field.

Change-Id: Id667ac7eb4f53236be9e181017082bd8cd21d115
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/198717
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/message_reflect_field.go b/internal/impl/message_reflect_field.go
index 63b4055..8d4e6ae 100644
--- a/internal/impl/message_reflect_field.go
+++ b/internal/impl/message_reflect_field.go
@@ -13,7 +13,6 @@
 	"google.golang.org/protobuf/internal/flags"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
-	piface "google.golang.org/protobuf/runtime/protoiface"
 )
 
 type fieldInfo struct {
@@ -306,32 +305,29 @@
 		})
 	}
 
-	num := int32(fd.Number())
+	num := fd.Number()
 	return fieldInfo{
 		fieldDesc: fd,
 		has: func(p pointer) bool {
 			if p.IsNil() {
 				return false
 			}
-			fs := p.Apply(weakOffset).WeakFields()
-			_, ok := (*fs)[num]
+			_, ok := p.Apply(weakOffset).WeakFields().get(num)
 			return ok
 		},
 		clear: func(p pointer) {
-			fs := p.Apply(weakOffset).WeakFields()
-			delete(*fs, num)
+			p.Apply(weakOffset).WeakFields().clear(num)
 		},
 		get: func(p pointer) pref.Value {
 			lazyInit()
 			if p.IsNil() {
 				return pref.ValueOfMessage(messageType.Zero())
 			}
-			fs := p.Apply(weakOffset).WeakFields()
-			m, ok := (*fs)[num]
+			m, ok := p.Apply(weakOffset).WeakFields().get(num)
 			if !ok {
 				return pref.ValueOfMessage(messageType.Zero())
 			}
-			return pref.ValueOfMessage(m.(pref.ProtoMessage).ProtoReflect())
+			return pref.ValueOfMessage(m.ProtoReflect())
 		},
 		set: func(p pointer, v pref.Value) {
 			lazyInit()
@@ -339,24 +335,17 @@
 			if m.Descriptor() != messageType.Descriptor() {
 				panic("mismatching message descriptor")
 			}
-			fs := p.Apply(weakOffset).WeakFields()
-			if *fs == nil {
-				*fs = make(WeakFields)
-			}
-			(*fs)[num] = m.Interface().(piface.MessageV1)
+			p.Apply(weakOffset).WeakFields().set(num, m.Interface())
 		},
 		mutable: func(p pointer) pref.Value {
 			lazyInit()
 			fs := p.Apply(weakOffset).WeakFields()
-			if *fs == nil {
-				*fs = make(WeakFields)
-			}
-			m, ok := (*fs)[num]
+			m, ok := fs.get(num)
 			if !ok {
-				m = messageType.New().Interface().(piface.MessageV1)
-				(*fs)[num] = m
+				m = messageType.New().Interface()
+				fs.set(num, m)
 			}
-			return pref.ValueOfMessage(m.(pref.ProtoMessage).ProtoReflect())
+			return pref.ValueOfMessage(m.ProtoReflect())
 		},
 		newMessage: func() pref.Message {
 			lazyInit()