Browse Source

codec: check Handle.StringToRaw before assigning encoder function

Ugorji Nwoke 6 years ago
parent
commit
8dd026d40b
3 changed files with 20 additions and 13 deletions
  1. 5 1
      codec/helper.go
  2. 7 6
      codec/helper_not_unsafe.go
  3. 8 6
      codec/helper_unsafe.go

+ 5 - 1
codec/helper.go

@@ -830,7 +830,11 @@ func (x *BasicHandle) fnLoad(rt reflect.Type, rtid uintptr, checkExt bool) (fn *
 				fn.fe = (*Encoder).kBool
 				fn.fd = (*Decoder).kBool
 			case reflect.String:
-				fn.fe = (*Encoder).kString
+				if x.StringToRaw {
+					fn.fe = (*Encoder).kStringToRaw
+				} else {
+					fn.fe = (*Encoder).kStringEnc
+				}
 				fn.fd = (*Decoder).kString
 			case reflect.Int:
 				fn.fd = (*Decoder).kInt

+ 7 - 6
codec/helper_not_unsafe.go

@@ -259,13 +259,14 @@ func (e *Encoder) kTime(f *codecFnInfo, rv reflect.Value) {
 	e.e.EncodeTime(rv2i(rv).(time.Time))
 }
 
-func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) {
+func (e *Encoder) kStringToRaw(f *codecFnInfo, rv reflect.Value) {
 	s := rv.String()
-	if e.h.StringToRaw {
-		e.e.EncodeStringBytesRaw(bytesView(s))
-	} else {
-		e.e.EncodeStringEnc(cUTF8, s)
-	}
+	e.e.EncodeStringBytesRaw(bytesView(s))
+}
+
+func (e *Encoder) kStringEnc(f *codecFnInfo, rv reflect.Value) {
+	s := rv.String()
+	e.e.EncodeStringEnc(cUTF8, s)
 }
 
 func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) {

+ 8 - 6
codec/helper_unsafe.go

@@ -444,14 +444,16 @@ func (e *Encoder) kTime(f *codecFnInfo, rv reflect.Value) {
 	e.e.EncodeTime(*(*time.Time)(v.ptr))
 }
 
-func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) {
+func (e *Encoder) kStringToRaw(f *codecFnInfo, rv reflect.Value) {
 	v := (*unsafeReflectValue)(unsafe.Pointer(&rv))
 	s := *(*string)(v.ptr)
-	if e.h.StringToRaw {
-		e.e.EncodeStringBytesRaw(bytesView(s))
-	} else {
-		e.e.EncodeStringEnc(cUTF8, s)
-	}
+	e.e.EncodeStringBytesRaw(bytesView(s))
+}
+
+func (e *Encoder) kStringEnc(f *codecFnInfo, rv reflect.Value) {
+	v := (*unsafeReflectValue)(unsafe.Pointer(&rv))
+	s := *(*string)(v.ptr)
+	e.e.EncodeStringEnc(cUTF8, s)
 }
 
 func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) {