Browse Source

codec: json: tie decDriver pool usage to Decode Release

Ugorji Nwoke 6 years ago
parent
commit
882e0bbdfa
2 changed files with 21 additions and 5 deletions
  1. 13 0
      codec/decode.go
  2. 8 5
      codec/json.go

+ 13 - 0
codec/decode.go

@@ -1495,6 +1495,12 @@ func (d *Decoder) mustDecode(v interface{}) {
 		// }
 		d.decode(v)
 		d.d.atEndOfDecode()
+		// release
+		if !d.h.ExplicitRelease {
+			if d.jdec != nil {
+				d.jdec.release()
+			}
+		}
 		return
 	}
 
@@ -1510,8 +1516,12 @@ func (d *Decoder) mustDecode(v interface{}) {
 	d.bi.calls--
 	if d.bi.calls == 0 {
 		d.d.atEndOfDecode()
+		// release
 		if !d.h.ExplicitRelease {
 			d.bi.release()
+			if d.jdec != nil {
+				d.jdec.release()
+			}
 		}
 	}
 }
@@ -1540,6 +1550,9 @@ func (d *Decoder) Release() {
 	if d.bi != nil {
 		d.bi.release()
 	}
+	if d.jdec != nil {
+		d.jdec.release()
+	}
 	// d.decNakedPooler.end()
 }
 

+ 8 - 5
codec/json.go

@@ -282,15 +282,16 @@ func (e *jsonEncDriverGeneric) EncodeBool(b bool) {
 }
 
 func (e *jsonEncDriverGeneric) encodeFloat(f float64, bitsize, fmt byte, prec int8) {
-	var blen int
+	var blen uint
 	if e.ks && e.e.c == containerMapKey {
-		blen = 2 + len(strconv.AppendFloat(e.b[1:1], f, fmt, int(prec), int(bitsize)))
+		blen = 2 + uint(len(strconv.AppendFloat(e.b[1:1], f, fmt, int(prec), int(bitsize))))
+		// _ = e.b[:blen]
 		e.b[0] = '"'
 		e.b[blen-1] = '"'
+		e.w.writeb(e.b[:blen])
 	} else {
-		blen = len(strconv.AppendFloat(e.b[:0], f, fmt, int(prec), int(bitsize)))
+		e.w.writeb(strconv.AppendFloat(e.b[:0], f, fmt, int(prec), int(bitsize)))
 	}
-	e.w.writeb(e.b[:blen])
 }
 
 func (e *jsonEncDriverGeneric) EncodeFloat64(f float64) {
@@ -1485,7 +1486,9 @@ func (d *jsonDecDriver) reset() {
 	// d.n.reset()
 }
 
-func (d *jsonDecDriver) atEndOfDecode() {
+func (d *jsonDecDriver) atEndOfDecode() {}
+
+func (d *jsonDecDriver) release() {
 	if d.bs != nil {
 		d.bs = nil
 		d.bp.end()