forked from mirror/go-json
Improve encoding performance for empty interface type
This commit is contained in:
parent
595e20a25e
commit
66bf979e47
|
@ -177,11 +177,13 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
code = code.Next
|
||||
break
|
||||
}
|
||||
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||
for _, seen := range ctx.SeenPtr {
|
||||
if p == seen {
|
||||
return nil, errUnsupportedValue(code, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||
iface := (*emptyInterface)(ptrToUnsafePtr(p))
|
||||
if iface.ptr == nil {
|
||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||
code = c
|
||||
recursiveLevel++
|
||||
case encoder.OpInterfaceEnd:
|
||||
offset := load(ctxptr, code.Idx)
|
||||
recursiveLevel--
|
||||
|
||||
// restore ctxptr
|
||||
offset := load(ctxptr, code.Idx)
|
||||
restoreIndent(ctx, code, ctxptr)
|
||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||
|
||||
|
|
|
@ -177,11 +177,13 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
code = code.Next
|
||||
break
|
||||
}
|
||||
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||
for _, seen := range ctx.SeenPtr {
|
||||
if p == seen {
|
||||
return nil, errUnsupportedValue(code, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||
iface := (*emptyInterface)(ptrToUnsafePtr(p))
|
||||
if iface.ptr == nil {
|
||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||
code = c
|
||||
recursiveLevel++
|
||||
case encoder.OpInterfaceEnd:
|
||||
offset := load(ctxptr, code.Idx)
|
||||
recursiveLevel--
|
||||
|
||||
// restore ctxptr
|
||||
offset := load(ctxptr, code.Idx)
|
||||
restoreIndent(ctx, code, ctxptr)
|
||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||
|
||||
|
|
|
@ -177,11 +177,13 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
code = code.Next
|
||||
break
|
||||
}
|
||||
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||
for _, seen := range ctx.SeenPtr {
|
||||
if p == seen {
|
||||
return nil, errUnsupportedValue(code, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||
iface := (*emptyInterface)(ptrToUnsafePtr(p))
|
||||
if iface.ptr == nil {
|
||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||
code = c
|
||||
recursiveLevel++
|
||||
case encoder.OpInterfaceEnd:
|
||||
offset := load(ctxptr, code.Idx)
|
||||
recursiveLevel--
|
||||
|
||||
// restore ctxptr
|
||||
offset := load(ctxptr, code.Idx)
|
||||
restoreIndent(ctx, code, ctxptr)
|
||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||
|
||||
|
|
|
@ -177,11 +177,13 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
code = code.Next
|
||||
break
|
||||
}
|
||||
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||
for _, seen := range ctx.SeenPtr {
|
||||
if p == seen {
|
||||
return nil, errUnsupportedValue(code, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||
iface := (*emptyInterface)(ptrToUnsafePtr(p))
|
||||
if iface.ptr == nil {
|
||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||
code = c
|
||||
recursiveLevel++
|
||||
case encoder.OpInterfaceEnd:
|
||||
offset := load(ctxptr, code.Idx)
|
||||
recursiveLevel--
|
||||
|
||||
// restore ctxptr
|
||||
offset := load(ctxptr, code.Idx)
|
||||
restoreIndent(ctx, code, ctxptr)
|
||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||
|
||||
|
|
|
@ -177,11 +177,13 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
code = code.Next
|
||||
break
|
||||
}
|
||||
if recursiveLevel > encoder.StartDetectingCyclesAfter {
|
||||
for _, seen := range ctx.SeenPtr {
|
||||
if p == seen {
|
||||
return nil, errUnsupportedValue(code, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.SeenPtr = append(ctx.SeenPtr, p)
|
||||
iface := (*emptyInterface)(ptrToUnsafePtr(p))
|
||||
if iface.ptr == nil {
|
||||
|
@ -226,9 +228,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
|||
store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
|
||||
storeIndent(ctxptr, end, uintptr(oldBaseIndent))
|
||||
code = c
|
||||
recursiveLevel++
|
||||
case encoder.OpInterfaceEnd:
|
||||
offset := load(ctxptr, code.Idx)
|
||||
recursiveLevel--
|
||||
|
||||
// restore ctxptr
|
||||
offset := load(ctxptr, code.Idx)
|
||||
restoreIndent(ctx, code, ctxptr)
|
||||
ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
|
||||
|
||||
|
|
Loading…
Reference in New Issue