From fbfaea2c886b4c2afc95712badb719deaf5fc67d Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Mon, 22 Feb 2021 16:39:38 +0900 Subject: [PATCH] Refactor HeadInt operation --- encode_vm.go | 93 +++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/encode_vm.go b/encode_vm.go index faf1c73..46d44d1 100644 --- a/encode_vm.go +++ b/encode_vm.go @@ -596,67 +596,64 @@ func encodeRun(ctx *encodeRuntimeContext, b []byte, codeSet *opcodeSet, opt Enco } } case opStructFieldPtrHeadInt: - store(ctxptr, code.idx, ptrToPtr(load(ctxptr, code.idx))) + p := ptrToPtr(load(ctxptr, code.idx)) + if p == 0 { + b = encodeNull(b) + b = encodeComma(b) + code = code.end.next + break + } + store(ctxptr, code.idx, p) fallthrough case opStructFieldHeadInt: - ptr := load(ctxptr, code.idx) - if ptr == 0 { + p := load(ctxptr, code.idx) + code.offset + b = append(b, '{') + b = append(b, code.key...) + b = appendInt(b, ptrToUint64(p), code) + b = encodeComma(b) + code = code.next + case opStructFieldPtrHeadOmitEmptyInt: + p := ptrToPtr(load(ctxptr, code.idx)) + if p == 0 { b = encodeNull(b) b = encodeComma(b) code = code.end.next - } else { - b = append(b, '{') - b = append(b, code.key...) - b = appendInt(b, ptrToUint64(ptr+code.offset), code) - b = encodeComma(b) - code = code.next - } - case opStructFieldPtrHeadOmitEmptyInt: - ptr := load(ctxptr, code.idx) - if ptr != 0 { - store(ctxptr, code.idx, ptrToPtr(ptr)) + break } + store(ctxptr, code.idx, p) fallthrough case opStructFieldHeadOmitEmptyInt: - ptr := load(ctxptr, code.idx) - if ptr == 0 { - b = encodeNull(b) - b = encodeComma(b) - code = code.end.next + p := load(ctxptr, code.idx) + code.offset + b = append(b, '{') + u64 := ptrToUint64(p) + v := u64 & code.mask + if v == 0 { + code = code.nextField } else { - b = append(b, '{') - u64 := ptrToUint64(ptr + code.offset) - v := u64 & code.mask - if v == 0 { - code = code.nextField - } else { - b = append(b, code.key...) - b = appendInt(b, u64, code) - b = encodeComma(b) - code = code.next - } - } - case opStructFieldPtrHeadStringTagInt: - ptr := load(ctxptr, code.idx) - if ptr != 0 { - store(ctxptr, code.idx, ptrToPtr(ptr)) - } - fallthrough - case opStructFieldHeadStringTagInt: - ptr := load(ctxptr, code.idx) - if ptr == 0 { - b = encodeNull(b) - b = encodeComma(b) - code = code.end.next - } else { - b = append(b, '{') b = append(b, code.key...) - b = append(b, '"') - b = appendInt(b, ptrToUint64(ptr+code.offset), code) - b = append(b, '"') + b = appendInt(b, u64, code) b = encodeComma(b) code = code.next } + case opStructFieldPtrHeadStringTagInt: + p := ptrToPtr(load(ctxptr, code.idx)) + if p == 0 { + b = encodeNull(b) + b = encodeComma(b) + code = code.end.next + break + } + store(ctxptr, code.idx, p) + fallthrough + case opStructFieldHeadStringTagInt: + p := load(ctxptr, code.idx) + code.offset + b = append(b, '{') + b = append(b, code.key...) + b = append(b, '"') + b = appendInt(b, ptrToUint64(p), code) + b = append(b, '"') + b = encodeComma(b) + code = code.next case opStructFieldPtrHeadIntOnly, opStructFieldHeadIntOnly: p := load(ctxptr, code.idx) b = append(b, '{')