|
|
|
@ -301,8 +301,10 @@ func makeWriter(typ reflect.Type) (writer, error) { |
|
|
|
|
return writeUint, nil |
|
|
|
|
case kind == reflect.String: |
|
|
|
|
return writeString, nil |
|
|
|
|
case kind == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 && !typ.Elem().Implements(encoderInterface): |
|
|
|
|
case kind == reflect.Slice && isByte(typ.Elem()): |
|
|
|
|
return writeBytes, nil |
|
|
|
|
case kind == reflect.Array && isByte(typ.Elem()): |
|
|
|
|
return writeByteArray, nil |
|
|
|
|
case kind == reflect.Slice || kind == reflect.Array: |
|
|
|
|
return makeSliceWriter(typ) |
|
|
|
|
case kind == reflect.Struct: |
|
|
|
@ -314,6 +316,10 @@ func makeWriter(typ reflect.Type) (writer, error) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func isByte(typ reflect.Type) bool { |
|
|
|
|
return typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func writeUint(val reflect.Value, w *encbuf) error { |
|
|
|
|
i := val.Uint() |
|
|
|
|
if i == 0 { |
|
|
|
@ -358,6 +364,20 @@ func writeBytes(val reflect.Value, w *encbuf) error { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func writeByteArray(val reflect.Value, w *encbuf) error { |
|
|
|
|
if !val.CanAddr() { |
|
|
|
|
// Slice requires the value to be addressable.
|
|
|
|
|
// Make it addressable by copying.
|
|
|
|
|
copy := reflect.New(val.Type()).Elem() |
|
|
|
|
copy.Set(val) |
|
|
|
|
val = copy |
|
|
|
|
} |
|
|
|
|
size := val.Len() |
|
|
|
|
slice := val.Slice(0, size).Bytes() |
|
|
|
|
w.encodeString(slice) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func writeString(val reflect.Value, w *encbuf) error { |
|
|
|
|
s := val.String() |
|
|
|
|
w.encodeStringHeader(len(s)) |
|
|
|
|