Browse Source

codec: fastpath: refactor uncommon arraycannotexpand into its own function

Ugorji Nwoke 6 years ago
parent
commit
b4c79eef6c
2 changed files with 56 additions and 144 deletions
  1. 42 135
      codec/fast-path.generated.go
  2. 14 9
      codec/fast-path.go.tmpl

+ 42 - 135
codec/fast-path.generated.go

@@ -4408,15 +4408,8 @@ func (fastpathT) DecSliceIntfN(v []interface{}, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		d.decode(&v[uint(j)])
@@ -4512,15 +4505,8 @@ func (fastpathT) DecSliceStringN(v []string, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = string(d.d.DecodeStringAsBytes())
@@ -4616,15 +4602,8 @@ func (fastpathT) DecSliceBytesN(v [][]byte, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = d.d.DecodeBytes(nil, false)
@@ -4720,15 +4699,8 @@ func (fastpathT) DecSliceFloat32N(v []float32, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = float32(d.decodeFloat32())
@@ -4824,15 +4796,8 @@ func (fastpathT) DecSliceFloat64N(v []float64, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = d.d.DecodeFloat64()
@@ -4928,15 +4893,8 @@ func (fastpathT) DecSliceUintN(v []uint, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = uint(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize))
@@ -5032,15 +4990,8 @@ func (fastpathT) DecSliceUint16N(v []uint16, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = uint16(chkOvf.UintV(d.d.DecodeUint64(), 16))
@@ -5136,15 +5087,8 @@ func (fastpathT) DecSliceUint32N(v []uint32, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = uint32(chkOvf.UintV(d.d.DecodeUint64(), 32))
@@ -5240,15 +5184,8 @@ func (fastpathT) DecSliceUint64N(v []uint64, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = d.d.DecodeUint64()
@@ -5344,15 +5281,8 @@ func (fastpathT) DecSliceIntN(v []int, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = int(chkOvf.IntV(d.d.DecodeInt64(), intBitsize))
@@ -5448,15 +5378,8 @@ func (fastpathT) DecSliceInt8N(v []int8, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = int8(chkOvf.IntV(d.d.DecodeInt64(), 8))
@@ -5552,15 +5475,8 @@ func (fastpathT) DecSliceInt16N(v []int16, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = int16(chkOvf.IntV(d.d.DecodeInt64(), 16))
@@ -5656,15 +5572,8 @@ func (fastpathT) DecSliceInt32N(v []int32, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = int32(chkOvf.IntV(d.d.DecodeInt64(), 32))
@@ -5760,15 +5669,8 @@ func (fastpathT) DecSliceInt64N(v []int64, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = d.d.DecodeInt64()
@@ -5864,21 +5766,26 @@ func (fastpathT) DecSliceBoolN(v []bool, d *Decoder) {
 	hasLen := containerLenS > 0
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		}
 		slh.ElemContainerState(j)
 		v[uint(j)] = d.d.DecodeBool()
 	}
 	slh.End()
 }
+func fastpathDecArrayCannotExpand(slh decSliceHelper, hasLen bool, lenv, j, containerLenS int) {
+	slh.d.arrayCannotExpand(lenv, j+1)
+	slh.ElemContainerState(j)
+	slh.d.swallow()
+	j++
+	for ; (hasLen && j < containerLenS) || !(hasLen || slh.d.d.CheckBreak()); j++ {
+		slh.ElemContainerState(j)
+		slh.d.swallow()
+	}
+	slh.End()
+}
+
 func (d *Decoder) fastpathDecMapStringIntfR(f *codecFnInfo, rv reflect.Value) {
 	containerLen := d.mapStart()
 	if containerLen == decContainerLenNil {

+ 14 - 9
codec/fast-path.go.tmpl

@@ -414,15 +414,8 @@ func (fastpathT) {{ .MethodNamePfx "Dec" false }}N(v []{{ .Elem }}, d *Decoder)
 	for j := 0; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
 		{{/* // if indefinite, etc, then expand the slice if necessary */ -}}
 		if j >= len(v) {
-			d.arrayCannotExpand(len(v), j+1)
-			slh.ElemContainerState(j)
-			d.swallow()
-			j++
-			for ; (hasLen && j < containerLenS) || !(hasLen || d.d.CheckBreak()); j++ {
-				slh.ElemContainerState(j)
-				d.swallow()
-			}
-			break
+			fastpathDecArrayCannotExpand(slh, hasLen, len(v), j, containerLenS)
+			return
 		} 
 		slh.ElemContainerState(j)
 		{{/*
@@ -441,6 +434,18 @@ func (fastpathT) {{ .MethodNamePfx "Dec" false }}N(v []{{ .Elem }}, d *Decoder)
 }
 {{end}}{{end}}{{end -}}
 
+func fastpathDecArrayCannotExpand(slh decSliceHelper, hasLen bool, lenv, j, containerLenS int) {
+	slh.d.arrayCannotExpand(lenv, j+1)
+	slh.ElemContainerState(j)
+	slh.d.swallow()
+	j++
+	for ; (hasLen && j < containerLenS) || !(hasLen || slh.d.d.CheckBreak()); j++ {
+		slh.ElemContainerState(j)
+		slh.d.swallow()
+	}
+	slh.End()
+}
+
 {{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
 {{/*
 Maps can change if they are