]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blobdiff - vendor/github.com/golang/protobuf/proto/table_marshal.go
Upgrade to 0.12
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / golang / protobuf / proto / table_marshal.go
index b16794496f5f1d4b0448489e7259f1d103681b9c..5cb11fa955e4d087c7579f4f018b25270a88de47 100644 (file)
@@ -87,6 +87,7 @@ type marshalElemInfo struct {
        sizer     sizer
        marshaler marshaler
        isptr     bool // elem is pointer typed, thus interface of this type is a direct interface (extension only)
+       deref     bool // dereference the pointer before operating on it; implies isptr
 }
 
 var (
@@ -320,8 +321,11 @@ func (u *marshalInfo) computeMarshalInfo() {
 
        // get oneof implementers
        var oneofImplementers []interface{}
-       if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok {
+       switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
+       case oneofFuncsIface:
                _, _, _, oneofImplementers = m.XXX_OneofFuncs()
+       case oneofWrappersIface:
+               oneofImplementers = m.XXX_OneofWrappers()
        }
 
        n := t.NumField()
@@ -407,13 +411,22 @@ func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo {
                panic("tag is not an integer")
        }
        wt := wiretype(tags[0])
+       if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct {
+               t = t.Elem()
+       }
        sizer, marshaler := typeMarshaler(t, tags, false, false)
+       var deref bool
+       if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
+               t = reflect.PtrTo(t)
+               deref = true
+       }
        e = &marshalElemInfo{
                wiretag:   uint64(tag)<<3 | wt,
                tagsize:   SizeVarint(uint64(tag) << 3),
                sizer:     sizer,
                marshaler: marshaler,
                isptr:     t.Kind() == reflect.Ptr,
+               deref:     deref,
        }
 
        // update cache
@@ -448,7 +461,7 @@ func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) {
 
 func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) {
        fi.field = toField(f)
-       fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
+       fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
        fi.isPointer = true
        fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f)
        fi.oneofElems = make(map[reflect.Type]*marshalElemInfo)
@@ -476,10 +489,6 @@ func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofI
        }
 }
 
-type oneofMessage interface {
-       XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
-}
-
 // wiretype returns the wire encoding of the type.
 func wiretype(encoding string) uint64 {
        switch encoding {
@@ -2310,8 +2319,8 @@ func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
                        for _, k := range m.MapKeys() {
                                ki := k.Interface()
                                vi := m.MapIndex(k).Interface()
-                               kaddr := toAddrPointer(&ki, false)             // pointer to key
-                               vaddr := toAddrPointer(&vi, valIsPtr)          // pointer to value
+                               kaddr := toAddrPointer(&ki, false, false)      // pointer to key
+                               vaddr := toAddrPointer(&vi, valIsPtr, false)   // pointer to value
                                siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
                                n += siz + SizeVarint(uint64(siz)) + tagsize
                        }
@@ -2329,8 +2338,8 @@ func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
                        for _, k := range keys {
                                ki := k.Interface()
                                vi := m.MapIndex(k).Interface()
-                               kaddr := toAddrPointer(&ki, false)    // pointer to key
-                               vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
+                               kaddr := toAddrPointer(&ki, false, false)    // pointer to key
+                               vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value
                                b = appendVarint(b, tag)
                                siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
                                b = appendVarint(b, uint64(siz))
@@ -2399,7 +2408,7 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
                // the last time this function was called.
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                n += ei.sizer(p, ei.tagsize)
        }
        mu.Unlock()
@@ -2434,7 +2443,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 
                        ei := u.getExtElemInfo(e.desc)
                        v := e.value
-                       p := toAddrPointer(&v, ei.isptr)
+                       p := toAddrPointer(&v, ei.isptr, ei.deref)
                        b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
                        if !nerr.Merge(err) {
                                return b, err
@@ -2465,7 +2474,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
                if !nerr.Merge(err) {
                        return b, err
@@ -2510,7 +2519,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int {
 
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                n += ei.sizer(p, 1) // message, tag = 3 (size=1)
        }
        mu.Unlock()
@@ -2553,7 +2562,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, de
 
                        ei := u.getExtElemInfo(e.desc)
                        v := e.value
-                       p := toAddrPointer(&v, ei.isptr)
+                       p := toAddrPointer(&v, ei.isptr, ei.deref)
                        b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
                        if !nerr.Merge(err) {
                                return b, err
@@ -2591,7 +2600,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, de
 
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
                b = append(b, 1<<3|WireEndGroup)
                if !nerr.Merge(err) {
@@ -2621,7 +2630,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
 
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                n += ei.sizer(p, ei.tagsize)
        }
        return n
@@ -2656,7 +2665,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
 
                ei := u.getExtElemInfo(e.desc)
                v := e.value
-               p := toAddrPointer(&v, ei.isptr)
+               p := toAddrPointer(&v, ei.isptr, ei.deref)
                b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
                if !nerr.Merge(err) {
                        return b, err