mirror of https://github.com/goccy/go-json.git
Merge pull request #260 from goccy/feature/improve-interface-perf
Improve encoding performance for empty interface type
This commit is contained in:
commit
8129998093
|
@ -177,9 +177,11 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
code = code.Next
|
code = code.Next
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, seen := range ctx.SeenPtr {
|
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||||
if p == seen {
|
for _, seen := range ctx.SeenPtr {
|
||||||
return nil, errUnsupportedValue(code, p)
|
if p == seen {
|
||||||
|
return nil, errUnsupportedValue(code, p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||||
code = c
|
code = c
|
||||||
|
recursiveLevel++
|
||||||
case encoder.OpInterfaceEnd:
|
case encoder.OpInterfaceEnd:
|
||||||
offset := load(ctxptr, code.Idx)
|
recursiveLevel--
|
||||||
|
|
||||||
// restore ctxptr
|
// restore ctxptr
|
||||||
|
offset := load(ctxptr, code.Idx)
|
||||||
restoreIndent(ctx, code, ctxptr)
|
restoreIndent(ctx, code, ctxptr)
|
||||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||||
|
|
||||||
|
|
|
@ -177,9 +177,11 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
code = code.Next
|
code = code.Next
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, seen := range ctx.SeenPtr {
|
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||||
if p == seen {
|
for _, seen := range ctx.SeenPtr {
|
||||||
return nil, errUnsupportedValue(code, p)
|
if p == seen {
|
||||||
|
return nil, errUnsupportedValue(code, p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||||
code = c
|
code = c
|
||||||
|
recursiveLevel++
|
||||||
case encoder.OpInterfaceEnd:
|
case encoder.OpInterfaceEnd:
|
||||||
offset := load(ctxptr, code.Idx)
|
recursiveLevel--
|
||||||
|
|
||||||
// restore ctxptr
|
// restore ctxptr
|
||||||
|
offset := load(ctxptr, code.Idx)
|
||||||
restoreIndent(ctx, code, ctxptr)
|
restoreIndent(ctx, code, ctxptr)
|
||||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||||
|
|
||||||
|
|
|
@ -177,9 +177,11 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
code = code.Next
|
code = code.Next
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, seen := range ctx.SeenPtr {
|
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||||
if p == seen {
|
for _, seen := range ctx.SeenPtr {
|
||||||
return nil, errUnsupportedValue(code, p)
|
if p == seen {
|
||||||
|
return nil, errUnsupportedValue(code, p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||||
code = c
|
code = c
|
||||||
|
recursiveLevel++
|
||||||
case encoder.OpInterfaceEnd:
|
case encoder.OpInterfaceEnd:
|
||||||
offset := load(ctxptr, code.Idx)
|
recursiveLevel--
|
||||||
|
|
||||||
// restore ctxptr
|
// restore ctxptr
|
||||||
|
offset := load(ctxptr, code.Idx)
|
||||||
restoreIndent(ctx, code, ctxptr)
|
restoreIndent(ctx, code, ctxptr)
|
||||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||||
|
|
||||||
|
|
|
@ -177,9 +177,11 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
code = code.Next
|
code = code.Next
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, seen := range ctx.SeenPtr {
|
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||||
if p == seen {
|
for _, seen := range ctx.SeenPtr {
|
||||||
return nil, errUnsupportedValue(code, p)
|
if p == seen {
|
||||||
|
return nil, errUnsupportedValue(code, p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||||
code = c
|
code = c
|
||||||
|
recursiveLevel++
|
||||||
case encoder.OpInterfaceEnd:
|
case encoder.OpInterfaceEnd:
|
||||||
offset := load(ctxptr, code.Idx)
|
recursiveLevel--
|
||||||
|
|
||||||
// restore ctxptr
|
// restore ctxptr
|
||||||
|
offset := load(ctxptr, code.Idx)
|
||||||
restoreIndent(ctx, code, ctxptr)
|
restoreIndent(ctx, code, ctxptr)
|
||||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||||
|
|
||||||
|
|
|
@ -177,9 +177,11 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
code = code.Next
|
code = code.Next
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, seen := range ctx.SeenPtr {
|
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||||
if p == seen {
|
for _, seen := range ctx.SeenPtr {
|
||||||
return nil, errUnsupportedValue(code, p)
|
if p == seen {
|
||||||
|
return nil, errUnsupportedValue(code, p)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||||
code = c
|
code = c
|
||||||
|
recursiveLevel++
|
||||||
case encoder.OpInterfaceEnd:
|
case encoder.OpInterfaceEnd:
|
||||||
offset := load(ctxptr, code.Idx)
|
recursiveLevel--
|
||||||
|
|
||||||
// restore ctxptr
|
// restore ctxptr
|
||||||
|
offset := load(ctxptr, code.Idx)
|
||||||
restoreIndent(ctx, code, ctxptr)
|
restoreIndent(ctx, code, ctxptr)
|
||||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue