@@ -144,6 +144,14 @@ func encode(v reflect.Value, enc Encoder) error {
144144 }
145145 return nil
146146 }
147+ if reflect .PtrTo (v .Type ()).Implements (protoMessageType ) {
148+ bytes , err := proto .Marshal (v .Addr ().Interface ().(proto.Message ))
149+ if err != nil {
150+ return err
151+ }
152+ enc .EncodeBytes (bytes )
153+ return nil
154+ }
147155 if v .Type ().Implements (textMarshalerType ) {
148156 bytes , err := v .Interface ().(encoding.TextMarshaler ).MarshalText ()
149157 if err != nil {
@@ -388,8 +396,11 @@ func decode(v reflect.Value, d Decoder) error {
388396 if err != nil {
389397 return err
390398 }
391- v .Set (reflect .ValueOf (val ))
392- return nil
399+ if reflect .TypeOf (val ).AssignableTo (v .Type ()) {
400+ v .Set (reflect .ValueOf (val ))
401+ return nil
402+ }
403+ return decodingError (v , d )
393404 }
394405
395406 // Handle implemented interfaces first.
@@ -510,7 +521,16 @@ func decodeList(v reflect.Value, d Decoder) error {
510521 // supports that, then do the decoding.
511522 if v .Type ().Elem ().Kind () == reflect .Uint8 {
512523 if b , ok := d .AsBytes (); ok {
513- v .SetBytes (b )
524+ if v .Kind () == reflect .Slice {
525+ v .SetBytes (b )
526+ return nil
527+ }
528+ // It's an array; copy the data in.
529+ err := prepareLength (v , len (b ))
530+ if err != nil {
531+ return err
532+ }
533+ reflect .Copy (v , reflect .ValueOf (b ))
514534 return nil
515535 }
516536 // Fall through to decode the []byte as an ordinary slice.
@@ -704,11 +724,11 @@ func fieldByIndexCreate(v reflect.Value, index []int) (reflect.Value, bool) {
704724}
705725
706726func decodingError (v reflect.Value , d Decoder ) error {
707- return gcerr .Newf (gcerr .InvalidArgument , nil , "cannot set type %s to %v" , v .Type (), d )
727+ return gcerr .New (gcerr .InvalidArgument , nil , 2 , fmt . Sprintf ( "cannot set type %s to %v" , v .Type (), d ) )
708728}
709729
710730func overflowError (x interface {}, t reflect.Type ) error {
711- return gcerr .Newf (gcerr .InvalidArgument , nil , "value %v overflows type %s" , x , t )
731+ return gcerr .New (gcerr .InvalidArgument , nil , 2 , fmt . Sprintf ( "value %v overflows type %s" , x , t ) )
712732}
713733
714734func wrap (err error , code gcerr.ErrorCode ) error {
0 commit comments