mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Upgrade xorm to v1.2.2 (#16663)
* Upgrade xorm to v1.2.2 * Change the Engine interface to match xorm v1.2.2
This commit is contained in:
		
							
								
								
									
										286
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compact.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compact.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,286 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/errors" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	isWhiteSpace = [256]bool{ | ||||
| 		' ':  true, | ||||
| 		'\n': true, | ||||
| 		'\t': true, | ||||
| 		'\r': true, | ||||
| 	} | ||||
| 	isHTMLEscapeChar = [256]bool{ | ||||
| 		'<': true, | ||||
| 		'>': true, | ||||
| 		'&': true, | ||||
| 	} | ||||
| 	nul = byte('\000') | ||||
| ) | ||||
|  | ||||
| func Compact(buf *bytes.Buffer, src []byte, escape bool) error { | ||||
| 	if len(src) == 0 { | ||||
| 		return errors.ErrUnexpectedEndOfJSON("", 0) | ||||
| 	} | ||||
| 	buf.Grow(len(src)) | ||||
| 	dst := buf.Bytes() | ||||
|  | ||||
| 	ctx := TakeRuntimeContext() | ||||
| 	ctxBuf := ctx.Buf[:0] | ||||
| 	ctxBuf = append(append(ctxBuf, src...), nul) | ||||
| 	ctx.Buf = ctxBuf | ||||
|  | ||||
| 	if err := compactAndWrite(buf, dst, ctxBuf, escape); err != nil { | ||||
| 		ReleaseRuntimeContext(ctx) | ||||
| 		return err | ||||
| 	} | ||||
| 	ReleaseRuntimeContext(ctx) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func compactAndWrite(buf *bytes.Buffer, dst []byte, src []byte, escape bool) error { | ||||
| 	dst, err := compact(dst, src, escape) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if _, err := buf.Write(dst); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func compact(dst, src []byte, escape bool) ([]byte, error) { | ||||
| 	buf, cursor, err := compactValue(dst, src, 0, escape) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := validateEndBuf(src, cursor); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return buf, nil | ||||
| } | ||||
|  | ||||
| func validateEndBuf(src []byte, cursor int64) error { | ||||
| 	for { | ||||
| 		switch src[cursor] { | ||||
| 		case ' ', '\t', '\n', '\r': | ||||
| 			cursor++ | ||||
| 			continue | ||||
| 		case nul: | ||||
| 			return nil | ||||
| 		} | ||||
| 		return errors.ErrSyntax( | ||||
| 			fmt.Sprintf("invalid character '%c' after top-level value", src[cursor]), | ||||
| 			cursor+1, | ||||
| 		) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func skipWhiteSpace(buf []byte, cursor int64) int64 { | ||||
| LOOP: | ||||
| 	if isWhiteSpace[buf[cursor]] { | ||||
| 		cursor++ | ||||
| 		goto LOOP | ||||
| 	} | ||||
| 	return cursor | ||||
| } | ||||
|  | ||||
| func compactValue(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) { | ||||
| 	for { | ||||
| 		switch src[cursor] { | ||||
| 		case ' ', '\t', '\n', '\r': | ||||
| 			cursor++ | ||||
| 			continue | ||||
| 		case '{': | ||||
| 			return compactObject(dst, src, cursor, escape) | ||||
| 		case '}': | ||||
| 			return nil, 0, errors.ErrSyntax("unexpected character '}'", cursor) | ||||
| 		case '[': | ||||
| 			return compactArray(dst, src, cursor, escape) | ||||
| 		case ']': | ||||
| 			return nil, 0, errors.ErrSyntax("unexpected character ']'", cursor) | ||||
| 		case '"': | ||||
| 			return compactString(dst, src, cursor, escape) | ||||
| 		case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': | ||||
| 			return compactNumber(dst, src, cursor) | ||||
| 		case 't': | ||||
| 			return compactTrue(dst, src, cursor) | ||||
| 		case 'f': | ||||
| 			return compactFalse(dst, src, cursor) | ||||
| 		case 'n': | ||||
| 			return compactNull(dst, src, cursor) | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrSyntax(fmt.Sprintf("unexpected character '%c'", src[cursor]), cursor) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func compactObject(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) { | ||||
| 	if src[cursor] == '{' { | ||||
| 		dst = append(dst, '{') | ||||
| 	} else { | ||||
| 		return nil, 0, errors.ErrExpected("expected { character for object value", cursor) | ||||
| 	} | ||||
| 	cursor = skipWhiteSpace(src, cursor+1) | ||||
| 	if src[cursor] == '}' { | ||||
| 		dst = append(dst, '}') | ||||
| 		return dst, cursor + 1, nil | ||||
| 	} | ||||
| 	var err error | ||||
| 	for { | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		dst, cursor, err = compactString(dst, src, cursor, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		if src[cursor] != ':' { | ||||
| 			return nil, 0, errors.ErrExpected("colon after object key", cursor) | ||||
| 		} | ||||
| 		dst = append(dst, ':') | ||||
| 		dst, cursor, err = compactValue(dst, src, cursor+1, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		switch src[cursor] { | ||||
| 		case '}': | ||||
| 			dst = append(dst, '}') | ||||
| 			cursor++ | ||||
| 			return dst, cursor, nil | ||||
| 		case ',': | ||||
| 			dst = append(dst, ',') | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrExpected("comma after object value", cursor) | ||||
| 		} | ||||
| 		cursor++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func compactArray(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) { | ||||
| 	if src[cursor] == '[' { | ||||
| 		dst = append(dst, '[') | ||||
| 	} else { | ||||
| 		return nil, 0, errors.ErrExpected("expected [ character for array value", cursor) | ||||
| 	} | ||||
| 	cursor = skipWhiteSpace(src, cursor+1) | ||||
| 	if src[cursor] == ']' { | ||||
| 		dst = append(dst, ']') | ||||
| 		return dst, cursor + 1, nil | ||||
| 	} | ||||
| 	var err error | ||||
| 	for { | ||||
| 		dst, cursor, err = compactValue(dst, src, cursor, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		switch src[cursor] { | ||||
| 		case ']': | ||||
| 			dst = append(dst, ']') | ||||
| 			cursor++ | ||||
| 			return dst, cursor, nil | ||||
| 		case ',': | ||||
| 			dst = append(dst, ',') | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrExpected("comma after array value", cursor) | ||||
| 		} | ||||
| 		cursor++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func compactString(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) { | ||||
| 	if src[cursor] != '"' { | ||||
| 		return nil, 0, errors.ErrInvalidCharacter(src[cursor], "string", cursor) | ||||
| 	} | ||||
| 	start := cursor | ||||
| 	for { | ||||
| 		cursor++ | ||||
| 		c := src[cursor] | ||||
| 		if escape { | ||||
| 			if isHTMLEscapeChar[c] { | ||||
| 				dst = append(dst, src[start:cursor]...) | ||||
| 				dst = append(dst, `\u00`...) | ||||
| 				dst = append(dst, hex[c>>4], hex[c&0xF]) | ||||
| 				start = cursor + 1 | ||||
| 			} else if c == 0xE2 && cursor+2 < int64(len(src)) && src[cursor+1] == 0x80 && src[cursor+2]&^1 == 0xA8 { | ||||
| 				dst = append(dst, src[start:cursor]...) | ||||
| 				dst = append(dst, `\u202`...) | ||||
| 				dst = append(dst, hex[src[cursor+2]&0xF]) | ||||
| 				cursor += 2 | ||||
| 				start = cursor + 3 | ||||
| 			} | ||||
| 		} | ||||
| 		switch c { | ||||
| 		case '\\': | ||||
| 			cursor++ | ||||
| 			if src[cursor] == nul { | ||||
| 				return nil, 0, errors.ErrUnexpectedEndOfJSON("string", int64(len(src))) | ||||
| 			} | ||||
| 		case '"': | ||||
| 			cursor++ | ||||
| 			return append(dst, src[start:cursor]...), cursor, nil | ||||
| 		case nul: | ||||
| 			return nil, 0, errors.ErrUnexpectedEndOfJSON("string", int64(len(src))) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func compactNumber(dst, src []byte, cursor int64) ([]byte, int64, error) { | ||||
| 	start := cursor | ||||
| 	for { | ||||
| 		cursor++ | ||||
| 		if floatTable[src[cursor]] { | ||||
| 			continue | ||||
| 		} | ||||
| 		break | ||||
| 	} | ||||
| 	num := src[start:cursor] | ||||
| 	if _, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&num)), 64); err != nil { | ||||
| 		return nil, 0, err | ||||
| 	} | ||||
| 	dst = append(dst, num...) | ||||
| 	return dst, cursor, nil | ||||
| } | ||||
|  | ||||
| func compactTrue(dst, src []byte, cursor int64) ([]byte, int64, error) { | ||||
| 	if cursor+3 >= int64(len(src)) { | ||||
| 		return nil, 0, errors.ErrUnexpectedEndOfJSON("true", cursor) | ||||
| 	} | ||||
| 	if !bytes.Equal(src[cursor:cursor+4], []byte(`true`)) { | ||||
| 		return nil, 0, errors.ErrInvalidCharacter(src[cursor], "true", cursor) | ||||
| 	} | ||||
| 	dst = append(dst, "true"...) | ||||
| 	cursor += 4 | ||||
| 	return dst, cursor, nil | ||||
| } | ||||
|  | ||||
| func compactFalse(dst, src []byte, cursor int64) ([]byte, int64, error) { | ||||
| 	if cursor+4 >= int64(len(src)) { | ||||
| 		return nil, 0, errors.ErrUnexpectedEndOfJSON("false", cursor) | ||||
| 	} | ||||
| 	if !bytes.Equal(src[cursor:cursor+5], []byte(`false`)) { | ||||
| 		return nil, 0, errors.ErrInvalidCharacter(src[cursor], "false", cursor) | ||||
| 	} | ||||
| 	dst = append(dst, "false"...) | ||||
| 	cursor += 5 | ||||
| 	return dst, cursor, nil | ||||
| } | ||||
|  | ||||
| func compactNull(dst, src []byte, cursor int64) ([]byte, int64, error) { | ||||
| 	if cursor+3 >= int64(len(src)) { | ||||
| 		return nil, 0, errors.ErrUnexpectedEndOfJSON("null", cursor) | ||||
| 	} | ||||
| 	if !bytes.Equal(src[cursor:cursor+4], []byte(`null`)) { | ||||
| 		return nil, 0, errors.ErrInvalidCharacter(src[cursor], "null", cursor) | ||||
| 	} | ||||
| 	dst = append(dst, "null"...) | ||||
| 	cursor += 4 | ||||
| 	return dst, cursor, nil | ||||
| } | ||||
							
								
								
									
										1569
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1569
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										56
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| // +build !race | ||||
|  | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) { | ||||
| 	if typeptr > typeAddr.MaxTypeAddr { | ||||
| 		return compileToGetCodeSetSlowPath(typeptr) | ||||
| 	} | ||||
| 	index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift | ||||
| 	if codeSet := cachedOpcodeSets[index]; codeSet != nil { | ||||
| 		return codeSet, nil | ||||
| 	} | ||||
|  | ||||
| 	// noescape trick for header.typ ( reflect.*rtype ) | ||||
| 	copiedType := *(**runtime.Type)(unsafe.Pointer(&typeptr)) | ||||
|  | ||||
| 	noescapeKeyCode, err := compileHead(&compileContext{ | ||||
| 		typ:                      copiedType, | ||||
| 		structTypeToCompiledCode: map[uintptr]*CompiledCode{}, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	escapeKeyCode, err := compileHead(&compileContext{ | ||||
| 		typ:                      copiedType, | ||||
| 		structTypeToCompiledCode: map[uintptr]*CompiledCode{}, | ||||
| 		escapeKey:                true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	noescapeKeyCode = copyOpcode(noescapeKeyCode) | ||||
| 	escapeKeyCode = copyOpcode(escapeKeyCode) | ||||
| 	setTotalLengthToInterfaceOp(noescapeKeyCode) | ||||
| 	setTotalLengthToInterfaceOp(escapeKeyCode) | ||||
| 	interfaceNoescapeKeyCode := copyToInterfaceOpcode(noescapeKeyCode) | ||||
| 	interfaceEscapeKeyCode := copyToInterfaceOpcode(escapeKeyCode) | ||||
| 	codeLength := noescapeKeyCode.TotalLength() | ||||
| 	codeSet := &OpcodeSet{ | ||||
| 		Type:                     copiedType, | ||||
| 		NoescapeKeyCode:          noescapeKeyCode, | ||||
| 		EscapeKeyCode:            escapeKeyCode, | ||||
| 		InterfaceNoescapeKeyCode: interfaceNoescapeKeyCode, | ||||
| 		InterfaceEscapeKeyCode:   interfaceEscapeKeyCode, | ||||
| 		CodeLength:               codeLength, | ||||
| 		EndCode:                  ToEndCode(interfaceNoescapeKeyCode), | ||||
| 	} | ||||
| 	cachedOpcodeSets[index] = codeSet | ||||
| 	return codeSet, nil | ||||
| } | ||||
							
								
								
									
										65
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| // +build race | ||||
|  | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| var setsMu sync.RWMutex | ||||
|  | ||||
| func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) { | ||||
| 	if typeptr > typeAddr.MaxTypeAddr { | ||||
| 		return compileToGetCodeSetSlowPath(typeptr) | ||||
| 	} | ||||
| 	index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift | ||||
| 	setsMu.RLock() | ||||
| 	if codeSet := cachedOpcodeSets[index]; codeSet != nil { | ||||
| 		setsMu.RUnlock() | ||||
| 		return codeSet, nil | ||||
| 	} | ||||
| 	setsMu.RUnlock() | ||||
|  | ||||
| 	// noescape trick for header.typ ( reflect.*rtype ) | ||||
| 	copiedType := *(**runtime.Type)(unsafe.Pointer(&typeptr)) | ||||
|  | ||||
| 	noescapeKeyCode, err := compileHead(&compileContext{ | ||||
| 		typ:                      copiedType, | ||||
| 		structTypeToCompiledCode: map[uintptr]*CompiledCode{}, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	escapeKeyCode, err := compileHead(&compileContext{ | ||||
| 		typ:                      copiedType, | ||||
| 		structTypeToCompiledCode: map[uintptr]*CompiledCode{}, | ||||
| 		escapeKey:                true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	noescapeKeyCode = copyOpcode(noescapeKeyCode) | ||||
| 	escapeKeyCode = copyOpcode(escapeKeyCode) | ||||
| 	setTotalLengthToInterfaceOp(noescapeKeyCode) | ||||
| 	setTotalLengthToInterfaceOp(escapeKeyCode) | ||||
| 	interfaceNoescapeKeyCode := copyToInterfaceOpcode(noescapeKeyCode) | ||||
| 	interfaceEscapeKeyCode := copyToInterfaceOpcode(escapeKeyCode) | ||||
| 	codeLength := noescapeKeyCode.TotalLength() | ||||
| 	codeSet := &OpcodeSet{ | ||||
| 		Type:                     copiedType, | ||||
| 		NoescapeKeyCode:          noescapeKeyCode, | ||||
| 		EscapeKeyCode:            escapeKeyCode, | ||||
| 		InterfaceNoescapeKeyCode: interfaceNoescapeKeyCode, | ||||
| 		InterfaceEscapeKeyCode:   interfaceEscapeKeyCode, | ||||
| 		CodeLength:               codeLength, | ||||
| 		EndCode:                  ToEndCode(interfaceNoescapeKeyCode), | ||||
| 	} | ||||
| 	setsMu.Lock() | ||||
| 	cachedOpcodeSets[index] = codeSet | ||||
| 	setsMu.Unlock() | ||||
| 	return codeSet, nil | ||||
| } | ||||
							
								
								
									
										141
									
								
								vendor/github.com/goccy/go-json/internal/encoder/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								vendor/github.com/goccy/go-json/internal/encoder/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"sync" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| type compileContext struct { | ||||
| 	typ                      *runtime.Type | ||||
| 	opcodeIndex              uint32 | ||||
| 	ptrIndex                 int | ||||
| 	indent                   uint32 | ||||
| 	escapeKey                bool | ||||
| 	structTypeToCompiledCode map[uintptr]*CompiledCode | ||||
|  | ||||
| 	parent *compileContext | ||||
| } | ||||
|  | ||||
| func (c *compileContext) context() *compileContext { | ||||
| 	return &compileContext{ | ||||
| 		typ:                      c.typ, | ||||
| 		opcodeIndex:              c.opcodeIndex, | ||||
| 		ptrIndex:                 c.ptrIndex, | ||||
| 		indent:                   c.indent, | ||||
| 		escapeKey:                c.escapeKey, | ||||
| 		structTypeToCompiledCode: c.structTypeToCompiledCode, | ||||
| 		parent:                   c, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *compileContext) withType(typ *runtime.Type) *compileContext { | ||||
| 	ctx := c.context() | ||||
| 	ctx.typ = typ | ||||
| 	return ctx | ||||
| } | ||||
|  | ||||
| func (c *compileContext) incIndent() *compileContext { | ||||
| 	ctx := c.context() | ||||
| 	ctx.indent++ | ||||
| 	return ctx | ||||
| } | ||||
|  | ||||
| func (c *compileContext) decIndent() *compileContext { | ||||
| 	ctx := c.context() | ||||
| 	ctx.indent-- | ||||
| 	return ctx | ||||
| } | ||||
|  | ||||
| func (c *compileContext) incIndex() { | ||||
| 	c.incOpcodeIndex() | ||||
| 	c.incPtrIndex() | ||||
| } | ||||
|  | ||||
| func (c *compileContext) decIndex() { | ||||
| 	c.decOpcodeIndex() | ||||
| 	c.decPtrIndex() | ||||
| } | ||||
|  | ||||
| func (c *compileContext) incOpcodeIndex() { | ||||
| 	c.opcodeIndex++ | ||||
| 	if c.parent != nil { | ||||
| 		c.parent.incOpcodeIndex() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *compileContext) decOpcodeIndex() { | ||||
| 	c.opcodeIndex-- | ||||
| 	if c.parent != nil { | ||||
| 		c.parent.decOpcodeIndex() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *compileContext) incPtrIndex() { | ||||
| 	c.ptrIndex++ | ||||
| 	if c.parent != nil { | ||||
| 		c.parent.incPtrIndex() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *compileContext) decPtrIndex() { | ||||
| 	c.ptrIndex-- | ||||
| 	if c.parent != nil { | ||||
| 		c.parent.decPtrIndex() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	bufSize = 1024 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	runtimeContextPool = sync.Pool{ | ||||
| 		New: func() interface{} { | ||||
| 			return &RuntimeContext{ | ||||
| 				Buf:      make([]byte, 0, bufSize), | ||||
| 				Ptrs:     make([]uintptr, 128), | ||||
| 				KeepRefs: make([]unsafe.Pointer, 0, 8), | ||||
| 				Option:   &Option{}, | ||||
| 			} | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| type RuntimeContext struct { | ||||
| 	Context    context.Context | ||||
| 	Buf        []byte | ||||
| 	MarshalBuf []byte | ||||
| 	Ptrs       []uintptr | ||||
| 	KeepRefs   []unsafe.Pointer | ||||
| 	SeenPtr    []uintptr | ||||
| 	BaseIndent uint32 | ||||
| 	Prefix     []byte | ||||
| 	IndentStr  []byte | ||||
| 	Option     *Option | ||||
| } | ||||
|  | ||||
| func (c *RuntimeContext) Init(p uintptr, codelen int) { | ||||
| 	if len(c.Ptrs) < codelen { | ||||
| 		c.Ptrs = make([]uintptr, codelen) | ||||
| 	} | ||||
| 	c.Ptrs[0] = p | ||||
| 	c.KeepRefs = c.KeepRefs[:0] | ||||
| 	c.SeenPtr = c.SeenPtr[:0] | ||||
| 	c.BaseIndent = 0 | ||||
| } | ||||
|  | ||||
| func (c *RuntimeContext) Ptr() uintptr { | ||||
| 	header := (*runtime.SliceHeader)(unsafe.Pointer(&c.Ptrs)) | ||||
| 	return uintptr(header.Data) | ||||
| } | ||||
|  | ||||
| func TakeRuntimeContext() *RuntimeContext { | ||||
| 	return runtimeContextPool.Get().(*RuntimeContext) | ||||
| } | ||||
|  | ||||
| func ReleaseRuntimeContext(ctx *RuntimeContext) { | ||||
| 	runtimeContextPool.Put(ctx) | ||||
| } | ||||
							
								
								
									
										551
									
								
								vendor/github.com/goccy/go-json/internal/encoder/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										551
									
								
								vendor/github.com/goccy/go-json/internal/encoder/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,551 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding" | ||||
| 	"encoding/base64" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/errors" | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| func (t OpType) IsMultipleOpHead() bool { | ||||
| 	switch t { | ||||
| 	case OpStructHead: | ||||
| 		return true | ||||
| 	case OpStructHeadSlice: | ||||
| 		return true | ||||
| 	case OpStructHeadArray: | ||||
| 		return true | ||||
| 	case OpStructHeadMap: | ||||
| 		return true | ||||
| 	case OpStructHeadStruct: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmpty: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptySlice: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptyArray: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptyMap: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptyStruct: | ||||
| 		return true | ||||
| 	case OpStructHeadSlicePtr: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptySlicePtr: | ||||
| 		return true | ||||
| 	case OpStructHeadArrayPtr: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptyArrayPtr: | ||||
| 		return true | ||||
| 	case OpStructHeadMapPtr: | ||||
| 		return true | ||||
| 	case OpStructHeadOmitEmptyMapPtr: | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (t OpType) IsMultipleOpField() bool { | ||||
| 	switch t { | ||||
| 	case OpStructField: | ||||
| 		return true | ||||
| 	case OpStructFieldSlice: | ||||
| 		return true | ||||
| 	case OpStructFieldArray: | ||||
| 		return true | ||||
| 	case OpStructFieldMap: | ||||
| 		return true | ||||
| 	case OpStructFieldStruct: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmpty: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptySlice: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptyArray: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptyMap: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptyStruct: | ||||
| 		return true | ||||
| 	case OpStructFieldSlicePtr: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptySlicePtr: | ||||
| 		return true | ||||
| 	case OpStructFieldArrayPtr: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptyArrayPtr: | ||||
| 		return true | ||||
| 	case OpStructFieldMapPtr: | ||||
| 		return true | ||||
| 	case OpStructFieldOmitEmptyMapPtr: | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| type OpcodeSet struct { | ||||
| 	Type                     *runtime.Type | ||||
| 	NoescapeKeyCode          *Opcode | ||||
| 	EscapeKeyCode            *Opcode | ||||
| 	InterfaceNoescapeKeyCode *Opcode | ||||
| 	InterfaceEscapeKeyCode   *Opcode | ||||
| 	CodeLength               int | ||||
| 	EndCode                  *Opcode | ||||
| } | ||||
|  | ||||
| type CompiledCode struct { | ||||
| 	Code    *Opcode | ||||
| 	Linked  bool // whether recursive code already have linked | ||||
| 	CurLen  uintptr | ||||
| 	NextLen uintptr | ||||
| } | ||||
|  | ||||
| const StartDetectingCyclesAfter = 1000 | ||||
|  | ||||
| func Load(base uintptr, idx uintptr) uintptr { | ||||
| 	addr := base + idx | ||||
| 	return **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| } | ||||
|  | ||||
| func Store(base uintptr, idx uintptr, p uintptr) { | ||||
| 	addr := base + idx | ||||
| 	**(**uintptr)(unsafe.Pointer(&addr)) = p | ||||
| } | ||||
|  | ||||
| func LoadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr { | ||||
| 	addr := base + idx | ||||
| 	p := **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| 	if p == 0 { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return PtrToPtr(p) | ||||
| 	/* | ||||
| 		for i := 0; i < ptrNum; i++ { | ||||
| 			if p == 0 { | ||||
| 				return p | ||||
| 			} | ||||
| 			p = PtrToPtr(p) | ||||
| 		} | ||||
| 		return p | ||||
| 	*/ | ||||
| } | ||||
|  | ||||
| func PtrToUint64(p uintptr) uint64              { return **(**uint64)(unsafe.Pointer(&p)) } | ||||
| func PtrToFloat32(p uintptr) float32            { return **(**float32)(unsafe.Pointer(&p)) } | ||||
| func PtrToFloat64(p uintptr) float64            { return **(**float64)(unsafe.Pointer(&p)) } | ||||
| func PtrToBool(p uintptr) bool                  { return **(**bool)(unsafe.Pointer(&p)) } | ||||
| func PtrToBytes(p uintptr) []byte               { return **(**[]byte)(unsafe.Pointer(&p)) } | ||||
| func PtrToNumber(p uintptr) json.Number         { return **(**json.Number)(unsafe.Pointer(&p)) } | ||||
| func PtrToString(p uintptr) string              { return **(**string)(unsafe.Pointer(&p)) } | ||||
| func PtrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) } | ||||
| func PtrToPtr(p uintptr) uintptr { | ||||
| 	return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p))) | ||||
| } | ||||
| func PtrToNPtr(p uintptr, ptrNum int) uintptr { | ||||
| 	for i := 0; i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = PtrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func PtrToUnsafePtr(p uintptr) unsafe.Pointer { | ||||
| 	return *(*unsafe.Pointer)(unsafe.Pointer(&p)) | ||||
| } | ||||
| func PtrToInterface(code *Opcode, p uintptr) interface{} { | ||||
| 	return *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)), | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func ErrUnsupportedValue(code *Opcode, ptr uintptr) *errors.UnsupportedValueError { | ||||
| 	v := *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&ptr)), | ||||
| 	})) | ||||
| 	return &errors.UnsupportedValueError{ | ||||
| 		Value: reflect.ValueOf(v), | ||||
| 		Str:   fmt.Sprintf("encountered a cycle via %s", code.Type), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ErrUnsupportedFloat(v float64) *errors.UnsupportedValueError { | ||||
| 	return &errors.UnsupportedValueError{ | ||||
| 		Value: reflect.ValueOf(v), | ||||
| 		Str:   strconv.FormatFloat(v, 'g', -1, 64), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ErrMarshalerWithCode(code *Opcode, err error) *errors.MarshalerError { | ||||
| 	return &errors.MarshalerError{ | ||||
| 		Type: runtime.RType2Type(code.Type), | ||||
| 		Err:  err, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type emptyInterface struct { | ||||
| 	typ *runtime.Type | ||||
| 	ptr unsafe.Pointer | ||||
| } | ||||
|  | ||||
| type MapItem struct { | ||||
| 	Key   []byte | ||||
| 	Value []byte | ||||
| } | ||||
|  | ||||
| type Mapslice struct { | ||||
| 	Items []MapItem | ||||
| } | ||||
|  | ||||
| func (m *Mapslice) Len() int { | ||||
| 	return len(m.Items) | ||||
| } | ||||
|  | ||||
| func (m *Mapslice) Less(i, j int) bool { | ||||
| 	return bytes.Compare(m.Items[i].Key, m.Items[j].Key) < 0 | ||||
| } | ||||
|  | ||||
| func (m *Mapslice) Swap(i, j int) { | ||||
| 	m.Items[i], m.Items[j] = m.Items[j], m.Items[i] | ||||
| } | ||||
|  | ||||
| type MapContext struct { | ||||
| 	Pos   []int | ||||
| 	Slice *Mapslice | ||||
| 	Buf   []byte | ||||
| } | ||||
|  | ||||
| var mapContextPool = sync.Pool{ | ||||
| 	New: func() interface{} { | ||||
| 		return &MapContext{} | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func NewMapContext(mapLen int) *MapContext { | ||||
| 	ctx := mapContextPool.Get().(*MapContext) | ||||
| 	if ctx.Slice == nil { | ||||
| 		ctx.Slice = &Mapslice{ | ||||
| 			Items: make([]MapItem, 0, mapLen), | ||||
| 		} | ||||
| 	} | ||||
| 	if cap(ctx.Pos) < (mapLen*2 + 1) { | ||||
| 		ctx.Pos = make([]int, 0, mapLen*2+1) | ||||
| 		ctx.Slice.Items = make([]MapItem, 0, mapLen) | ||||
| 	} else { | ||||
| 		ctx.Pos = ctx.Pos[:0] | ||||
| 		ctx.Slice.Items = ctx.Slice.Items[:0] | ||||
| 	} | ||||
| 	ctx.Buf = ctx.Buf[:0] | ||||
| 	return ctx | ||||
| } | ||||
|  | ||||
| func ReleaseMapContext(c *MapContext) { | ||||
| 	mapContextPool.Put(c) | ||||
| } | ||||
|  | ||||
| //go:linkname MapIterInit reflect.mapiterinit | ||||
| //go:noescape | ||||
| func MapIterInit(mapType *runtime.Type, m unsafe.Pointer) unsafe.Pointer | ||||
|  | ||||
| //go:linkname MapIterKey reflect.mapiterkey | ||||
| //go:noescape | ||||
| func MapIterKey(it unsafe.Pointer) unsafe.Pointer | ||||
|  | ||||
| //go:linkname MapIterNext reflect.mapiternext | ||||
| //go:noescape | ||||
| func MapIterNext(it unsafe.Pointer) | ||||
|  | ||||
| //go:linkname MapLen reflect.maplen | ||||
| //go:noescape | ||||
| func MapLen(m unsafe.Pointer) int | ||||
|  | ||||
| func AppendByteSlice(_ *RuntimeContext, b []byte, src []byte) []byte { | ||||
| 	if src == nil { | ||||
| 		return append(b, `null`...) | ||||
| 	} | ||||
| 	encodedLen := base64.StdEncoding.EncodedLen(len(src)) | ||||
| 	b = append(b, '"') | ||||
| 	pos := len(b) | ||||
| 	remainLen := cap(b[pos:]) | ||||
| 	var buf []byte | ||||
| 	if remainLen > encodedLen { | ||||
| 		buf = b[pos : pos+encodedLen] | ||||
| 	} else { | ||||
| 		buf = make([]byte, encodedLen) | ||||
| 	} | ||||
| 	base64.StdEncoding.Encode(buf, src) | ||||
| 	return append(append(b, buf...), '"') | ||||
| } | ||||
|  | ||||
| func AppendFloat32(_ *RuntimeContext, b []byte, v float32) []byte { | ||||
| 	f64 := float64(v) | ||||
| 	abs := math.Abs(f64) | ||||
| 	fmt := byte('f') | ||||
| 	// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. | ||||
| 	if abs != 0 { | ||||
| 		f32 := float32(abs) | ||||
| 		if f32 < 1e-6 || f32 >= 1e21 { | ||||
| 			fmt = 'e' | ||||
| 		} | ||||
| 	} | ||||
| 	return strconv.AppendFloat(b, f64, fmt, -1, 32) | ||||
| } | ||||
|  | ||||
| func AppendFloat64(_ *RuntimeContext, b []byte, v float64) []byte { | ||||
| 	abs := math.Abs(v) | ||||
| 	fmt := byte('f') | ||||
| 	// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. | ||||
| 	if abs != 0 { | ||||
| 		if abs < 1e-6 || abs >= 1e21 { | ||||
| 			fmt = 'e' | ||||
| 		} | ||||
| 	} | ||||
| 	return strconv.AppendFloat(b, v, fmt, -1, 64) | ||||
| } | ||||
|  | ||||
| func AppendBool(_ *RuntimeContext, b []byte, v bool) []byte { | ||||
| 	if v { | ||||
| 		return append(b, "true"...) | ||||
| 	} | ||||
| 	return append(b, "false"...) | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	floatTable = [256]bool{ | ||||
| 		'0': true, | ||||
| 		'1': true, | ||||
| 		'2': true, | ||||
| 		'3': true, | ||||
| 		'4': true, | ||||
| 		'5': true, | ||||
| 		'6': true, | ||||
| 		'7': true, | ||||
| 		'8': true, | ||||
| 		'9': true, | ||||
| 		'.': true, | ||||
| 		'e': true, | ||||
| 		'E': true, | ||||
| 		'+': true, | ||||
| 		'-': true, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func AppendNumber(_ *RuntimeContext, b []byte, n json.Number) ([]byte, error) { | ||||
| 	if len(n) == 0 { | ||||
| 		return append(b, '0'), nil | ||||
| 	} | ||||
| 	for i := 0; i < len(n); i++ { | ||||
| 		if !floatTable[n[i]] { | ||||
| 			return nil, fmt.Errorf("json: invalid number literal %q", n) | ||||
| 		} | ||||
| 	} | ||||
| 	b = append(b, n...) | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func AppendMarshalJSON(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	rv := reflect.ValueOf(v) // convert by dynamic interface type | ||||
| 	if (code.Flags & AddrForMarshalerFlags) != 0 { | ||||
| 		if rv.CanAddr() { | ||||
| 			rv = rv.Addr() | ||||
| 		} else { | ||||
| 			newV := reflect.New(rv.Type()) | ||||
| 			newV.Elem().Set(rv) | ||||
| 			rv = newV | ||||
| 		} | ||||
| 	} | ||||
| 	v = rv.Interface() | ||||
| 	var bb []byte | ||||
| 	if (code.Flags & MarshalerContextFlags) != 0 { | ||||
| 		marshaler, ok := v.(marshalerContext) | ||||
| 		if !ok { | ||||
| 			return AppendNull(ctx, b), nil | ||||
| 		} | ||||
| 		b, err := marshaler.MarshalJSON(ctx.Option.Context) | ||||
| 		if err != nil { | ||||
| 			return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 		} | ||||
| 		bb = b | ||||
| 	} else { | ||||
| 		marshaler, ok := v.(json.Marshaler) | ||||
| 		if !ok { | ||||
| 			return AppendNull(ctx, b), nil | ||||
| 		} | ||||
| 		b, err := marshaler.MarshalJSON() | ||||
| 		if err != nil { | ||||
| 			return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 		} | ||||
| 		bb = b | ||||
| 	} | ||||
| 	marshalBuf := ctx.MarshalBuf[:0] | ||||
| 	marshalBuf = append(append(marshalBuf, bb...), nul) | ||||
| 	compactedBuf, err := compact(b, marshalBuf, (ctx.Option.Flag&HTMLEscapeOption) != 0) | ||||
| 	if err != nil { | ||||
| 		return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 	} | ||||
| 	ctx.MarshalBuf = marshalBuf | ||||
| 	return compactedBuf, nil | ||||
| } | ||||
|  | ||||
| func AppendMarshalJSONIndent(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	rv := reflect.ValueOf(v) // convert by dynamic interface type | ||||
| 	if (code.Flags & AddrForMarshalerFlags) != 0 { | ||||
| 		if rv.CanAddr() { | ||||
| 			rv = rv.Addr() | ||||
| 		} else { | ||||
| 			newV := reflect.New(rv.Type()) | ||||
| 			newV.Elem().Set(rv) | ||||
| 			rv = newV | ||||
| 		} | ||||
| 	} | ||||
| 	v = rv.Interface() | ||||
| 	var bb []byte | ||||
| 	if (code.Flags & MarshalerContextFlags) != 0 { | ||||
| 		marshaler, ok := v.(marshalerContext) | ||||
| 		if !ok { | ||||
| 			return AppendNull(ctx, b), nil | ||||
| 		} | ||||
| 		b, err := marshaler.MarshalJSON(ctx.Option.Context) | ||||
| 		if err != nil { | ||||
| 			return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 		} | ||||
| 		bb = b | ||||
| 	} else { | ||||
| 		marshaler, ok := v.(json.Marshaler) | ||||
| 		if !ok { | ||||
| 			return AppendNull(ctx, b), nil | ||||
| 		} | ||||
| 		b, err := marshaler.MarshalJSON() | ||||
| 		if err != nil { | ||||
| 			return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 		} | ||||
| 		bb = b | ||||
| 	} | ||||
| 	marshalBuf := ctx.MarshalBuf[:0] | ||||
| 	marshalBuf = append(append(marshalBuf, bb...), nul) | ||||
| 	indentedBuf, err := doIndent( | ||||
| 		b, | ||||
| 		marshalBuf, | ||||
| 		string(ctx.Prefix)+strings.Repeat(string(ctx.IndentStr), int(ctx.BaseIndent+code.Indent)), | ||||
| 		string(ctx.IndentStr), | ||||
| 		(ctx.Option.Flag&HTMLEscapeOption) != 0, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 	} | ||||
| 	ctx.MarshalBuf = marshalBuf | ||||
| 	return indentedBuf, nil | ||||
| } | ||||
|  | ||||
| func AppendMarshalText(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	rv := reflect.ValueOf(v) // convert by dynamic interface type | ||||
| 	if (code.Flags & AddrForMarshalerFlags) != 0 { | ||||
| 		if rv.CanAddr() { | ||||
| 			rv = rv.Addr() | ||||
| 		} else { | ||||
| 			newV := reflect.New(rv.Type()) | ||||
| 			newV.Elem().Set(rv) | ||||
| 			rv = newV | ||||
| 		} | ||||
| 	} | ||||
| 	v = rv.Interface() | ||||
| 	marshaler, ok := v.(encoding.TextMarshaler) | ||||
| 	if !ok { | ||||
| 		return AppendNull(ctx, b), nil | ||||
| 	} | ||||
| 	bytes, err := marshaler.MarshalText() | ||||
| 	if err != nil { | ||||
| 		return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 	} | ||||
| 	return AppendString(ctx, b, *(*string)(unsafe.Pointer(&bytes))), nil | ||||
| } | ||||
|  | ||||
| func AppendMarshalTextIndent(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	rv := reflect.ValueOf(v) // convert by dynamic interface type | ||||
| 	if (code.Flags & AddrForMarshalerFlags) != 0 { | ||||
| 		if rv.CanAddr() { | ||||
| 			rv = rv.Addr() | ||||
| 		} else { | ||||
| 			newV := reflect.New(rv.Type()) | ||||
| 			newV.Elem().Set(rv) | ||||
| 			rv = newV | ||||
| 		} | ||||
| 	} | ||||
| 	v = rv.Interface() | ||||
| 	marshaler, ok := v.(encoding.TextMarshaler) | ||||
| 	if !ok { | ||||
| 		return AppendNull(ctx, b), nil | ||||
| 	} | ||||
| 	bytes, err := marshaler.MarshalText() | ||||
| 	if err != nil { | ||||
| 		return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err} | ||||
| 	} | ||||
| 	return AppendString(ctx, b, *(*string)(unsafe.Pointer(&bytes))), nil | ||||
| } | ||||
|  | ||||
| func AppendNull(_ *RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, "null"...) | ||||
| } | ||||
|  | ||||
| func AppendComma(_ *RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func AppendCommaIndent(_ *RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',', '\n') | ||||
| } | ||||
|  | ||||
| func AppendStructEnd(_ *RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '}', ',') | ||||
| } | ||||
|  | ||||
| func AppendStructEndIndent(ctx *RuntimeContext, code *Opcode, b []byte) []byte { | ||||
| 	b = append(b, '\n') | ||||
| 	b = append(b, ctx.Prefix...) | ||||
| 	indentNum := ctx.BaseIndent + code.Indent - 1 | ||||
| 	for i := uint32(0); i < indentNum; i++ { | ||||
| 		b = append(b, ctx.IndentStr...) | ||||
| 	} | ||||
| 	return append(b, '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func AppendIndent(ctx *RuntimeContext, b []byte, indent uint32) []byte { | ||||
| 	b = append(b, ctx.Prefix...) | ||||
| 	indentNum := ctx.BaseIndent + indent | ||||
| 	for i := uint32(0); i < indentNum; i++ { | ||||
| 		b = append(b, ctx.IndentStr...) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func IsNilForMarshaler(v interface{}) bool { | ||||
| 	rv := reflect.ValueOf(v) | ||||
| 	switch rv.Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		return !rv.Bool() | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		return rv.Int() == 0 | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		return rv.Uint() == 0 | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return math.Float64bits(rv.Float()) == 0 | ||||
| 	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Func: | ||||
| 		return rv.IsNil() | ||||
| 	case reflect.Slice: | ||||
| 		return rv.IsNil() || rv.Len() == 0 | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										211
									
								
								vendor/github.com/goccy/go-json/internal/encoder/indent.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								vendor/github.com/goccy/go-json/internal/encoder/indent.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,211 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/errors" | ||||
| ) | ||||
|  | ||||
| func takeIndentSrcRuntimeContext(src []byte) (*RuntimeContext, []byte) { | ||||
| 	ctx := TakeRuntimeContext() | ||||
| 	buf := ctx.Buf[:0] | ||||
| 	buf = append(append(buf, src...), nul) | ||||
| 	ctx.Buf = buf | ||||
| 	return ctx, buf | ||||
| } | ||||
|  | ||||
| func Indent(buf *bytes.Buffer, src []byte, prefix, indentStr string) error { | ||||
| 	if len(src) == 0 { | ||||
| 		return errors.ErrUnexpectedEndOfJSON("", 0) | ||||
| 	} | ||||
|  | ||||
| 	srcCtx, srcBuf := takeIndentSrcRuntimeContext(src) | ||||
| 	dstCtx := TakeRuntimeContext() | ||||
| 	dst := dstCtx.Buf[:0] | ||||
|  | ||||
| 	dst, err := indentAndWrite(buf, dst, srcBuf, prefix, indentStr) | ||||
| 	if err != nil { | ||||
| 		ReleaseRuntimeContext(srcCtx) | ||||
| 		ReleaseRuntimeContext(dstCtx) | ||||
| 		return err | ||||
| 	} | ||||
| 	dstCtx.Buf = dst | ||||
| 	ReleaseRuntimeContext(srcCtx) | ||||
| 	ReleaseRuntimeContext(dstCtx) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func indentAndWrite(buf *bytes.Buffer, dst []byte, src []byte, prefix, indentStr string) ([]byte, error) { | ||||
| 	dst, err := doIndent(dst, src, prefix, indentStr, false) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if _, err := buf.Write(dst); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return dst, nil | ||||
| } | ||||
|  | ||||
| func doIndent(dst, src []byte, prefix, indentStr string, escape bool) ([]byte, error) { | ||||
| 	buf, cursor, err := indentValue(dst, src, 0, 0, []byte(prefix), []byte(indentStr), escape) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := validateEndBuf(src, cursor); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return buf, nil | ||||
| } | ||||
|  | ||||
| func indentValue( | ||||
| 	dst []byte, | ||||
| 	src []byte, | ||||
| 	indentNum int, | ||||
| 	cursor int64, | ||||
| 	prefix []byte, | ||||
| 	indentBytes []byte, | ||||
| 	escape bool) ([]byte, int64, error) { | ||||
| 	for { | ||||
| 		switch src[cursor] { | ||||
| 		case ' ', '\t', '\n', '\r': | ||||
| 			cursor++ | ||||
| 			continue | ||||
| 		case '{': | ||||
| 			return indentObject(dst, src, indentNum, cursor, prefix, indentBytes, escape) | ||||
| 		case '}': | ||||
| 			return nil, 0, errors.ErrSyntax("unexpected character '}'", cursor) | ||||
| 		case '[': | ||||
| 			return indentArray(dst, src, indentNum, cursor, prefix, indentBytes, escape) | ||||
| 		case ']': | ||||
| 			return nil, 0, errors.ErrSyntax("unexpected character ']'", cursor) | ||||
| 		case '"': | ||||
| 			return compactString(dst, src, cursor, escape) | ||||
| 		case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': | ||||
| 			return compactNumber(dst, src, cursor) | ||||
| 		case 't': | ||||
| 			return compactTrue(dst, src, cursor) | ||||
| 		case 'f': | ||||
| 			return compactFalse(dst, src, cursor) | ||||
| 		case 'n': | ||||
| 			return compactNull(dst, src, cursor) | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrSyntax(fmt.Sprintf("unexpected character '%c'", src[cursor]), cursor) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func indentObject( | ||||
| 	dst []byte, | ||||
| 	src []byte, | ||||
| 	indentNum int, | ||||
| 	cursor int64, | ||||
| 	prefix []byte, | ||||
| 	indentBytes []byte, | ||||
| 	escape bool) ([]byte, int64, error) { | ||||
| 	if src[cursor] == '{' { | ||||
| 		dst = append(dst, '{') | ||||
| 	} else { | ||||
| 		return nil, 0, errors.ErrExpected("expected { character for object value", cursor) | ||||
| 	} | ||||
| 	cursor = skipWhiteSpace(src, cursor+1) | ||||
| 	if src[cursor] == '}' { | ||||
| 		dst = append(dst, '}') | ||||
| 		return dst, cursor + 1, nil | ||||
| 	} | ||||
| 	indentNum++ | ||||
| 	var err error | ||||
| 	for { | ||||
| 		dst = append(append(dst, '\n'), prefix...) | ||||
| 		for i := 0; i < indentNum; i++ { | ||||
| 			dst = append(dst, indentBytes...) | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		dst, cursor, err = compactString(dst, src, cursor, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		if src[cursor] != ':' { | ||||
| 			return nil, 0, errors.ErrSyntax( | ||||
| 				fmt.Sprintf("invalid character '%c' after object key", src[cursor]), | ||||
| 				cursor+1, | ||||
| 			) | ||||
| 		} | ||||
| 		dst = append(dst, ':', ' ') | ||||
| 		dst, cursor, err = indentValue(dst, src, indentNum, cursor+1, prefix, indentBytes, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		switch src[cursor] { | ||||
| 		case '}': | ||||
| 			dst = append(append(dst, '\n'), prefix...) | ||||
| 			for i := 0; i < indentNum-1; i++ { | ||||
| 				dst = append(dst, indentBytes...) | ||||
| 			} | ||||
| 			dst = append(dst, '}') | ||||
| 			cursor++ | ||||
| 			return dst, cursor, nil | ||||
| 		case ',': | ||||
| 			dst = append(dst, ',') | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrSyntax( | ||||
| 				fmt.Sprintf("invalid character '%c' after object key:value pair", src[cursor]), | ||||
| 				cursor+1, | ||||
| 			) | ||||
| 		} | ||||
| 		cursor++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func indentArray( | ||||
| 	dst []byte, | ||||
| 	src []byte, | ||||
| 	indentNum int, | ||||
| 	cursor int64, | ||||
| 	prefix []byte, | ||||
| 	indentBytes []byte, | ||||
| 	escape bool) ([]byte, int64, error) { | ||||
| 	if src[cursor] == '[' { | ||||
| 		dst = append(dst, '[') | ||||
| 	} else { | ||||
| 		return nil, 0, errors.ErrExpected("expected [ character for array value", cursor) | ||||
| 	} | ||||
| 	cursor = skipWhiteSpace(src, cursor+1) | ||||
| 	if src[cursor] == ']' { | ||||
| 		dst = append(dst, ']') | ||||
| 		return dst, cursor + 1, nil | ||||
| 	} | ||||
| 	indentNum++ | ||||
| 	var err error | ||||
| 	for { | ||||
| 		dst = append(append(dst, '\n'), prefix...) | ||||
| 		for i := 0; i < indentNum; i++ { | ||||
| 			dst = append(dst, indentBytes...) | ||||
| 		} | ||||
| 		dst, cursor, err = indentValue(dst, src, indentNum, cursor, prefix, indentBytes, escape) | ||||
| 		if err != nil { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		cursor = skipWhiteSpace(src, cursor) | ||||
| 		switch src[cursor] { | ||||
| 		case ']': | ||||
| 			dst = append(append(dst, '\n'), prefix...) | ||||
| 			for i := 0; i < indentNum-1; i++ { | ||||
| 				dst = append(dst, indentBytes...) | ||||
| 			} | ||||
| 			dst = append(dst, ']') | ||||
| 			cursor++ | ||||
| 			return dst, cursor, nil | ||||
| 		case ',': | ||||
| 			dst = append(dst, ',') | ||||
| 		default: | ||||
| 			return nil, 0, errors.ErrSyntax( | ||||
| 				fmt.Sprintf("invalid character '%c' after array value", src[cursor]), | ||||
| 				cursor+1, | ||||
| 			) | ||||
| 		} | ||||
| 		cursor++ | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										130
									
								
								vendor/github.com/goccy/go-json/internal/encoder/int.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								vendor/github.com/goccy/go-json/internal/encoder/int.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| var endianness int | ||||
|  | ||||
| func init() { | ||||
| 	var b [2]byte | ||||
| 	*(*uint16)(unsafe.Pointer(&b)) = uint16(0xABCD) | ||||
|  | ||||
| 	switch b[0] { | ||||
| 	case 0xCD: | ||||
| 		endianness = 0 // LE | ||||
| 	case 0xAB: | ||||
| 		endianness = 1 // BE | ||||
| 	default: | ||||
| 		panic("could not determine endianness") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // "00010203...96979899" cast to []uint16 | ||||
| var intLELookup = [100]uint16{ | ||||
| 	0x3030, 0x3130, 0x3230, 0x3330, 0x3430, 0x3530, 0x3630, 0x3730, 0x3830, 0x3930, | ||||
| 	0x3031, 0x3131, 0x3231, 0x3331, 0x3431, 0x3531, 0x3631, 0x3731, 0x3831, 0x3931, | ||||
| 	0x3032, 0x3132, 0x3232, 0x3332, 0x3432, 0x3532, 0x3632, 0x3732, 0x3832, 0x3932, | ||||
| 	0x3033, 0x3133, 0x3233, 0x3333, 0x3433, 0x3533, 0x3633, 0x3733, 0x3833, 0x3933, | ||||
| 	0x3034, 0x3134, 0x3234, 0x3334, 0x3434, 0x3534, 0x3634, 0x3734, 0x3834, 0x3934, | ||||
| 	0x3035, 0x3135, 0x3235, 0x3335, 0x3435, 0x3535, 0x3635, 0x3735, 0x3835, 0x3935, | ||||
| 	0x3036, 0x3136, 0x3236, 0x3336, 0x3436, 0x3536, 0x3636, 0x3736, 0x3836, 0x3936, | ||||
| 	0x3037, 0x3137, 0x3237, 0x3337, 0x3437, 0x3537, 0x3637, 0x3737, 0x3837, 0x3937, | ||||
| 	0x3038, 0x3138, 0x3238, 0x3338, 0x3438, 0x3538, 0x3638, 0x3738, 0x3838, 0x3938, | ||||
| 	0x3039, 0x3139, 0x3239, 0x3339, 0x3439, 0x3539, 0x3639, 0x3739, 0x3839, 0x3939, | ||||
| } | ||||
|  | ||||
| var intBELookup = [100]uint16{ | ||||
| 	0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, | ||||
| 	0x3130, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, | ||||
| 	0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, | ||||
| 	0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339, | ||||
| 	0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439, | ||||
| 	0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, | ||||
| 	0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, | ||||
| 	0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, | ||||
| 	0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, | ||||
| 	0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, | ||||
| } | ||||
|  | ||||
| var intLookup = [2]*[100]uint16{&intLELookup, &intBELookup} | ||||
|  | ||||
| func numMask(numBitSize uint8) uint64 { | ||||
| 	return 1<<numBitSize - 1 | ||||
| } | ||||
|  | ||||
| func AppendInt(_ *RuntimeContext, out []byte, u64 uint64, code *Opcode) []byte { | ||||
| 	mask := numMask(code.NumBitSize) | ||||
| 	n := u64 & mask | ||||
| 	negative := (u64>>(code.NumBitSize-1))&1 == 1 | ||||
| 	if !negative { | ||||
| 		if n < 10 { | ||||
| 			return append(out, byte(n+'0')) | ||||
| 		} else if n < 100 { | ||||
| 			u := intLELookup[n] | ||||
| 			return append(out, byte(u), byte(u>>8)) | ||||
| 		} | ||||
| 	} else { | ||||
| 		n = -n & mask | ||||
| 	} | ||||
|  | ||||
| 	lookup := intLookup[endianness] | ||||
|  | ||||
| 	var b [22]byte | ||||
| 	u := (*[11]uint16)(unsafe.Pointer(&b)) | ||||
| 	i := 11 | ||||
|  | ||||
| 	for n >= 100 { | ||||
| 		j := n % 100 | ||||
| 		n /= 100 | ||||
| 		i-- | ||||
| 		u[i] = lookup[j] | ||||
| 	} | ||||
|  | ||||
| 	i-- | ||||
| 	u[i] = lookup[n] | ||||
|  | ||||
| 	i *= 2 // convert to byte index | ||||
| 	if n < 10 { | ||||
| 		i++ // remove leading zero | ||||
| 	} | ||||
| 	if negative { | ||||
| 		i-- | ||||
| 		b[i] = '-' | ||||
| 	} | ||||
|  | ||||
| 	return append(out, b[i:]...) | ||||
| } | ||||
|  | ||||
| func AppendUint(_ *RuntimeContext, out []byte, u64 uint64, code *Opcode) []byte { | ||||
| 	mask := numMask(code.NumBitSize) | ||||
| 	n := u64 & mask | ||||
| 	if n < 10 { | ||||
| 		return append(out, byte(n+'0')) | ||||
| 	} else if n < 100 { | ||||
| 		u := intLELookup[n] | ||||
| 		return append(out, byte(u), byte(u>>8)) | ||||
| 	} | ||||
|  | ||||
| 	lookup := intLookup[endianness] | ||||
|  | ||||
| 	var b [22]byte | ||||
| 	u := (*[11]uint16)(unsafe.Pointer(&b)) | ||||
| 	i := 11 | ||||
|  | ||||
| 	for n >= 100 { | ||||
| 		j := n % 100 | ||||
| 		n /= 100 | ||||
| 		i-- | ||||
| 		u[i] = lookup[j] | ||||
| 	} | ||||
|  | ||||
| 	i-- | ||||
| 	u[i] = lookup[n] | ||||
|  | ||||
| 	i *= 2 // convert to byte index | ||||
| 	if n < 10 { | ||||
| 		i++ // remove leading zero | ||||
| 	} | ||||
| 	return append(out, b[i:]...) | ||||
| } | ||||
							
								
								
									
										8
									
								
								vendor/github.com/goccy/go-json/internal/encoder/map112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/goccy/go-json/internal/encoder/map112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| // +build !go1.13 | ||||
|  | ||||
| package encoder | ||||
|  | ||||
| import "unsafe" | ||||
|  | ||||
| //go:linkname MapIterValue reflect.mapitervalue | ||||
| func MapIterValue(it unsafe.Pointer) unsafe.Pointer | ||||
							
								
								
									
										8
									
								
								vendor/github.com/goccy/go-json/internal/encoder/map113.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/goccy/go-json/internal/encoder/map113.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| // +build go1.13 | ||||
|  | ||||
| package encoder | ||||
|  | ||||
| import "unsafe" | ||||
|  | ||||
| //go:linkname MapIterValue reflect.mapiterelem | ||||
| func MapIterValue(it unsafe.Pointer) unsafe.Pointer | ||||
							
								
								
									
										766
									
								
								vendor/github.com/goccy/go-json/internal/encoder/opcode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										766
									
								
								vendor/github.com/goccy/go-json/internal/encoder/opcode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,766 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| const uintptrSize = 4 << (^uintptr(0) >> 63) | ||||
|  | ||||
| type OpFlags uint16 | ||||
|  | ||||
| const ( | ||||
| 	AnonymousHeadFlags    OpFlags = 1 << 0 | ||||
| 	AnonymousKeyFlags     OpFlags = 1 << 1 | ||||
| 	IndirectFlags         OpFlags = 1 << 2 | ||||
| 	IsTaggedKeyFlags      OpFlags = 1 << 3 | ||||
| 	NilCheckFlags         OpFlags = 1 << 4 | ||||
| 	AddrForMarshalerFlags OpFlags = 1 << 5 | ||||
| 	IsNextOpPtrTypeFlags  OpFlags = 1 << 6 | ||||
| 	IsNilableTypeFlags    OpFlags = 1 << 7 | ||||
| 	MarshalerContextFlags OpFlags = 1 << 8 | ||||
| ) | ||||
|  | ||||
| type Opcode struct { | ||||
| 	Op         OpType  // operation type | ||||
| 	Idx        uint32  // offset to access ptr | ||||
| 	Next       *Opcode // next opcode | ||||
| 	End        *Opcode // array/slice/struct/map end | ||||
| 	NextField  *Opcode // next struct field | ||||
| 	Key        string  // struct field key | ||||
| 	Offset     uint32  // offset size from struct header | ||||
| 	PtrNum     uint8   // pointer number: e.g. double pointer is 2. | ||||
| 	NumBitSize uint8 | ||||
| 	Flags      OpFlags | ||||
|  | ||||
| 	Type       *runtime.Type // go type | ||||
| 	PrevField  *Opcode       // prev struct field | ||||
| 	Jmp        *CompiledCode // for recursive call | ||||
| 	ElemIdx    uint32        // offset to access array/slice/map elem | ||||
| 	Length     uint32        // offset to access slice/map length or array length | ||||
| 	MapIter    uint32        // offset to access map iterator | ||||
| 	MapPos     uint32        // offset to access position list for sorted map | ||||
| 	Indent     uint32        // indent number | ||||
| 	Size       uint32        // array/slice elem size | ||||
| 	DisplayIdx uint32        // opcode index | ||||
| 	DisplayKey string        // key text to display | ||||
| } | ||||
|  | ||||
| func (c *Opcode) MaxIdx() uint32 { | ||||
| 	max := uint32(0) | ||||
| 	for _, value := range []uint32{ | ||||
| 		c.Idx, | ||||
| 		c.ElemIdx, | ||||
| 		c.Length, | ||||
| 		c.MapIter, | ||||
| 		c.MapPos, | ||||
| 		c.Size, | ||||
| 	} { | ||||
| 		if max < value { | ||||
| 			max = value | ||||
| 		} | ||||
| 	} | ||||
| 	return max | ||||
| } | ||||
|  | ||||
| func (c *Opcode) ToHeaderType(isString bool) OpType { | ||||
| 	switch c.Op { | ||||
| 	case OpInt: | ||||
| 		if isString { | ||||
| 			return OpStructHeadIntString | ||||
| 		} | ||||
| 		return OpStructHeadInt | ||||
| 	case OpIntPtr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadIntPtrString | ||||
| 		} | ||||
| 		return OpStructHeadIntPtr | ||||
| 	case OpUint: | ||||
| 		if isString { | ||||
| 			return OpStructHeadUintString | ||||
| 		} | ||||
| 		return OpStructHeadUint | ||||
| 	case OpUintPtr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadUintPtrString | ||||
| 		} | ||||
| 		return OpStructHeadUintPtr | ||||
| 	case OpFloat32: | ||||
| 		if isString { | ||||
| 			return OpStructHeadFloat32String | ||||
| 		} | ||||
| 		return OpStructHeadFloat32 | ||||
| 	case OpFloat32Ptr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadFloat32PtrString | ||||
| 		} | ||||
| 		return OpStructHeadFloat32Ptr | ||||
| 	case OpFloat64: | ||||
| 		if isString { | ||||
| 			return OpStructHeadFloat64String | ||||
| 		} | ||||
| 		return OpStructHeadFloat64 | ||||
| 	case OpFloat64Ptr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadFloat64PtrString | ||||
| 		} | ||||
| 		return OpStructHeadFloat64Ptr | ||||
| 	case OpString: | ||||
| 		if isString { | ||||
| 			return OpStructHeadStringString | ||||
| 		} | ||||
| 		return OpStructHeadString | ||||
| 	case OpStringPtr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadStringPtrString | ||||
| 		} | ||||
| 		return OpStructHeadStringPtr | ||||
| 	case OpNumber: | ||||
| 		if isString { | ||||
| 			return OpStructHeadNumberString | ||||
| 		} | ||||
| 		return OpStructHeadNumber | ||||
| 	case OpNumberPtr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadNumberPtrString | ||||
| 		} | ||||
| 		return OpStructHeadNumberPtr | ||||
| 	case OpBool: | ||||
| 		if isString { | ||||
| 			return OpStructHeadBoolString | ||||
| 		} | ||||
| 		return OpStructHeadBool | ||||
| 	case OpBoolPtr: | ||||
| 		if isString { | ||||
| 			return OpStructHeadBoolPtrString | ||||
| 		} | ||||
| 		return OpStructHeadBoolPtr | ||||
| 	case OpBytes: | ||||
| 		return OpStructHeadBytes | ||||
| 	case OpBytesPtr: | ||||
| 		return OpStructHeadBytesPtr | ||||
| 	case OpMap: | ||||
| 		return OpStructHeadMap | ||||
| 	case OpMapPtr: | ||||
| 		c.Op = OpMap | ||||
| 		return OpStructHeadMapPtr | ||||
| 	case OpArray: | ||||
| 		return OpStructHeadArray | ||||
| 	case OpArrayPtr: | ||||
| 		c.Op = OpArray | ||||
| 		return OpStructHeadArrayPtr | ||||
| 	case OpSlice: | ||||
| 		return OpStructHeadSlice | ||||
| 	case OpSlicePtr: | ||||
| 		c.Op = OpSlice | ||||
| 		return OpStructHeadSlicePtr | ||||
| 	case OpMarshalJSON: | ||||
| 		return OpStructHeadMarshalJSON | ||||
| 	case OpMarshalJSONPtr: | ||||
| 		return OpStructHeadMarshalJSONPtr | ||||
| 	case OpMarshalText: | ||||
| 		return OpStructHeadMarshalText | ||||
| 	case OpMarshalTextPtr: | ||||
| 		return OpStructHeadMarshalTextPtr | ||||
| 	} | ||||
| 	return OpStructHead | ||||
| } | ||||
|  | ||||
| func (c *Opcode) ToFieldType(isString bool) OpType { | ||||
| 	switch c.Op { | ||||
| 	case OpInt: | ||||
| 		if isString { | ||||
| 			return OpStructFieldIntString | ||||
| 		} | ||||
| 		return OpStructFieldInt | ||||
| 	case OpIntPtr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldIntPtrString | ||||
| 		} | ||||
| 		return OpStructFieldIntPtr | ||||
| 	case OpUint: | ||||
| 		if isString { | ||||
| 			return OpStructFieldUintString | ||||
| 		} | ||||
| 		return OpStructFieldUint | ||||
| 	case OpUintPtr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldUintPtrString | ||||
| 		} | ||||
| 		return OpStructFieldUintPtr | ||||
| 	case OpFloat32: | ||||
| 		if isString { | ||||
| 			return OpStructFieldFloat32String | ||||
| 		} | ||||
| 		return OpStructFieldFloat32 | ||||
| 	case OpFloat32Ptr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldFloat32PtrString | ||||
| 		} | ||||
| 		return OpStructFieldFloat32Ptr | ||||
| 	case OpFloat64: | ||||
| 		if isString { | ||||
| 			return OpStructFieldFloat64String | ||||
| 		} | ||||
| 		return OpStructFieldFloat64 | ||||
| 	case OpFloat64Ptr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldFloat64PtrString | ||||
| 		} | ||||
| 		return OpStructFieldFloat64Ptr | ||||
| 	case OpString: | ||||
| 		if isString { | ||||
| 			return OpStructFieldStringString | ||||
| 		} | ||||
| 		return OpStructFieldString | ||||
| 	case OpStringPtr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldStringPtrString | ||||
| 		} | ||||
| 		return OpStructFieldStringPtr | ||||
| 	case OpNumber: | ||||
| 		if isString { | ||||
| 			return OpStructFieldNumberString | ||||
| 		} | ||||
| 		return OpStructFieldNumber | ||||
| 	case OpNumberPtr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldNumberPtrString | ||||
| 		} | ||||
| 		return OpStructFieldNumberPtr | ||||
| 	case OpBool: | ||||
| 		if isString { | ||||
| 			return OpStructFieldBoolString | ||||
| 		} | ||||
| 		return OpStructFieldBool | ||||
| 	case OpBoolPtr: | ||||
| 		if isString { | ||||
| 			return OpStructFieldBoolPtrString | ||||
| 		} | ||||
| 		return OpStructFieldBoolPtr | ||||
| 	case OpBytes: | ||||
| 		return OpStructFieldBytes | ||||
| 	case OpBytesPtr: | ||||
| 		return OpStructFieldBytesPtr | ||||
| 	case OpMap: | ||||
| 		return OpStructFieldMap | ||||
| 	case OpMapPtr: | ||||
| 		c.Op = OpMap | ||||
| 		return OpStructFieldMapPtr | ||||
| 	case OpArray: | ||||
| 		return OpStructFieldArray | ||||
| 	case OpArrayPtr: | ||||
| 		c.Op = OpArray | ||||
| 		return OpStructFieldArrayPtr | ||||
| 	case OpSlice: | ||||
| 		return OpStructFieldSlice | ||||
| 	case OpSlicePtr: | ||||
| 		c.Op = OpSlice | ||||
| 		return OpStructFieldSlicePtr | ||||
| 	case OpMarshalJSON: | ||||
| 		return OpStructFieldMarshalJSON | ||||
| 	case OpMarshalJSONPtr: | ||||
| 		return OpStructFieldMarshalJSONPtr | ||||
| 	case OpMarshalText: | ||||
| 		return OpStructFieldMarshalText | ||||
| 	case OpMarshalTextPtr: | ||||
| 		return OpStructFieldMarshalTextPtr | ||||
| 	} | ||||
| 	return OpStructField | ||||
| } | ||||
|  | ||||
| func newOpCode(ctx *compileContext, op OpType) *Opcode { | ||||
| 	return newOpCodeWithNext(ctx, op, newEndOp(ctx)) | ||||
| } | ||||
|  | ||||
| func opcodeOffset(idx int) uint32 { | ||||
| 	return uint32(idx) * uintptrSize | ||||
| } | ||||
|  | ||||
| func copyOpcode(code *Opcode) *Opcode { | ||||
| 	codeMap := map[uintptr]*Opcode{} | ||||
| 	return code.copy(codeMap) | ||||
| } | ||||
|  | ||||
| func setTotalLengthToInterfaceOp(code *Opcode) { | ||||
| 	c := code | ||||
| 	for c.Op != OpEnd && c.Op != OpInterfaceEnd { | ||||
| 		if c.Op == OpInterface { | ||||
| 			c.Length = uint32(code.TotalLength()) | ||||
| 		} | ||||
| 		switch c.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			c = c.End | ||||
| 		default: | ||||
| 			c = c.Next | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ToEndCode(code *Opcode) *Opcode { | ||||
| 	c := code | ||||
| 	for c.Op != OpEnd && c.Op != OpInterfaceEnd { | ||||
| 		switch c.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			c = c.End | ||||
| 		default: | ||||
| 			c = c.Next | ||||
| 		} | ||||
| 	} | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func copyToInterfaceOpcode(code *Opcode) *Opcode { | ||||
| 	copied := copyOpcode(code) | ||||
| 	c := copied | ||||
| 	c = ToEndCode(c) | ||||
| 	c.Idx += uintptrSize | ||||
| 	c.ElemIdx = c.Idx + uintptrSize | ||||
| 	c.Length = c.Idx + 2*uintptrSize | ||||
| 	c.Op = OpInterfaceEnd | ||||
| 	return copied | ||||
| } | ||||
|  | ||||
| func newOpCodeWithNext(ctx *compileContext, op OpType, next *Opcode) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         op, | ||||
| 		Idx:        opcodeOffset(ctx.ptrIndex), | ||||
| 		Next:       next, | ||||
| 		Type:       ctx.typ, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newEndOp(ctx *compileContext) *Opcode { | ||||
| 	return newOpCodeWithNext(ctx, OpEnd, nil) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) copy(codeMap map[uintptr]*Opcode) *Opcode { | ||||
| 	if c == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	addr := uintptr(unsafe.Pointer(c)) | ||||
| 	if code, exists := codeMap[addr]; exists { | ||||
| 		return code | ||||
| 	} | ||||
| 	copied := &Opcode{ | ||||
| 		Op:         c.Op, | ||||
| 		Key:        c.Key, | ||||
| 		PtrNum:     c.PtrNum, | ||||
| 		NumBitSize: c.NumBitSize, | ||||
| 		Flags:      c.Flags, | ||||
| 		Idx:        c.Idx, | ||||
| 		Offset:     c.Offset, | ||||
| 		Type:       c.Type, | ||||
| 		DisplayIdx: c.DisplayIdx, | ||||
| 		DisplayKey: c.DisplayKey, | ||||
| 		ElemIdx:    c.ElemIdx, | ||||
| 		Length:     c.Length, | ||||
| 		MapIter:    c.MapIter, | ||||
| 		MapPos:     c.MapPos, | ||||
| 		Size:       c.Size, | ||||
| 		Indent:     c.Indent, | ||||
| 	} | ||||
| 	codeMap[addr] = copied | ||||
| 	copied.End = c.End.copy(codeMap) | ||||
| 	copied.PrevField = c.PrevField.copy(codeMap) | ||||
| 	copied.NextField = c.NextField.copy(codeMap) | ||||
| 	copied.Next = c.Next.copy(codeMap) | ||||
| 	copied.Jmp = c.Jmp | ||||
| 	return copied | ||||
| } | ||||
|  | ||||
| func (c *Opcode) BeforeLastCode() *Opcode { | ||||
| 	code := c | ||||
| 	for { | ||||
| 		var nextCode *Opcode | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			nextCode = code.End | ||||
| 		default: | ||||
| 			nextCode = code.Next | ||||
| 		} | ||||
| 		if nextCode.Op == OpEnd { | ||||
| 			return code | ||||
| 		} | ||||
| 		code = nextCode | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Opcode) TotalLength() int { | ||||
| 	var idx int | ||||
| 	code := c | ||||
| 	for code.Op != OpEnd && code.Op != OpInterfaceEnd { | ||||
| 		maxIdx := int(code.MaxIdx() / uintptrSize) | ||||
| 		if idx < maxIdx { | ||||
| 			idx = maxIdx | ||||
| 		} | ||||
| 		if code.Op == OpRecursiveEnd { | ||||
| 			break | ||||
| 		} | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			code = code.End | ||||
| 		default: | ||||
| 			code = code.Next | ||||
| 		} | ||||
| 	} | ||||
| 	maxIdx := int(code.MaxIdx() / uintptrSize) | ||||
| 	if idx < maxIdx { | ||||
| 		idx = maxIdx | ||||
| 	} | ||||
| 	return idx + 1 | ||||
| } | ||||
|  | ||||
| func (c *Opcode) decOpcodeIndex() { | ||||
| 	for code := c; code.Op != OpEnd; { | ||||
| 		code.DisplayIdx-- | ||||
| 		if code.Idx > 0 { | ||||
| 			code.Idx -= uintptrSize | ||||
| 		} | ||||
| 		if code.ElemIdx > 0 { | ||||
| 			code.ElemIdx -= uintptrSize | ||||
| 		} | ||||
| 		if code.MapIter > 0 { | ||||
| 			code.MapIter -= uintptrSize | ||||
| 		} | ||||
| 		if code.Length > 0 && code.Op.CodeType() != CodeArrayHead && code.Op.CodeType() != CodeArrayElem { | ||||
| 			code.Length -= uintptrSize | ||||
| 		} | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			code = code.End | ||||
| 		default: | ||||
| 			code = code.Next | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Opcode) decIndent() { | ||||
| 	for code := c; code.Op != OpEnd; { | ||||
| 		code.Indent-- | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			code = code.End | ||||
| 		default: | ||||
| 			code = code.Next | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpHead(code *Opcode) string { | ||||
| 	var length uint32 | ||||
| 	if code.Op.CodeType() == CodeArrayHead { | ||||
| 		length = code.Length | ||||
| 	} else { | ||||
| 		length = code.Length / uintptrSize | ||||
| 	} | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][elemIdx:%d][length:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.ElemIdx/uintptrSize, | ||||
| 		length, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpMapHead(code *Opcode) string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][elemIdx:%d][length:%d][mapIter:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.ElemIdx/uintptrSize, | ||||
| 		code.Length/uintptrSize, | ||||
| 		code.MapIter/uintptrSize, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpMapEnd(code *Opcode) string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][mapPos:%d][length:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.MapPos/uintptrSize, | ||||
| 		code.Length/uintptrSize, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpElem(code *Opcode) string { | ||||
| 	var length uint32 | ||||
| 	if code.Op.CodeType() == CodeArrayElem { | ||||
| 		length = code.Length | ||||
| 	} else { | ||||
| 		length = code.Length / uintptrSize | ||||
| 	} | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][elemIdx:%d][length:%d][size:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.ElemIdx/uintptrSize, | ||||
| 		length, | ||||
| 		code.Size, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpField(code *Opcode) string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][key:%s][offset:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.DisplayKey, | ||||
| 		code.Offset, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpKey(code *Opcode) string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][elemIdx:%d][length:%d][mapIter:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.ElemIdx/uintptrSize, | ||||
| 		code.Length/uintptrSize, | ||||
| 		code.MapIter/uintptrSize, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) dumpValue(code *Opcode) string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`[%d]%s%s ([idx:%d][mapIter:%d])`, | ||||
| 		code.DisplayIdx, | ||||
| 		strings.Repeat("-", int(code.Indent)), | ||||
| 		code.Op, | ||||
| 		code.Idx/uintptrSize, | ||||
| 		code.MapIter/uintptrSize, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (c *Opcode) Dump() string { | ||||
| 	codes := []string{} | ||||
| 	for code := c; code.Op != OpEnd && code.Op != OpInterfaceEnd; { | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeSliceHead: | ||||
| 			codes = append(codes, c.dumpHead(code)) | ||||
| 			code = code.Next | ||||
| 		case CodeMapHead: | ||||
| 			codes = append(codes, c.dumpMapHead(code)) | ||||
| 			code = code.Next | ||||
| 		case CodeArrayElem, CodeSliceElem: | ||||
| 			codes = append(codes, c.dumpElem(code)) | ||||
| 			code = code.End | ||||
| 		case CodeMapKey: | ||||
| 			codes = append(codes, c.dumpKey(code)) | ||||
| 			code = code.End | ||||
| 		case CodeMapValue: | ||||
| 			codes = append(codes, c.dumpValue(code)) | ||||
| 			code = code.Next | ||||
| 		case CodeMapEnd: | ||||
| 			codes = append(codes, c.dumpMapEnd(code)) | ||||
| 			code = code.Next | ||||
| 		case CodeStructField: | ||||
| 			codes = append(codes, c.dumpField(code)) | ||||
| 			code = code.Next | ||||
| 		case CodeStructEnd: | ||||
| 			codes = append(codes, c.dumpField(code)) | ||||
| 			code = code.Next | ||||
| 		default: | ||||
| 			codes = append(codes, fmt.Sprintf( | ||||
| 				"[%d]%s%s ([idx:%d])", | ||||
| 				code.DisplayIdx, | ||||
| 				strings.Repeat("-", int(code.Indent)), | ||||
| 				code.Op, | ||||
| 				code.Idx/uintptrSize, | ||||
| 			)) | ||||
| 			code = code.Next | ||||
| 		} | ||||
| 	} | ||||
| 	return strings.Join(codes, "\n") | ||||
| } | ||||
|  | ||||
| func prevField(code *Opcode, removedFields map[*Opcode]struct{}) *Opcode { | ||||
| 	if _, exists := removedFields[code]; exists { | ||||
| 		return prevField(code.PrevField, removedFields) | ||||
| 	} | ||||
| 	return code | ||||
| } | ||||
|  | ||||
| func nextField(code *Opcode, removedFields map[*Opcode]struct{}) *Opcode { | ||||
| 	if _, exists := removedFields[code]; exists { | ||||
| 		return nextField(code.NextField, removedFields) | ||||
| 	} | ||||
| 	return code | ||||
| } | ||||
|  | ||||
| func linkPrevToNextField(cur *Opcode, removedFields map[*Opcode]struct{}) { | ||||
| 	prev := prevField(cur.PrevField, removedFields) | ||||
| 	prev.NextField = nextField(cur.NextField, removedFields) | ||||
| 	code := prev | ||||
| 	fcode := cur | ||||
| 	for { | ||||
| 		var nextCode *Opcode | ||||
| 		switch code.Op.CodeType() { | ||||
| 		case CodeArrayElem, CodeSliceElem, CodeMapKey: | ||||
| 			nextCode = code.End | ||||
| 		default: | ||||
| 			nextCode = code.Next | ||||
| 		} | ||||
| 		if nextCode == fcode { | ||||
| 			code.Next = fcode.Next | ||||
| 			break | ||||
| 		} else if nextCode.Op == OpEnd { | ||||
| 			break | ||||
| 		} | ||||
| 		code = nextCode | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newSliceHeaderCode(ctx *compileContext) *Opcode { | ||||
| 	idx := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	elemIdx := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	length := opcodeOffset(ctx.ptrIndex) | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpSlice, | ||||
| 		Idx:        idx, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    elemIdx, | ||||
| 		Length:     length, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newSliceElemCode(ctx *compileContext, head *Opcode, size uintptr) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpSliceElem, | ||||
| 		Idx:        head.Idx, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    head.ElemIdx, | ||||
| 		Length:     head.Length, | ||||
| 		Indent:     ctx.indent, | ||||
| 		Size:       uint32(size), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newArrayHeaderCode(ctx *compileContext, alen int) *Opcode { | ||||
| 	idx := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	elemIdx := opcodeOffset(ctx.ptrIndex) | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpArray, | ||||
| 		Idx:        idx, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    elemIdx, | ||||
| 		Indent:     ctx.indent, | ||||
| 		Length:     uint32(alen), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newArrayElemCode(ctx *compileContext, head *Opcode, length int, size uintptr) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpArrayElem, | ||||
| 		Idx:        head.Idx, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    head.ElemIdx, | ||||
| 		Length:     uint32(length), | ||||
| 		Indent:     ctx.indent, | ||||
| 		Size:       uint32(size), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newMapHeaderCode(ctx *compileContext) *Opcode { | ||||
| 	idx := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	elemIdx := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	length := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	mapIter := opcodeOffset(ctx.ptrIndex) | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpMap, | ||||
| 		Idx:        idx, | ||||
| 		Type:       ctx.typ, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    elemIdx, | ||||
| 		Length:     length, | ||||
| 		MapIter:    mapIter, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newMapKeyCode(ctx *compileContext, head *Opcode) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpMapKey, | ||||
| 		Idx:        opcodeOffset(ctx.ptrIndex), | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    head.ElemIdx, | ||||
| 		Length:     head.Length, | ||||
| 		MapIter:    head.MapIter, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newMapValueCode(ctx *compileContext, head *Opcode) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpMapValue, | ||||
| 		Idx:        opcodeOffset(ctx.ptrIndex), | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		ElemIdx:    head.ElemIdx, | ||||
| 		Length:     head.Length, | ||||
| 		MapIter:    head.MapIter, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newMapEndCode(ctx *compileContext, head *Opcode) *Opcode { | ||||
| 	mapPos := opcodeOffset(ctx.ptrIndex) | ||||
| 	ctx.incPtrIndex() | ||||
| 	idx := opcodeOffset(ctx.ptrIndex) | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpMapEnd, | ||||
| 		Idx:        idx, | ||||
| 		Next:       newEndOp(ctx), | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		Length:     head.Length, | ||||
| 		MapPos:     mapPos, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newInterfaceCode(ctx *compileContext) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpInterface, | ||||
| 		Idx:        opcodeOffset(ctx.ptrIndex), | ||||
| 		Next:       newEndOp(ctx), | ||||
| 		Type:       ctx.typ, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		Indent:     ctx.indent, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newRecursiveCode(ctx *compileContext, jmp *CompiledCode) *Opcode { | ||||
| 	return &Opcode{ | ||||
| 		Op:         OpRecursive, | ||||
| 		Idx:        opcodeOffset(ctx.ptrIndex), | ||||
| 		Next:       newEndOp(ctx), | ||||
| 		Type:       ctx.typ, | ||||
| 		DisplayIdx: ctx.opcodeIndex, | ||||
| 		Indent:     ctx.indent, | ||||
| 		Jmp:        jmp, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/github.com/goccy/go-json/internal/encoder/option.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/goccy/go-json/internal/encoder/option.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package encoder | ||||
|  | ||||
| import "context" | ||||
|  | ||||
| type OptionFlag uint8 | ||||
|  | ||||
| const ( | ||||
| 	HTMLEscapeOption OptionFlag = 1 << iota | ||||
| 	IndentOption | ||||
| 	UnorderedMapOption | ||||
| 	DebugOption | ||||
| 	ColorizeOption | ||||
| 	ContextOption | ||||
| ) | ||||
|  | ||||
| type Option struct { | ||||
| 	Flag        OptionFlag | ||||
| 	ColorScheme *ColorScheme | ||||
| 	Context     context.Context | ||||
| } | ||||
|  | ||||
| type EncodeFormat struct { | ||||
| 	Header string | ||||
| 	Footer string | ||||
| } | ||||
|  | ||||
| type EncodeFormatScheme struct { | ||||
| 	Int       EncodeFormat | ||||
| 	Uint      EncodeFormat | ||||
| 	Float     EncodeFormat | ||||
| 	Bool      EncodeFormat | ||||
| 	String    EncodeFormat | ||||
| 	Binary    EncodeFormat | ||||
| 	ObjectKey EncodeFormat | ||||
| 	Null      EncodeFormat | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	ColorScheme = EncodeFormatScheme | ||||
| 	ColorFormat = EncodeFormat | ||||
| ) | ||||
							
								
								
									
										934
									
								
								vendor/github.com/goccy/go-json/internal/encoder/optype.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										934
									
								
								vendor/github.com/goccy/go-json/internal/encoder/optype.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,934 @@ | ||||
| // Code generated by internal/cmd/generator. DO NOT EDIT! | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type CodeType int | ||||
|  | ||||
| const ( | ||||
| 	CodeOp          CodeType = 0 | ||||
| 	CodeArrayHead   CodeType = 1 | ||||
| 	CodeArrayElem   CodeType = 2 | ||||
| 	CodeSliceHead   CodeType = 3 | ||||
| 	CodeSliceElem   CodeType = 4 | ||||
| 	CodeMapHead     CodeType = 5 | ||||
| 	CodeMapKey      CodeType = 6 | ||||
| 	CodeMapValue    CodeType = 7 | ||||
| 	CodeMapEnd      CodeType = 8 | ||||
| 	CodeRecursive   CodeType = 9 | ||||
| 	CodeStructField CodeType = 10 | ||||
| 	CodeStructEnd   CodeType = 11 | ||||
| ) | ||||
|  | ||||
| var opTypeStrings = [401]string{ | ||||
| 	"End", | ||||
| 	"Interface", | ||||
| 	"Ptr", | ||||
| 	"SliceElem", | ||||
| 	"SliceEnd", | ||||
| 	"ArrayElem", | ||||
| 	"ArrayEnd", | ||||
| 	"MapKey", | ||||
| 	"MapValue", | ||||
| 	"MapEnd", | ||||
| 	"Recursive", | ||||
| 	"RecursivePtr", | ||||
| 	"RecursiveEnd", | ||||
| 	"InterfaceEnd", | ||||
| 	"StructAnonymousEnd", | ||||
| 	"Int", | ||||
| 	"Uint", | ||||
| 	"Float32", | ||||
| 	"Float64", | ||||
| 	"Bool", | ||||
| 	"String", | ||||
| 	"Bytes", | ||||
| 	"Number", | ||||
| 	"Array", | ||||
| 	"Map", | ||||
| 	"Slice", | ||||
| 	"Struct", | ||||
| 	"MarshalJSON", | ||||
| 	"MarshalText", | ||||
| 	"IntString", | ||||
| 	"UintString", | ||||
| 	"Float32String", | ||||
| 	"Float64String", | ||||
| 	"BoolString", | ||||
| 	"StringString", | ||||
| 	"NumberString", | ||||
| 	"IntPtr", | ||||
| 	"UintPtr", | ||||
| 	"Float32Ptr", | ||||
| 	"Float64Ptr", | ||||
| 	"BoolPtr", | ||||
| 	"StringPtr", | ||||
| 	"BytesPtr", | ||||
| 	"NumberPtr", | ||||
| 	"ArrayPtr", | ||||
| 	"MapPtr", | ||||
| 	"SlicePtr", | ||||
| 	"MarshalJSONPtr", | ||||
| 	"MarshalTextPtr", | ||||
| 	"InterfacePtr", | ||||
| 	"IntPtrString", | ||||
| 	"UintPtrString", | ||||
| 	"Float32PtrString", | ||||
| 	"Float64PtrString", | ||||
| 	"BoolPtrString", | ||||
| 	"StringPtrString", | ||||
| 	"NumberPtrString", | ||||
| 	"StructHeadInt", | ||||
| 	"StructHeadOmitEmptyInt", | ||||
| 	"StructPtrHeadInt", | ||||
| 	"StructPtrHeadOmitEmptyInt", | ||||
| 	"StructHeadUint", | ||||
| 	"StructHeadOmitEmptyUint", | ||||
| 	"StructPtrHeadUint", | ||||
| 	"StructPtrHeadOmitEmptyUint", | ||||
| 	"StructHeadFloat32", | ||||
| 	"StructHeadOmitEmptyFloat32", | ||||
| 	"StructPtrHeadFloat32", | ||||
| 	"StructPtrHeadOmitEmptyFloat32", | ||||
| 	"StructHeadFloat64", | ||||
| 	"StructHeadOmitEmptyFloat64", | ||||
| 	"StructPtrHeadFloat64", | ||||
| 	"StructPtrHeadOmitEmptyFloat64", | ||||
| 	"StructHeadBool", | ||||
| 	"StructHeadOmitEmptyBool", | ||||
| 	"StructPtrHeadBool", | ||||
| 	"StructPtrHeadOmitEmptyBool", | ||||
| 	"StructHeadString", | ||||
| 	"StructHeadOmitEmptyString", | ||||
| 	"StructPtrHeadString", | ||||
| 	"StructPtrHeadOmitEmptyString", | ||||
| 	"StructHeadBytes", | ||||
| 	"StructHeadOmitEmptyBytes", | ||||
| 	"StructPtrHeadBytes", | ||||
| 	"StructPtrHeadOmitEmptyBytes", | ||||
| 	"StructHeadNumber", | ||||
| 	"StructHeadOmitEmptyNumber", | ||||
| 	"StructPtrHeadNumber", | ||||
| 	"StructPtrHeadOmitEmptyNumber", | ||||
| 	"StructHeadArray", | ||||
| 	"StructHeadOmitEmptyArray", | ||||
| 	"StructPtrHeadArray", | ||||
| 	"StructPtrHeadOmitEmptyArray", | ||||
| 	"StructHeadMap", | ||||
| 	"StructHeadOmitEmptyMap", | ||||
| 	"StructPtrHeadMap", | ||||
| 	"StructPtrHeadOmitEmptyMap", | ||||
| 	"StructHeadSlice", | ||||
| 	"StructHeadOmitEmptySlice", | ||||
| 	"StructPtrHeadSlice", | ||||
| 	"StructPtrHeadOmitEmptySlice", | ||||
| 	"StructHeadStruct", | ||||
| 	"StructHeadOmitEmptyStruct", | ||||
| 	"StructPtrHeadStruct", | ||||
| 	"StructPtrHeadOmitEmptyStruct", | ||||
| 	"StructHeadMarshalJSON", | ||||
| 	"StructHeadOmitEmptyMarshalJSON", | ||||
| 	"StructPtrHeadMarshalJSON", | ||||
| 	"StructPtrHeadOmitEmptyMarshalJSON", | ||||
| 	"StructHeadMarshalText", | ||||
| 	"StructHeadOmitEmptyMarshalText", | ||||
| 	"StructPtrHeadMarshalText", | ||||
| 	"StructPtrHeadOmitEmptyMarshalText", | ||||
| 	"StructHeadIntString", | ||||
| 	"StructHeadOmitEmptyIntString", | ||||
| 	"StructPtrHeadIntString", | ||||
| 	"StructPtrHeadOmitEmptyIntString", | ||||
| 	"StructHeadUintString", | ||||
| 	"StructHeadOmitEmptyUintString", | ||||
| 	"StructPtrHeadUintString", | ||||
| 	"StructPtrHeadOmitEmptyUintString", | ||||
| 	"StructHeadFloat32String", | ||||
| 	"StructHeadOmitEmptyFloat32String", | ||||
| 	"StructPtrHeadFloat32String", | ||||
| 	"StructPtrHeadOmitEmptyFloat32String", | ||||
| 	"StructHeadFloat64String", | ||||
| 	"StructHeadOmitEmptyFloat64String", | ||||
| 	"StructPtrHeadFloat64String", | ||||
| 	"StructPtrHeadOmitEmptyFloat64String", | ||||
| 	"StructHeadBoolString", | ||||
| 	"StructHeadOmitEmptyBoolString", | ||||
| 	"StructPtrHeadBoolString", | ||||
| 	"StructPtrHeadOmitEmptyBoolString", | ||||
| 	"StructHeadStringString", | ||||
| 	"StructHeadOmitEmptyStringString", | ||||
| 	"StructPtrHeadStringString", | ||||
| 	"StructPtrHeadOmitEmptyStringString", | ||||
| 	"StructHeadNumberString", | ||||
| 	"StructHeadOmitEmptyNumberString", | ||||
| 	"StructPtrHeadNumberString", | ||||
| 	"StructPtrHeadOmitEmptyNumberString", | ||||
| 	"StructHeadIntPtr", | ||||
| 	"StructHeadOmitEmptyIntPtr", | ||||
| 	"StructPtrHeadIntPtr", | ||||
| 	"StructPtrHeadOmitEmptyIntPtr", | ||||
| 	"StructHeadUintPtr", | ||||
| 	"StructHeadOmitEmptyUintPtr", | ||||
| 	"StructPtrHeadUintPtr", | ||||
| 	"StructPtrHeadOmitEmptyUintPtr", | ||||
| 	"StructHeadFloat32Ptr", | ||||
| 	"StructHeadOmitEmptyFloat32Ptr", | ||||
| 	"StructPtrHeadFloat32Ptr", | ||||
| 	"StructPtrHeadOmitEmptyFloat32Ptr", | ||||
| 	"StructHeadFloat64Ptr", | ||||
| 	"StructHeadOmitEmptyFloat64Ptr", | ||||
| 	"StructPtrHeadFloat64Ptr", | ||||
| 	"StructPtrHeadOmitEmptyFloat64Ptr", | ||||
| 	"StructHeadBoolPtr", | ||||
| 	"StructHeadOmitEmptyBoolPtr", | ||||
| 	"StructPtrHeadBoolPtr", | ||||
| 	"StructPtrHeadOmitEmptyBoolPtr", | ||||
| 	"StructHeadStringPtr", | ||||
| 	"StructHeadOmitEmptyStringPtr", | ||||
| 	"StructPtrHeadStringPtr", | ||||
| 	"StructPtrHeadOmitEmptyStringPtr", | ||||
| 	"StructHeadBytesPtr", | ||||
| 	"StructHeadOmitEmptyBytesPtr", | ||||
| 	"StructPtrHeadBytesPtr", | ||||
| 	"StructPtrHeadOmitEmptyBytesPtr", | ||||
| 	"StructHeadNumberPtr", | ||||
| 	"StructHeadOmitEmptyNumberPtr", | ||||
| 	"StructPtrHeadNumberPtr", | ||||
| 	"StructPtrHeadOmitEmptyNumberPtr", | ||||
| 	"StructHeadArrayPtr", | ||||
| 	"StructHeadOmitEmptyArrayPtr", | ||||
| 	"StructPtrHeadArrayPtr", | ||||
| 	"StructPtrHeadOmitEmptyArrayPtr", | ||||
| 	"StructHeadMapPtr", | ||||
| 	"StructHeadOmitEmptyMapPtr", | ||||
| 	"StructPtrHeadMapPtr", | ||||
| 	"StructPtrHeadOmitEmptyMapPtr", | ||||
| 	"StructHeadSlicePtr", | ||||
| 	"StructHeadOmitEmptySlicePtr", | ||||
| 	"StructPtrHeadSlicePtr", | ||||
| 	"StructPtrHeadOmitEmptySlicePtr", | ||||
| 	"StructHeadMarshalJSONPtr", | ||||
| 	"StructHeadOmitEmptyMarshalJSONPtr", | ||||
| 	"StructPtrHeadMarshalJSONPtr", | ||||
| 	"StructPtrHeadOmitEmptyMarshalJSONPtr", | ||||
| 	"StructHeadMarshalTextPtr", | ||||
| 	"StructHeadOmitEmptyMarshalTextPtr", | ||||
| 	"StructPtrHeadMarshalTextPtr", | ||||
| 	"StructPtrHeadOmitEmptyMarshalTextPtr", | ||||
| 	"StructHeadInterfacePtr", | ||||
| 	"StructHeadOmitEmptyInterfacePtr", | ||||
| 	"StructPtrHeadInterfacePtr", | ||||
| 	"StructPtrHeadOmitEmptyInterfacePtr", | ||||
| 	"StructHeadIntPtrString", | ||||
| 	"StructHeadOmitEmptyIntPtrString", | ||||
| 	"StructPtrHeadIntPtrString", | ||||
| 	"StructPtrHeadOmitEmptyIntPtrString", | ||||
| 	"StructHeadUintPtrString", | ||||
| 	"StructHeadOmitEmptyUintPtrString", | ||||
| 	"StructPtrHeadUintPtrString", | ||||
| 	"StructPtrHeadOmitEmptyUintPtrString", | ||||
| 	"StructHeadFloat32PtrString", | ||||
| 	"StructHeadOmitEmptyFloat32PtrString", | ||||
| 	"StructPtrHeadFloat32PtrString", | ||||
| 	"StructPtrHeadOmitEmptyFloat32PtrString", | ||||
| 	"StructHeadFloat64PtrString", | ||||
| 	"StructHeadOmitEmptyFloat64PtrString", | ||||
| 	"StructPtrHeadFloat64PtrString", | ||||
| 	"StructPtrHeadOmitEmptyFloat64PtrString", | ||||
| 	"StructHeadBoolPtrString", | ||||
| 	"StructHeadOmitEmptyBoolPtrString", | ||||
| 	"StructPtrHeadBoolPtrString", | ||||
| 	"StructPtrHeadOmitEmptyBoolPtrString", | ||||
| 	"StructHeadStringPtrString", | ||||
| 	"StructHeadOmitEmptyStringPtrString", | ||||
| 	"StructPtrHeadStringPtrString", | ||||
| 	"StructPtrHeadOmitEmptyStringPtrString", | ||||
| 	"StructHeadNumberPtrString", | ||||
| 	"StructHeadOmitEmptyNumberPtrString", | ||||
| 	"StructPtrHeadNumberPtrString", | ||||
| 	"StructPtrHeadOmitEmptyNumberPtrString", | ||||
| 	"StructHead", | ||||
| 	"StructHeadOmitEmpty", | ||||
| 	"StructPtrHead", | ||||
| 	"StructPtrHeadOmitEmpty", | ||||
| 	"StructFieldInt", | ||||
| 	"StructFieldOmitEmptyInt", | ||||
| 	"StructEndInt", | ||||
| 	"StructEndOmitEmptyInt", | ||||
| 	"StructFieldUint", | ||||
| 	"StructFieldOmitEmptyUint", | ||||
| 	"StructEndUint", | ||||
| 	"StructEndOmitEmptyUint", | ||||
| 	"StructFieldFloat32", | ||||
| 	"StructFieldOmitEmptyFloat32", | ||||
| 	"StructEndFloat32", | ||||
| 	"StructEndOmitEmptyFloat32", | ||||
| 	"StructFieldFloat64", | ||||
| 	"StructFieldOmitEmptyFloat64", | ||||
| 	"StructEndFloat64", | ||||
| 	"StructEndOmitEmptyFloat64", | ||||
| 	"StructFieldBool", | ||||
| 	"StructFieldOmitEmptyBool", | ||||
| 	"StructEndBool", | ||||
| 	"StructEndOmitEmptyBool", | ||||
| 	"StructFieldString", | ||||
| 	"StructFieldOmitEmptyString", | ||||
| 	"StructEndString", | ||||
| 	"StructEndOmitEmptyString", | ||||
| 	"StructFieldBytes", | ||||
| 	"StructFieldOmitEmptyBytes", | ||||
| 	"StructEndBytes", | ||||
| 	"StructEndOmitEmptyBytes", | ||||
| 	"StructFieldNumber", | ||||
| 	"StructFieldOmitEmptyNumber", | ||||
| 	"StructEndNumber", | ||||
| 	"StructEndOmitEmptyNumber", | ||||
| 	"StructFieldArray", | ||||
| 	"StructFieldOmitEmptyArray", | ||||
| 	"StructEndArray", | ||||
| 	"StructEndOmitEmptyArray", | ||||
| 	"StructFieldMap", | ||||
| 	"StructFieldOmitEmptyMap", | ||||
| 	"StructEndMap", | ||||
| 	"StructEndOmitEmptyMap", | ||||
| 	"StructFieldSlice", | ||||
| 	"StructFieldOmitEmptySlice", | ||||
| 	"StructEndSlice", | ||||
| 	"StructEndOmitEmptySlice", | ||||
| 	"StructFieldStruct", | ||||
| 	"StructFieldOmitEmptyStruct", | ||||
| 	"StructEndStruct", | ||||
| 	"StructEndOmitEmptyStruct", | ||||
| 	"StructFieldMarshalJSON", | ||||
| 	"StructFieldOmitEmptyMarshalJSON", | ||||
| 	"StructEndMarshalJSON", | ||||
| 	"StructEndOmitEmptyMarshalJSON", | ||||
| 	"StructFieldMarshalText", | ||||
| 	"StructFieldOmitEmptyMarshalText", | ||||
| 	"StructEndMarshalText", | ||||
| 	"StructEndOmitEmptyMarshalText", | ||||
| 	"StructFieldIntString", | ||||
| 	"StructFieldOmitEmptyIntString", | ||||
| 	"StructEndIntString", | ||||
| 	"StructEndOmitEmptyIntString", | ||||
| 	"StructFieldUintString", | ||||
| 	"StructFieldOmitEmptyUintString", | ||||
| 	"StructEndUintString", | ||||
| 	"StructEndOmitEmptyUintString", | ||||
| 	"StructFieldFloat32String", | ||||
| 	"StructFieldOmitEmptyFloat32String", | ||||
| 	"StructEndFloat32String", | ||||
| 	"StructEndOmitEmptyFloat32String", | ||||
| 	"StructFieldFloat64String", | ||||
| 	"StructFieldOmitEmptyFloat64String", | ||||
| 	"StructEndFloat64String", | ||||
| 	"StructEndOmitEmptyFloat64String", | ||||
| 	"StructFieldBoolString", | ||||
| 	"StructFieldOmitEmptyBoolString", | ||||
| 	"StructEndBoolString", | ||||
| 	"StructEndOmitEmptyBoolString", | ||||
| 	"StructFieldStringString", | ||||
| 	"StructFieldOmitEmptyStringString", | ||||
| 	"StructEndStringString", | ||||
| 	"StructEndOmitEmptyStringString", | ||||
| 	"StructFieldNumberString", | ||||
| 	"StructFieldOmitEmptyNumberString", | ||||
| 	"StructEndNumberString", | ||||
| 	"StructEndOmitEmptyNumberString", | ||||
| 	"StructFieldIntPtr", | ||||
| 	"StructFieldOmitEmptyIntPtr", | ||||
| 	"StructEndIntPtr", | ||||
| 	"StructEndOmitEmptyIntPtr", | ||||
| 	"StructFieldUintPtr", | ||||
| 	"StructFieldOmitEmptyUintPtr", | ||||
| 	"StructEndUintPtr", | ||||
| 	"StructEndOmitEmptyUintPtr", | ||||
| 	"StructFieldFloat32Ptr", | ||||
| 	"StructFieldOmitEmptyFloat32Ptr", | ||||
| 	"StructEndFloat32Ptr", | ||||
| 	"StructEndOmitEmptyFloat32Ptr", | ||||
| 	"StructFieldFloat64Ptr", | ||||
| 	"StructFieldOmitEmptyFloat64Ptr", | ||||
| 	"StructEndFloat64Ptr", | ||||
| 	"StructEndOmitEmptyFloat64Ptr", | ||||
| 	"StructFieldBoolPtr", | ||||
| 	"StructFieldOmitEmptyBoolPtr", | ||||
| 	"StructEndBoolPtr", | ||||
| 	"StructEndOmitEmptyBoolPtr", | ||||
| 	"StructFieldStringPtr", | ||||
| 	"StructFieldOmitEmptyStringPtr", | ||||
| 	"StructEndStringPtr", | ||||
| 	"StructEndOmitEmptyStringPtr", | ||||
| 	"StructFieldBytesPtr", | ||||
| 	"StructFieldOmitEmptyBytesPtr", | ||||
| 	"StructEndBytesPtr", | ||||
| 	"StructEndOmitEmptyBytesPtr", | ||||
| 	"StructFieldNumberPtr", | ||||
| 	"StructFieldOmitEmptyNumberPtr", | ||||
| 	"StructEndNumberPtr", | ||||
| 	"StructEndOmitEmptyNumberPtr", | ||||
| 	"StructFieldArrayPtr", | ||||
| 	"StructFieldOmitEmptyArrayPtr", | ||||
| 	"StructEndArrayPtr", | ||||
| 	"StructEndOmitEmptyArrayPtr", | ||||
| 	"StructFieldMapPtr", | ||||
| 	"StructFieldOmitEmptyMapPtr", | ||||
| 	"StructEndMapPtr", | ||||
| 	"StructEndOmitEmptyMapPtr", | ||||
| 	"StructFieldSlicePtr", | ||||
| 	"StructFieldOmitEmptySlicePtr", | ||||
| 	"StructEndSlicePtr", | ||||
| 	"StructEndOmitEmptySlicePtr", | ||||
| 	"StructFieldMarshalJSONPtr", | ||||
| 	"StructFieldOmitEmptyMarshalJSONPtr", | ||||
| 	"StructEndMarshalJSONPtr", | ||||
| 	"StructEndOmitEmptyMarshalJSONPtr", | ||||
| 	"StructFieldMarshalTextPtr", | ||||
| 	"StructFieldOmitEmptyMarshalTextPtr", | ||||
| 	"StructEndMarshalTextPtr", | ||||
| 	"StructEndOmitEmptyMarshalTextPtr", | ||||
| 	"StructFieldInterfacePtr", | ||||
| 	"StructFieldOmitEmptyInterfacePtr", | ||||
| 	"StructEndInterfacePtr", | ||||
| 	"StructEndOmitEmptyInterfacePtr", | ||||
| 	"StructFieldIntPtrString", | ||||
| 	"StructFieldOmitEmptyIntPtrString", | ||||
| 	"StructEndIntPtrString", | ||||
| 	"StructEndOmitEmptyIntPtrString", | ||||
| 	"StructFieldUintPtrString", | ||||
| 	"StructFieldOmitEmptyUintPtrString", | ||||
| 	"StructEndUintPtrString", | ||||
| 	"StructEndOmitEmptyUintPtrString", | ||||
| 	"StructFieldFloat32PtrString", | ||||
| 	"StructFieldOmitEmptyFloat32PtrString", | ||||
| 	"StructEndFloat32PtrString", | ||||
| 	"StructEndOmitEmptyFloat32PtrString", | ||||
| 	"StructFieldFloat64PtrString", | ||||
| 	"StructFieldOmitEmptyFloat64PtrString", | ||||
| 	"StructEndFloat64PtrString", | ||||
| 	"StructEndOmitEmptyFloat64PtrString", | ||||
| 	"StructFieldBoolPtrString", | ||||
| 	"StructFieldOmitEmptyBoolPtrString", | ||||
| 	"StructEndBoolPtrString", | ||||
| 	"StructEndOmitEmptyBoolPtrString", | ||||
| 	"StructFieldStringPtrString", | ||||
| 	"StructFieldOmitEmptyStringPtrString", | ||||
| 	"StructEndStringPtrString", | ||||
| 	"StructEndOmitEmptyStringPtrString", | ||||
| 	"StructFieldNumberPtrString", | ||||
| 	"StructFieldOmitEmptyNumberPtrString", | ||||
| 	"StructEndNumberPtrString", | ||||
| 	"StructEndOmitEmptyNumberPtrString", | ||||
| 	"StructField", | ||||
| 	"StructFieldOmitEmpty", | ||||
| 	"StructEnd", | ||||
| 	"StructEndOmitEmpty", | ||||
| } | ||||
|  | ||||
| type OpType uint16 | ||||
|  | ||||
| const ( | ||||
| 	OpEnd                                    OpType = 0 | ||||
| 	OpInterface                              OpType = 1 | ||||
| 	OpPtr                                    OpType = 2 | ||||
| 	OpSliceElem                              OpType = 3 | ||||
| 	OpSliceEnd                               OpType = 4 | ||||
| 	OpArrayElem                              OpType = 5 | ||||
| 	OpArrayEnd                               OpType = 6 | ||||
| 	OpMapKey                                 OpType = 7 | ||||
| 	OpMapValue                               OpType = 8 | ||||
| 	OpMapEnd                                 OpType = 9 | ||||
| 	OpRecursive                              OpType = 10 | ||||
| 	OpRecursivePtr                           OpType = 11 | ||||
| 	OpRecursiveEnd                           OpType = 12 | ||||
| 	OpInterfaceEnd                           OpType = 13 | ||||
| 	OpStructAnonymousEnd                     OpType = 14 | ||||
| 	OpInt                                    OpType = 15 | ||||
| 	OpUint                                   OpType = 16 | ||||
| 	OpFloat32                                OpType = 17 | ||||
| 	OpFloat64                                OpType = 18 | ||||
| 	OpBool                                   OpType = 19 | ||||
| 	OpString                                 OpType = 20 | ||||
| 	OpBytes                                  OpType = 21 | ||||
| 	OpNumber                                 OpType = 22 | ||||
| 	OpArray                                  OpType = 23 | ||||
| 	OpMap                                    OpType = 24 | ||||
| 	OpSlice                                  OpType = 25 | ||||
| 	OpStruct                                 OpType = 26 | ||||
| 	OpMarshalJSON                            OpType = 27 | ||||
| 	OpMarshalText                            OpType = 28 | ||||
| 	OpIntString                              OpType = 29 | ||||
| 	OpUintString                             OpType = 30 | ||||
| 	OpFloat32String                          OpType = 31 | ||||
| 	OpFloat64String                          OpType = 32 | ||||
| 	OpBoolString                             OpType = 33 | ||||
| 	OpStringString                           OpType = 34 | ||||
| 	OpNumberString                           OpType = 35 | ||||
| 	OpIntPtr                                 OpType = 36 | ||||
| 	OpUintPtr                                OpType = 37 | ||||
| 	OpFloat32Ptr                             OpType = 38 | ||||
| 	OpFloat64Ptr                             OpType = 39 | ||||
| 	OpBoolPtr                                OpType = 40 | ||||
| 	OpStringPtr                              OpType = 41 | ||||
| 	OpBytesPtr                               OpType = 42 | ||||
| 	OpNumberPtr                              OpType = 43 | ||||
| 	OpArrayPtr                               OpType = 44 | ||||
| 	OpMapPtr                                 OpType = 45 | ||||
| 	OpSlicePtr                               OpType = 46 | ||||
| 	OpMarshalJSONPtr                         OpType = 47 | ||||
| 	OpMarshalTextPtr                         OpType = 48 | ||||
| 	OpInterfacePtr                           OpType = 49 | ||||
| 	OpIntPtrString                           OpType = 50 | ||||
| 	OpUintPtrString                          OpType = 51 | ||||
| 	OpFloat32PtrString                       OpType = 52 | ||||
| 	OpFloat64PtrString                       OpType = 53 | ||||
| 	OpBoolPtrString                          OpType = 54 | ||||
| 	OpStringPtrString                        OpType = 55 | ||||
| 	OpNumberPtrString                        OpType = 56 | ||||
| 	OpStructHeadInt                          OpType = 57 | ||||
| 	OpStructHeadOmitEmptyInt                 OpType = 58 | ||||
| 	OpStructPtrHeadInt                       OpType = 59 | ||||
| 	OpStructPtrHeadOmitEmptyInt              OpType = 60 | ||||
| 	OpStructHeadUint                         OpType = 61 | ||||
| 	OpStructHeadOmitEmptyUint                OpType = 62 | ||||
| 	OpStructPtrHeadUint                      OpType = 63 | ||||
| 	OpStructPtrHeadOmitEmptyUint             OpType = 64 | ||||
| 	OpStructHeadFloat32                      OpType = 65 | ||||
| 	OpStructHeadOmitEmptyFloat32             OpType = 66 | ||||
| 	OpStructPtrHeadFloat32                   OpType = 67 | ||||
| 	OpStructPtrHeadOmitEmptyFloat32          OpType = 68 | ||||
| 	OpStructHeadFloat64                      OpType = 69 | ||||
| 	OpStructHeadOmitEmptyFloat64             OpType = 70 | ||||
| 	OpStructPtrHeadFloat64                   OpType = 71 | ||||
| 	OpStructPtrHeadOmitEmptyFloat64          OpType = 72 | ||||
| 	OpStructHeadBool                         OpType = 73 | ||||
| 	OpStructHeadOmitEmptyBool                OpType = 74 | ||||
| 	OpStructPtrHeadBool                      OpType = 75 | ||||
| 	OpStructPtrHeadOmitEmptyBool             OpType = 76 | ||||
| 	OpStructHeadString                       OpType = 77 | ||||
| 	OpStructHeadOmitEmptyString              OpType = 78 | ||||
| 	OpStructPtrHeadString                    OpType = 79 | ||||
| 	OpStructPtrHeadOmitEmptyString           OpType = 80 | ||||
| 	OpStructHeadBytes                        OpType = 81 | ||||
| 	OpStructHeadOmitEmptyBytes               OpType = 82 | ||||
| 	OpStructPtrHeadBytes                     OpType = 83 | ||||
| 	OpStructPtrHeadOmitEmptyBytes            OpType = 84 | ||||
| 	OpStructHeadNumber                       OpType = 85 | ||||
| 	OpStructHeadOmitEmptyNumber              OpType = 86 | ||||
| 	OpStructPtrHeadNumber                    OpType = 87 | ||||
| 	OpStructPtrHeadOmitEmptyNumber           OpType = 88 | ||||
| 	OpStructHeadArray                        OpType = 89 | ||||
| 	OpStructHeadOmitEmptyArray               OpType = 90 | ||||
| 	OpStructPtrHeadArray                     OpType = 91 | ||||
| 	OpStructPtrHeadOmitEmptyArray            OpType = 92 | ||||
| 	OpStructHeadMap                          OpType = 93 | ||||
| 	OpStructHeadOmitEmptyMap                 OpType = 94 | ||||
| 	OpStructPtrHeadMap                       OpType = 95 | ||||
| 	OpStructPtrHeadOmitEmptyMap              OpType = 96 | ||||
| 	OpStructHeadSlice                        OpType = 97 | ||||
| 	OpStructHeadOmitEmptySlice               OpType = 98 | ||||
| 	OpStructPtrHeadSlice                     OpType = 99 | ||||
| 	OpStructPtrHeadOmitEmptySlice            OpType = 100 | ||||
| 	OpStructHeadStruct                       OpType = 101 | ||||
| 	OpStructHeadOmitEmptyStruct              OpType = 102 | ||||
| 	OpStructPtrHeadStruct                    OpType = 103 | ||||
| 	OpStructPtrHeadOmitEmptyStruct           OpType = 104 | ||||
| 	OpStructHeadMarshalJSON                  OpType = 105 | ||||
| 	OpStructHeadOmitEmptyMarshalJSON         OpType = 106 | ||||
| 	OpStructPtrHeadMarshalJSON               OpType = 107 | ||||
| 	OpStructPtrHeadOmitEmptyMarshalJSON      OpType = 108 | ||||
| 	OpStructHeadMarshalText                  OpType = 109 | ||||
| 	OpStructHeadOmitEmptyMarshalText         OpType = 110 | ||||
| 	OpStructPtrHeadMarshalText               OpType = 111 | ||||
| 	OpStructPtrHeadOmitEmptyMarshalText      OpType = 112 | ||||
| 	OpStructHeadIntString                    OpType = 113 | ||||
| 	OpStructHeadOmitEmptyIntString           OpType = 114 | ||||
| 	OpStructPtrHeadIntString                 OpType = 115 | ||||
| 	OpStructPtrHeadOmitEmptyIntString        OpType = 116 | ||||
| 	OpStructHeadUintString                   OpType = 117 | ||||
| 	OpStructHeadOmitEmptyUintString          OpType = 118 | ||||
| 	OpStructPtrHeadUintString                OpType = 119 | ||||
| 	OpStructPtrHeadOmitEmptyUintString       OpType = 120 | ||||
| 	OpStructHeadFloat32String                OpType = 121 | ||||
| 	OpStructHeadOmitEmptyFloat32String       OpType = 122 | ||||
| 	OpStructPtrHeadFloat32String             OpType = 123 | ||||
| 	OpStructPtrHeadOmitEmptyFloat32String    OpType = 124 | ||||
| 	OpStructHeadFloat64String                OpType = 125 | ||||
| 	OpStructHeadOmitEmptyFloat64String       OpType = 126 | ||||
| 	OpStructPtrHeadFloat64String             OpType = 127 | ||||
| 	OpStructPtrHeadOmitEmptyFloat64String    OpType = 128 | ||||
| 	OpStructHeadBoolString                   OpType = 129 | ||||
| 	OpStructHeadOmitEmptyBoolString          OpType = 130 | ||||
| 	OpStructPtrHeadBoolString                OpType = 131 | ||||
| 	OpStructPtrHeadOmitEmptyBoolString       OpType = 132 | ||||
| 	OpStructHeadStringString                 OpType = 133 | ||||
| 	OpStructHeadOmitEmptyStringString        OpType = 134 | ||||
| 	OpStructPtrHeadStringString              OpType = 135 | ||||
| 	OpStructPtrHeadOmitEmptyStringString     OpType = 136 | ||||
| 	OpStructHeadNumberString                 OpType = 137 | ||||
| 	OpStructHeadOmitEmptyNumberString        OpType = 138 | ||||
| 	OpStructPtrHeadNumberString              OpType = 139 | ||||
| 	OpStructPtrHeadOmitEmptyNumberString     OpType = 140 | ||||
| 	OpStructHeadIntPtr                       OpType = 141 | ||||
| 	OpStructHeadOmitEmptyIntPtr              OpType = 142 | ||||
| 	OpStructPtrHeadIntPtr                    OpType = 143 | ||||
| 	OpStructPtrHeadOmitEmptyIntPtr           OpType = 144 | ||||
| 	OpStructHeadUintPtr                      OpType = 145 | ||||
| 	OpStructHeadOmitEmptyUintPtr             OpType = 146 | ||||
| 	OpStructPtrHeadUintPtr                   OpType = 147 | ||||
| 	OpStructPtrHeadOmitEmptyUintPtr          OpType = 148 | ||||
| 	OpStructHeadFloat32Ptr                   OpType = 149 | ||||
| 	OpStructHeadOmitEmptyFloat32Ptr          OpType = 150 | ||||
| 	OpStructPtrHeadFloat32Ptr                OpType = 151 | ||||
| 	OpStructPtrHeadOmitEmptyFloat32Ptr       OpType = 152 | ||||
| 	OpStructHeadFloat64Ptr                   OpType = 153 | ||||
| 	OpStructHeadOmitEmptyFloat64Ptr          OpType = 154 | ||||
| 	OpStructPtrHeadFloat64Ptr                OpType = 155 | ||||
| 	OpStructPtrHeadOmitEmptyFloat64Ptr       OpType = 156 | ||||
| 	OpStructHeadBoolPtr                      OpType = 157 | ||||
| 	OpStructHeadOmitEmptyBoolPtr             OpType = 158 | ||||
| 	OpStructPtrHeadBoolPtr                   OpType = 159 | ||||
| 	OpStructPtrHeadOmitEmptyBoolPtr          OpType = 160 | ||||
| 	OpStructHeadStringPtr                    OpType = 161 | ||||
| 	OpStructHeadOmitEmptyStringPtr           OpType = 162 | ||||
| 	OpStructPtrHeadStringPtr                 OpType = 163 | ||||
| 	OpStructPtrHeadOmitEmptyStringPtr        OpType = 164 | ||||
| 	OpStructHeadBytesPtr                     OpType = 165 | ||||
| 	OpStructHeadOmitEmptyBytesPtr            OpType = 166 | ||||
| 	OpStructPtrHeadBytesPtr                  OpType = 167 | ||||
| 	OpStructPtrHeadOmitEmptyBytesPtr         OpType = 168 | ||||
| 	OpStructHeadNumberPtr                    OpType = 169 | ||||
| 	OpStructHeadOmitEmptyNumberPtr           OpType = 170 | ||||
| 	OpStructPtrHeadNumberPtr                 OpType = 171 | ||||
| 	OpStructPtrHeadOmitEmptyNumberPtr        OpType = 172 | ||||
| 	OpStructHeadArrayPtr                     OpType = 173 | ||||
| 	OpStructHeadOmitEmptyArrayPtr            OpType = 174 | ||||
| 	OpStructPtrHeadArrayPtr                  OpType = 175 | ||||
| 	OpStructPtrHeadOmitEmptyArrayPtr         OpType = 176 | ||||
| 	OpStructHeadMapPtr                       OpType = 177 | ||||
| 	OpStructHeadOmitEmptyMapPtr              OpType = 178 | ||||
| 	OpStructPtrHeadMapPtr                    OpType = 179 | ||||
| 	OpStructPtrHeadOmitEmptyMapPtr           OpType = 180 | ||||
| 	OpStructHeadSlicePtr                     OpType = 181 | ||||
| 	OpStructHeadOmitEmptySlicePtr            OpType = 182 | ||||
| 	OpStructPtrHeadSlicePtr                  OpType = 183 | ||||
| 	OpStructPtrHeadOmitEmptySlicePtr         OpType = 184 | ||||
| 	OpStructHeadMarshalJSONPtr               OpType = 185 | ||||
| 	OpStructHeadOmitEmptyMarshalJSONPtr      OpType = 186 | ||||
| 	OpStructPtrHeadMarshalJSONPtr            OpType = 187 | ||||
| 	OpStructPtrHeadOmitEmptyMarshalJSONPtr   OpType = 188 | ||||
| 	OpStructHeadMarshalTextPtr               OpType = 189 | ||||
| 	OpStructHeadOmitEmptyMarshalTextPtr      OpType = 190 | ||||
| 	OpStructPtrHeadMarshalTextPtr            OpType = 191 | ||||
| 	OpStructPtrHeadOmitEmptyMarshalTextPtr   OpType = 192 | ||||
| 	OpStructHeadInterfacePtr                 OpType = 193 | ||||
| 	OpStructHeadOmitEmptyInterfacePtr        OpType = 194 | ||||
| 	OpStructPtrHeadInterfacePtr              OpType = 195 | ||||
| 	OpStructPtrHeadOmitEmptyInterfacePtr     OpType = 196 | ||||
| 	OpStructHeadIntPtrString                 OpType = 197 | ||||
| 	OpStructHeadOmitEmptyIntPtrString        OpType = 198 | ||||
| 	OpStructPtrHeadIntPtrString              OpType = 199 | ||||
| 	OpStructPtrHeadOmitEmptyIntPtrString     OpType = 200 | ||||
| 	OpStructHeadUintPtrString                OpType = 201 | ||||
| 	OpStructHeadOmitEmptyUintPtrString       OpType = 202 | ||||
| 	OpStructPtrHeadUintPtrString             OpType = 203 | ||||
| 	OpStructPtrHeadOmitEmptyUintPtrString    OpType = 204 | ||||
| 	OpStructHeadFloat32PtrString             OpType = 205 | ||||
| 	OpStructHeadOmitEmptyFloat32PtrString    OpType = 206 | ||||
| 	OpStructPtrHeadFloat32PtrString          OpType = 207 | ||||
| 	OpStructPtrHeadOmitEmptyFloat32PtrString OpType = 208 | ||||
| 	OpStructHeadFloat64PtrString             OpType = 209 | ||||
| 	OpStructHeadOmitEmptyFloat64PtrString    OpType = 210 | ||||
| 	OpStructPtrHeadFloat64PtrString          OpType = 211 | ||||
| 	OpStructPtrHeadOmitEmptyFloat64PtrString OpType = 212 | ||||
| 	OpStructHeadBoolPtrString                OpType = 213 | ||||
| 	OpStructHeadOmitEmptyBoolPtrString       OpType = 214 | ||||
| 	OpStructPtrHeadBoolPtrString             OpType = 215 | ||||
| 	OpStructPtrHeadOmitEmptyBoolPtrString    OpType = 216 | ||||
| 	OpStructHeadStringPtrString              OpType = 217 | ||||
| 	OpStructHeadOmitEmptyStringPtrString     OpType = 218 | ||||
| 	OpStructPtrHeadStringPtrString           OpType = 219 | ||||
| 	OpStructPtrHeadOmitEmptyStringPtrString  OpType = 220 | ||||
| 	OpStructHeadNumberPtrString              OpType = 221 | ||||
| 	OpStructHeadOmitEmptyNumberPtrString     OpType = 222 | ||||
| 	OpStructPtrHeadNumberPtrString           OpType = 223 | ||||
| 	OpStructPtrHeadOmitEmptyNumberPtrString  OpType = 224 | ||||
| 	OpStructHead                             OpType = 225 | ||||
| 	OpStructHeadOmitEmpty                    OpType = 226 | ||||
| 	OpStructPtrHead                          OpType = 227 | ||||
| 	OpStructPtrHeadOmitEmpty                 OpType = 228 | ||||
| 	OpStructFieldInt                         OpType = 229 | ||||
| 	OpStructFieldOmitEmptyInt                OpType = 230 | ||||
| 	OpStructEndInt                           OpType = 231 | ||||
| 	OpStructEndOmitEmptyInt                  OpType = 232 | ||||
| 	OpStructFieldUint                        OpType = 233 | ||||
| 	OpStructFieldOmitEmptyUint               OpType = 234 | ||||
| 	OpStructEndUint                          OpType = 235 | ||||
| 	OpStructEndOmitEmptyUint                 OpType = 236 | ||||
| 	OpStructFieldFloat32                     OpType = 237 | ||||
| 	OpStructFieldOmitEmptyFloat32            OpType = 238 | ||||
| 	OpStructEndFloat32                       OpType = 239 | ||||
| 	OpStructEndOmitEmptyFloat32              OpType = 240 | ||||
| 	OpStructFieldFloat64                     OpType = 241 | ||||
| 	OpStructFieldOmitEmptyFloat64            OpType = 242 | ||||
| 	OpStructEndFloat64                       OpType = 243 | ||||
| 	OpStructEndOmitEmptyFloat64              OpType = 244 | ||||
| 	OpStructFieldBool                        OpType = 245 | ||||
| 	OpStructFieldOmitEmptyBool               OpType = 246 | ||||
| 	OpStructEndBool                          OpType = 247 | ||||
| 	OpStructEndOmitEmptyBool                 OpType = 248 | ||||
| 	OpStructFieldString                      OpType = 249 | ||||
| 	OpStructFieldOmitEmptyString             OpType = 250 | ||||
| 	OpStructEndString                        OpType = 251 | ||||
| 	OpStructEndOmitEmptyString               OpType = 252 | ||||
| 	OpStructFieldBytes                       OpType = 253 | ||||
| 	OpStructFieldOmitEmptyBytes              OpType = 254 | ||||
| 	OpStructEndBytes                         OpType = 255 | ||||
| 	OpStructEndOmitEmptyBytes                OpType = 256 | ||||
| 	OpStructFieldNumber                      OpType = 257 | ||||
| 	OpStructFieldOmitEmptyNumber             OpType = 258 | ||||
| 	OpStructEndNumber                        OpType = 259 | ||||
| 	OpStructEndOmitEmptyNumber               OpType = 260 | ||||
| 	OpStructFieldArray                       OpType = 261 | ||||
| 	OpStructFieldOmitEmptyArray              OpType = 262 | ||||
| 	OpStructEndArray                         OpType = 263 | ||||
| 	OpStructEndOmitEmptyArray                OpType = 264 | ||||
| 	OpStructFieldMap                         OpType = 265 | ||||
| 	OpStructFieldOmitEmptyMap                OpType = 266 | ||||
| 	OpStructEndMap                           OpType = 267 | ||||
| 	OpStructEndOmitEmptyMap                  OpType = 268 | ||||
| 	OpStructFieldSlice                       OpType = 269 | ||||
| 	OpStructFieldOmitEmptySlice              OpType = 270 | ||||
| 	OpStructEndSlice                         OpType = 271 | ||||
| 	OpStructEndOmitEmptySlice                OpType = 272 | ||||
| 	OpStructFieldStruct                      OpType = 273 | ||||
| 	OpStructFieldOmitEmptyStruct             OpType = 274 | ||||
| 	OpStructEndStruct                        OpType = 275 | ||||
| 	OpStructEndOmitEmptyStruct               OpType = 276 | ||||
| 	OpStructFieldMarshalJSON                 OpType = 277 | ||||
| 	OpStructFieldOmitEmptyMarshalJSON        OpType = 278 | ||||
| 	OpStructEndMarshalJSON                   OpType = 279 | ||||
| 	OpStructEndOmitEmptyMarshalJSON          OpType = 280 | ||||
| 	OpStructFieldMarshalText                 OpType = 281 | ||||
| 	OpStructFieldOmitEmptyMarshalText        OpType = 282 | ||||
| 	OpStructEndMarshalText                   OpType = 283 | ||||
| 	OpStructEndOmitEmptyMarshalText          OpType = 284 | ||||
| 	OpStructFieldIntString                   OpType = 285 | ||||
| 	OpStructFieldOmitEmptyIntString          OpType = 286 | ||||
| 	OpStructEndIntString                     OpType = 287 | ||||
| 	OpStructEndOmitEmptyIntString            OpType = 288 | ||||
| 	OpStructFieldUintString                  OpType = 289 | ||||
| 	OpStructFieldOmitEmptyUintString         OpType = 290 | ||||
| 	OpStructEndUintString                    OpType = 291 | ||||
| 	OpStructEndOmitEmptyUintString           OpType = 292 | ||||
| 	OpStructFieldFloat32String               OpType = 293 | ||||
| 	OpStructFieldOmitEmptyFloat32String      OpType = 294 | ||||
| 	OpStructEndFloat32String                 OpType = 295 | ||||
| 	OpStructEndOmitEmptyFloat32String        OpType = 296 | ||||
| 	OpStructFieldFloat64String               OpType = 297 | ||||
| 	OpStructFieldOmitEmptyFloat64String      OpType = 298 | ||||
| 	OpStructEndFloat64String                 OpType = 299 | ||||
| 	OpStructEndOmitEmptyFloat64String        OpType = 300 | ||||
| 	OpStructFieldBoolString                  OpType = 301 | ||||
| 	OpStructFieldOmitEmptyBoolString         OpType = 302 | ||||
| 	OpStructEndBoolString                    OpType = 303 | ||||
| 	OpStructEndOmitEmptyBoolString           OpType = 304 | ||||
| 	OpStructFieldStringString                OpType = 305 | ||||
| 	OpStructFieldOmitEmptyStringString       OpType = 306 | ||||
| 	OpStructEndStringString                  OpType = 307 | ||||
| 	OpStructEndOmitEmptyStringString         OpType = 308 | ||||
| 	OpStructFieldNumberString                OpType = 309 | ||||
| 	OpStructFieldOmitEmptyNumberString       OpType = 310 | ||||
| 	OpStructEndNumberString                  OpType = 311 | ||||
| 	OpStructEndOmitEmptyNumberString         OpType = 312 | ||||
| 	OpStructFieldIntPtr                      OpType = 313 | ||||
| 	OpStructFieldOmitEmptyIntPtr             OpType = 314 | ||||
| 	OpStructEndIntPtr                        OpType = 315 | ||||
| 	OpStructEndOmitEmptyIntPtr               OpType = 316 | ||||
| 	OpStructFieldUintPtr                     OpType = 317 | ||||
| 	OpStructFieldOmitEmptyUintPtr            OpType = 318 | ||||
| 	OpStructEndUintPtr                       OpType = 319 | ||||
| 	OpStructEndOmitEmptyUintPtr              OpType = 320 | ||||
| 	OpStructFieldFloat32Ptr                  OpType = 321 | ||||
| 	OpStructFieldOmitEmptyFloat32Ptr         OpType = 322 | ||||
| 	OpStructEndFloat32Ptr                    OpType = 323 | ||||
| 	OpStructEndOmitEmptyFloat32Ptr           OpType = 324 | ||||
| 	OpStructFieldFloat64Ptr                  OpType = 325 | ||||
| 	OpStructFieldOmitEmptyFloat64Ptr         OpType = 326 | ||||
| 	OpStructEndFloat64Ptr                    OpType = 327 | ||||
| 	OpStructEndOmitEmptyFloat64Ptr           OpType = 328 | ||||
| 	OpStructFieldBoolPtr                     OpType = 329 | ||||
| 	OpStructFieldOmitEmptyBoolPtr            OpType = 330 | ||||
| 	OpStructEndBoolPtr                       OpType = 331 | ||||
| 	OpStructEndOmitEmptyBoolPtr              OpType = 332 | ||||
| 	OpStructFieldStringPtr                   OpType = 333 | ||||
| 	OpStructFieldOmitEmptyStringPtr          OpType = 334 | ||||
| 	OpStructEndStringPtr                     OpType = 335 | ||||
| 	OpStructEndOmitEmptyStringPtr            OpType = 336 | ||||
| 	OpStructFieldBytesPtr                    OpType = 337 | ||||
| 	OpStructFieldOmitEmptyBytesPtr           OpType = 338 | ||||
| 	OpStructEndBytesPtr                      OpType = 339 | ||||
| 	OpStructEndOmitEmptyBytesPtr             OpType = 340 | ||||
| 	OpStructFieldNumberPtr                   OpType = 341 | ||||
| 	OpStructFieldOmitEmptyNumberPtr          OpType = 342 | ||||
| 	OpStructEndNumberPtr                     OpType = 343 | ||||
| 	OpStructEndOmitEmptyNumberPtr            OpType = 344 | ||||
| 	OpStructFieldArrayPtr                    OpType = 345 | ||||
| 	OpStructFieldOmitEmptyArrayPtr           OpType = 346 | ||||
| 	OpStructEndArrayPtr                      OpType = 347 | ||||
| 	OpStructEndOmitEmptyArrayPtr             OpType = 348 | ||||
| 	OpStructFieldMapPtr                      OpType = 349 | ||||
| 	OpStructFieldOmitEmptyMapPtr             OpType = 350 | ||||
| 	OpStructEndMapPtr                        OpType = 351 | ||||
| 	OpStructEndOmitEmptyMapPtr               OpType = 352 | ||||
| 	OpStructFieldSlicePtr                    OpType = 353 | ||||
| 	OpStructFieldOmitEmptySlicePtr           OpType = 354 | ||||
| 	OpStructEndSlicePtr                      OpType = 355 | ||||
| 	OpStructEndOmitEmptySlicePtr             OpType = 356 | ||||
| 	OpStructFieldMarshalJSONPtr              OpType = 357 | ||||
| 	OpStructFieldOmitEmptyMarshalJSONPtr     OpType = 358 | ||||
| 	OpStructEndMarshalJSONPtr                OpType = 359 | ||||
| 	OpStructEndOmitEmptyMarshalJSONPtr       OpType = 360 | ||||
| 	OpStructFieldMarshalTextPtr              OpType = 361 | ||||
| 	OpStructFieldOmitEmptyMarshalTextPtr     OpType = 362 | ||||
| 	OpStructEndMarshalTextPtr                OpType = 363 | ||||
| 	OpStructEndOmitEmptyMarshalTextPtr       OpType = 364 | ||||
| 	OpStructFieldInterfacePtr                OpType = 365 | ||||
| 	OpStructFieldOmitEmptyInterfacePtr       OpType = 366 | ||||
| 	OpStructEndInterfacePtr                  OpType = 367 | ||||
| 	OpStructEndOmitEmptyInterfacePtr         OpType = 368 | ||||
| 	OpStructFieldIntPtrString                OpType = 369 | ||||
| 	OpStructFieldOmitEmptyIntPtrString       OpType = 370 | ||||
| 	OpStructEndIntPtrString                  OpType = 371 | ||||
| 	OpStructEndOmitEmptyIntPtrString         OpType = 372 | ||||
| 	OpStructFieldUintPtrString               OpType = 373 | ||||
| 	OpStructFieldOmitEmptyUintPtrString      OpType = 374 | ||||
| 	OpStructEndUintPtrString                 OpType = 375 | ||||
| 	OpStructEndOmitEmptyUintPtrString        OpType = 376 | ||||
| 	OpStructFieldFloat32PtrString            OpType = 377 | ||||
| 	OpStructFieldOmitEmptyFloat32PtrString   OpType = 378 | ||||
| 	OpStructEndFloat32PtrString              OpType = 379 | ||||
| 	OpStructEndOmitEmptyFloat32PtrString     OpType = 380 | ||||
| 	OpStructFieldFloat64PtrString            OpType = 381 | ||||
| 	OpStructFieldOmitEmptyFloat64PtrString   OpType = 382 | ||||
| 	OpStructEndFloat64PtrString              OpType = 383 | ||||
| 	OpStructEndOmitEmptyFloat64PtrString     OpType = 384 | ||||
| 	OpStructFieldBoolPtrString               OpType = 385 | ||||
| 	OpStructFieldOmitEmptyBoolPtrString      OpType = 386 | ||||
| 	OpStructEndBoolPtrString                 OpType = 387 | ||||
| 	OpStructEndOmitEmptyBoolPtrString        OpType = 388 | ||||
| 	OpStructFieldStringPtrString             OpType = 389 | ||||
| 	OpStructFieldOmitEmptyStringPtrString    OpType = 390 | ||||
| 	OpStructEndStringPtrString               OpType = 391 | ||||
| 	OpStructEndOmitEmptyStringPtrString      OpType = 392 | ||||
| 	OpStructFieldNumberPtrString             OpType = 393 | ||||
| 	OpStructFieldOmitEmptyNumberPtrString    OpType = 394 | ||||
| 	OpStructEndNumberPtrString               OpType = 395 | ||||
| 	OpStructEndOmitEmptyNumberPtrString      OpType = 396 | ||||
| 	OpStructField                            OpType = 397 | ||||
| 	OpStructFieldOmitEmpty                   OpType = 398 | ||||
| 	OpStructEnd                              OpType = 399 | ||||
| 	OpStructEndOmitEmpty                     OpType = 400 | ||||
| ) | ||||
|  | ||||
| func (t OpType) String() string { | ||||
| 	if int(t) >= 401 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	return opTypeStrings[int(t)] | ||||
| } | ||||
|  | ||||
| func (t OpType) CodeType() CodeType { | ||||
| 	if strings.Contains(t.String(), "Struct") { | ||||
| 		if strings.Contains(t.String(), "End") { | ||||
| 			return CodeStructEnd | ||||
| 		} | ||||
| 		return CodeStructField | ||||
| 	} | ||||
| 	switch t { | ||||
| 	case OpArray, OpArrayPtr: | ||||
| 		return CodeArrayHead | ||||
| 	case OpArrayElem: | ||||
| 		return CodeArrayElem | ||||
| 	case OpSlice, OpSlicePtr: | ||||
| 		return CodeSliceHead | ||||
| 	case OpSliceElem: | ||||
| 		return CodeSliceElem | ||||
| 	case OpMap, OpMapPtr: | ||||
| 		return CodeMapHead | ||||
| 	case OpMapKey: | ||||
| 		return CodeMapKey | ||||
| 	case OpMapValue: | ||||
| 		return CodeMapValue | ||||
| 	case OpMapEnd: | ||||
| 		return CodeMapEnd | ||||
| 	} | ||||
|  | ||||
| 	return CodeOp | ||||
| } | ||||
|  | ||||
| func (t OpType) HeadToPtrHead() OpType { | ||||
| 	if strings.Index(t.String(), "PtrHead") > 0 { | ||||
| 		return t | ||||
| 	} | ||||
|  | ||||
| 	idx := strings.Index(t.String(), "Head") | ||||
| 	if idx == -1 { | ||||
| 		return t | ||||
| 	} | ||||
| 	suffix := "PtrHead" + t.String()[idx+len("Head"):] | ||||
|  | ||||
| 	const toPtrOffset = 2 | ||||
| 	if strings.Contains(OpType(int(t)+toPtrOffset).String(), suffix) { | ||||
| 		return OpType(int(t) + toPtrOffset) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func (t OpType) HeadToOmitEmptyHead() OpType { | ||||
| 	const toOmitEmptyOffset = 1 | ||||
| 	if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") { | ||||
| 		return OpType(int(t) + toOmitEmptyOffset) | ||||
| 	} | ||||
|  | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func (t OpType) PtrHeadToHead() OpType { | ||||
| 	idx := strings.Index(t.String(), "Ptr") | ||||
| 	if idx == -1 { | ||||
| 		return t | ||||
| 	} | ||||
| 	suffix := t.String()[idx+len("Ptr"):] | ||||
|  | ||||
| 	const toPtrOffset = 2 | ||||
| 	if strings.Contains(OpType(int(t)-toPtrOffset).String(), suffix) { | ||||
| 		return OpType(int(t) - toPtrOffset) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func (t OpType) FieldToEnd() OpType { | ||||
| 	idx := strings.Index(t.String(), "Field") | ||||
| 	if idx == -1 { | ||||
| 		return t | ||||
| 	} | ||||
| 	suffix := t.String()[idx+len("Field"):] | ||||
| 	if suffix == "" || suffix == "OmitEmpty" { | ||||
| 		return t | ||||
| 	} | ||||
| 	const toEndOffset = 2 | ||||
| 	if strings.Contains(OpType(int(t)+toEndOffset).String(), "End"+suffix) { | ||||
| 		return OpType(int(t) + toEndOffset) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func (t OpType) FieldToOmitEmptyField() OpType { | ||||
| 	const toOmitEmptyOffset = 1 | ||||
| 	if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") { | ||||
| 		return OpType(int(t) + toOmitEmptyOffset) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
							
								
								
									
										640
									
								
								vendor/github.com/goccy/go-json/internal/encoder/string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										640
									
								
								vendor/github.com/goccy/go-json/internal/encoder/string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,640 @@ | ||||
| package encoder | ||||
|  | ||||
| import ( | ||||
| 	"math/bits" | ||||
| 	"reflect" | ||||
| 	"unicode/utf8" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	lsb = 0x0101010101010101 | ||||
| 	msb = 0x8080808080808080 | ||||
| ) | ||||
|  | ||||
| var needEscapeWithHTML = [256]bool{ | ||||
| 	'"':  true, | ||||
| 	'&':  true, | ||||
| 	'<':  true, | ||||
| 	'>':  true, | ||||
| 	'\\': true, | ||||
| 	0x00: true, | ||||
| 	0x01: true, | ||||
| 	0x02: true, | ||||
| 	0x03: true, | ||||
| 	0x04: true, | ||||
| 	0x05: true, | ||||
| 	0x06: true, | ||||
| 	0x07: true, | ||||
| 	0x08: true, | ||||
| 	0x09: true, | ||||
| 	0x0a: true, | ||||
| 	0x0b: true, | ||||
| 	0x0c: true, | ||||
| 	0x0d: true, | ||||
| 	0x0e: true, | ||||
| 	0x0f: true, | ||||
| 	0x10: true, | ||||
| 	0x11: true, | ||||
| 	0x12: true, | ||||
| 	0x13: true, | ||||
| 	0x14: true, | ||||
| 	0x15: true, | ||||
| 	0x16: true, | ||||
| 	0x17: true, | ||||
| 	0x18: true, | ||||
| 	0x19: true, | ||||
| 	0x1a: true, | ||||
| 	0x1b: true, | ||||
| 	0x1c: true, | ||||
| 	0x1d: true, | ||||
| 	0x1e: true, | ||||
| 	0x1f: true, | ||||
| 	/* 0x20 - 0x7f */ | ||||
| 	0x80: true, | ||||
| 	0x81: true, | ||||
| 	0x82: true, | ||||
| 	0x83: true, | ||||
| 	0x84: true, | ||||
| 	0x85: true, | ||||
| 	0x86: true, | ||||
| 	0x87: true, | ||||
| 	0x88: true, | ||||
| 	0x89: true, | ||||
| 	0x8a: true, | ||||
| 	0x8b: true, | ||||
| 	0x8c: true, | ||||
| 	0x8d: true, | ||||
| 	0x8e: true, | ||||
| 	0x8f: true, | ||||
| 	0x90: true, | ||||
| 	0x91: true, | ||||
| 	0x92: true, | ||||
| 	0x93: true, | ||||
| 	0x94: true, | ||||
| 	0x95: true, | ||||
| 	0x96: true, | ||||
| 	0x97: true, | ||||
| 	0x98: true, | ||||
| 	0x99: true, | ||||
| 	0x9a: true, | ||||
| 	0x9b: true, | ||||
| 	0x9c: true, | ||||
| 	0x9d: true, | ||||
| 	0x9e: true, | ||||
| 	0x9f: true, | ||||
| 	0xa0: true, | ||||
| 	0xa1: true, | ||||
| 	0xa2: true, | ||||
| 	0xa3: true, | ||||
| 	0xa4: true, | ||||
| 	0xa5: true, | ||||
| 	0xa6: true, | ||||
| 	0xa7: true, | ||||
| 	0xa8: true, | ||||
| 	0xa9: true, | ||||
| 	0xaa: true, | ||||
| 	0xab: true, | ||||
| 	0xac: true, | ||||
| 	0xad: true, | ||||
| 	0xae: true, | ||||
| 	0xaf: true, | ||||
| 	0xb0: true, | ||||
| 	0xb1: true, | ||||
| 	0xb2: true, | ||||
| 	0xb3: true, | ||||
| 	0xb4: true, | ||||
| 	0xb5: true, | ||||
| 	0xb6: true, | ||||
| 	0xb7: true, | ||||
| 	0xb8: true, | ||||
| 	0xb9: true, | ||||
| 	0xba: true, | ||||
| 	0xbb: true, | ||||
| 	0xbc: true, | ||||
| 	0xbd: true, | ||||
| 	0xbe: true, | ||||
| 	0xbf: true, | ||||
| 	0xc0: true, | ||||
| 	0xc1: true, | ||||
| 	0xc2: true, | ||||
| 	0xc3: true, | ||||
| 	0xc4: true, | ||||
| 	0xc5: true, | ||||
| 	0xc6: true, | ||||
| 	0xc7: true, | ||||
| 	0xc8: true, | ||||
| 	0xc9: true, | ||||
| 	0xca: true, | ||||
| 	0xcb: true, | ||||
| 	0xcc: true, | ||||
| 	0xcd: true, | ||||
| 	0xce: true, | ||||
| 	0xcf: true, | ||||
| 	0xd0: true, | ||||
| 	0xd1: true, | ||||
| 	0xd2: true, | ||||
| 	0xd3: true, | ||||
| 	0xd4: true, | ||||
| 	0xd5: true, | ||||
| 	0xd6: true, | ||||
| 	0xd7: true, | ||||
| 	0xd8: true, | ||||
| 	0xd9: true, | ||||
| 	0xda: true, | ||||
| 	0xdb: true, | ||||
| 	0xdc: true, | ||||
| 	0xdd: true, | ||||
| 	0xde: true, | ||||
| 	0xdf: true, | ||||
| 	0xe0: true, | ||||
| 	0xe1: true, | ||||
| 	0xe2: true, | ||||
| 	0xe3: true, | ||||
| 	0xe4: true, | ||||
| 	0xe5: true, | ||||
| 	0xe6: true, | ||||
| 	0xe7: true, | ||||
| 	0xe8: true, | ||||
| 	0xe9: true, | ||||
| 	0xea: true, | ||||
| 	0xeb: true, | ||||
| 	0xec: true, | ||||
| 	0xed: true, | ||||
| 	0xee: true, | ||||
| 	0xef: true, | ||||
| 	0xf0: true, | ||||
| 	0xf1: true, | ||||
| 	0xf2: true, | ||||
| 	0xf3: true, | ||||
| 	0xf4: true, | ||||
| 	0xf5: true, | ||||
| 	0xf6: true, | ||||
| 	0xf7: true, | ||||
| 	0xf8: true, | ||||
| 	0xf9: true, | ||||
| 	0xfa: true, | ||||
| 	0xfb: true, | ||||
| 	0xfc: true, | ||||
| 	0xfd: true, | ||||
| 	0xfe: true, | ||||
| 	0xff: true, | ||||
| } | ||||
|  | ||||
| var needEscape = [256]bool{ | ||||
| 	'"':  true, | ||||
| 	'\\': true, | ||||
| 	0x00: true, | ||||
| 	0x01: true, | ||||
| 	0x02: true, | ||||
| 	0x03: true, | ||||
| 	0x04: true, | ||||
| 	0x05: true, | ||||
| 	0x06: true, | ||||
| 	0x07: true, | ||||
| 	0x08: true, | ||||
| 	0x09: true, | ||||
| 	0x0a: true, | ||||
| 	0x0b: true, | ||||
| 	0x0c: true, | ||||
| 	0x0d: true, | ||||
| 	0x0e: true, | ||||
| 	0x0f: true, | ||||
| 	0x10: true, | ||||
| 	0x11: true, | ||||
| 	0x12: true, | ||||
| 	0x13: true, | ||||
| 	0x14: true, | ||||
| 	0x15: true, | ||||
| 	0x16: true, | ||||
| 	0x17: true, | ||||
| 	0x18: true, | ||||
| 	0x19: true, | ||||
| 	0x1a: true, | ||||
| 	0x1b: true, | ||||
| 	0x1c: true, | ||||
| 	0x1d: true, | ||||
| 	0x1e: true, | ||||
| 	0x1f: true, | ||||
| 	/* 0x20 - 0x7f */ | ||||
| 	0x80: true, | ||||
| 	0x81: true, | ||||
| 	0x82: true, | ||||
| 	0x83: true, | ||||
| 	0x84: true, | ||||
| 	0x85: true, | ||||
| 	0x86: true, | ||||
| 	0x87: true, | ||||
| 	0x88: true, | ||||
| 	0x89: true, | ||||
| 	0x8a: true, | ||||
| 	0x8b: true, | ||||
| 	0x8c: true, | ||||
| 	0x8d: true, | ||||
| 	0x8e: true, | ||||
| 	0x8f: true, | ||||
| 	0x90: true, | ||||
| 	0x91: true, | ||||
| 	0x92: true, | ||||
| 	0x93: true, | ||||
| 	0x94: true, | ||||
| 	0x95: true, | ||||
| 	0x96: true, | ||||
| 	0x97: true, | ||||
| 	0x98: true, | ||||
| 	0x99: true, | ||||
| 	0x9a: true, | ||||
| 	0x9b: true, | ||||
| 	0x9c: true, | ||||
| 	0x9d: true, | ||||
| 	0x9e: true, | ||||
| 	0x9f: true, | ||||
| 	0xa0: true, | ||||
| 	0xa1: true, | ||||
| 	0xa2: true, | ||||
| 	0xa3: true, | ||||
| 	0xa4: true, | ||||
| 	0xa5: true, | ||||
| 	0xa6: true, | ||||
| 	0xa7: true, | ||||
| 	0xa8: true, | ||||
| 	0xa9: true, | ||||
| 	0xaa: true, | ||||
| 	0xab: true, | ||||
| 	0xac: true, | ||||
| 	0xad: true, | ||||
| 	0xae: true, | ||||
| 	0xaf: true, | ||||
| 	0xb0: true, | ||||
| 	0xb1: true, | ||||
| 	0xb2: true, | ||||
| 	0xb3: true, | ||||
| 	0xb4: true, | ||||
| 	0xb5: true, | ||||
| 	0xb6: true, | ||||
| 	0xb7: true, | ||||
| 	0xb8: true, | ||||
| 	0xb9: true, | ||||
| 	0xba: true, | ||||
| 	0xbb: true, | ||||
| 	0xbc: true, | ||||
| 	0xbd: true, | ||||
| 	0xbe: true, | ||||
| 	0xbf: true, | ||||
| 	0xc0: true, | ||||
| 	0xc1: true, | ||||
| 	0xc2: true, | ||||
| 	0xc3: true, | ||||
| 	0xc4: true, | ||||
| 	0xc5: true, | ||||
| 	0xc6: true, | ||||
| 	0xc7: true, | ||||
| 	0xc8: true, | ||||
| 	0xc9: true, | ||||
| 	0xca: true, | ||||
| 	0xcb: true, | ||||
| 	0xcc: true, | ||||
| 	0xcd: true, | ||||
| 	0xce: true, | ||||
| 	0xcf: true, | ||||
| 	0xd0: true, | ||||
| 	0xd1: true, | ||||
| 	0xd2: true, | ||||
| 	0xd3: true, | ||||
| 	0xd4: true, | ||||
| 	0xd5: true, | ||||
| 	0xd6: true, | ||||
| 	0xd7: true, | ||||
| 	0xd8: true, | ||||
| 	0xd9: true, | ||||
| 	0xda: true, | ||||
| 	0xdb: true, | ||||
| 	0xdc: true, | ||||
| 	0xdd: true, | ||||
| 	0xde: true, | ||||
| 	0xdf: true, | ||||
| 	0xe0: true, | ||||
| 	0xe1: true, | ||||
| 	0xe2: true, | ||||
| 	0xe3: true, | ||||
| 	0xe4: true, | ||||
| 	0xe5: true, | ||||
| 	0xe6: true, | ||||
| 	0xe7: true, | ||||
| 	0xe8: true, | ||||
| 	0xe9: true, | ||||
| 	0xea: true, | ||||
| 	0xeb: true, | ||||
| 	0xec: true, | ||||
| 	0xed: true, | ||||
| 	0xee: true, | ||||
| 	0xef: true, | ||||
| 	0xf0: true, | ||||
| 	0xf1: true, | ||||
| 	0xf2: true, | ||||
| 	0xf3: true, | ||||
| 	0xf4: true, | ||||
| 	0xf5: true, | ||||
| 	0xf6: true, | ||||
| 	0xf7: true, | ||||
| 	0xf8: true, | ||||
| 	0xf9: true, | ||||
| 	0xfa: true, | ||||
| 	0xfb: true, | ||||
| 	0xfc: true, | ||||
| 	0xfd: true, | ||||
| 	0xfe: true, | ||||
| 	0xff: true, | ||||
| } | ||||
|  | ||||
| var hex = "0123456789abcdef" | ||||
|  | ||||
| // escapeIndex finds the index of the first char in `s` that requires escaping. | ||||
| // A char requires escaping if it's outside of the range of [0x20, 0x7F] or if | ||||
| // it includes a double quote or backslash. | ||||
| // If no chars in `s` require escaping, the return value is -1. | ||||
| func escapeIndex(s string) int { | ||||
| 	chunks := stringToUint64Slice(s) | ||||
| 	for _, n := range chunks { | ||||
| 		// combine masks before checking for the MSB of each byte. We include | ||||
| 		// `n` in the mask to check whether any of the *input* byte MSBs were | ||||
| 		// set (i.e. the byte was outside the ASCII range). | ||||
| 		mask := n | below(n, 0x20) | contains(n, '"') | contains(n, '\\') | ||||
| 		if (mask & msb) != 0 { | ||||
| 			return bits.TrailingZeros64(mask&msb) / 8 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	valLen := len(s) | ||||
| 	for i := len(chunks) * 8; i < valLen; i++ { | ||||
| 		if needEscape[s[i]] { | ||||
| 			return i | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return -1 | ||||
| } | ||||
|  | ||||
| // below return a mask that can be used to determine if any of the bytes | ||||
| // in `n` are below `b`. If a byte's MSB is set in the mask then that byte was | ||||
| // below `b`. The result is only valid if `b`, and each byte in `n`, is below | ||||
| // 0x80. | ||||
| func below(n uint64, b byte) uint64 { | ||||
| 	return n - expand(b) | ||||
| } | ||||
|  | ||||
| // contains returns a mask that can be used to determine if any of the | ||||
| // bytes in `n` are equal to `b`. If a byte's MSB is set in the mask then | ||||
| // that byte is equal to `b`. The result is only valid if `b`, and each | ||||
| // byte in `n`, is below 0x80. | ||||
| func contains(n uint64, b byte) uint64 { | ||||
| 	return (n ^ expand(b)) - lsb | ||||
| } | ||||
|  | ||||
| // expand puts the specified byte into each of the 8 bytes of a uint64. | ||||
| func expand(b byte) uint64 { | ||||
| 	return lsb * uint64(b) | ||||
| } | ||||
|  | ||||
| //nolint:govet | ||||
| func stringToUint64Slice(s string) []uint64 { | ||||
| 	return *(*[]uint64)(unsafe.Pointer(&reflect.SliceHeader{ | ||||
| 		Data: ((*reflect.StringHeader)(unsafe.Pointer(&s))).Data, | ||||
| 		Len:  len(s) / 8, | ||||
| 		Cap:  len(s) / 8, | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func AppendString(ctx *RuntimeContext, buf []byte, s string) []byte { | ||||
| 	if ctx.Option.Flag&HTMLEscapeOption == 0 { | ||||
| 		return appendString(buf, s) | ||||
| 	} | ||||
| 	valLen := len(s) | ||||
| 	if valLen == 0 { | ||||
| 		return append(buf, `""`...) | ||||
| 	} | ||||
| 	buf = append(buf, '"') | ||||
| 	var ( | ||||
| 		i, j int | ||||
| 	) | ||||
| 	if valLen >= 8 { | ||||
| 		chunks := stringToUint64Slice(s) | ||||
| 		for _, n := range chunks { | ||||
| 			// combine masks before checking for the MSB of each byte. We include | ||||
| 			// `n` in the mask to check whether any of the *input* byte MSBs were | ||||
| 			// set (i.e. the byte was outside the ASCII range). | ||||
| 			mask := n | (n - (lsb * 0x20)) | | ||||
| 				((n ^ (lsb * '"')) - lsb) | | ||||
| 				((n ^ (lsb * '\\')) - lsb) | | ||||
| 				((n ^ (lsb * '<')) - lsb) | | ||||
| 				((n ^ (lsb * '>')) - lsb) | | ||||
| 				((n ^ (lsb * '&')) - lsb) | ||||
| 			if (mask & msb) != 0 { | ||||
| 				j = bits.TrailingZeros64(mask&msb) / 8 | ||||
| 				goto ESCAPE_END | ||||
| 			} | ||||
| 		} | ||||
| 		for i := len(chunks) * 8; i < valLen; i++ { | ||||
| 			if needEscapeWithHTML[s[i]] { | ||||
| 				j = i | ||||
| 				goto ESCAPE_END | ||||
| 			} | ||||
| 		} | ||||
| 		// no found any escape characters. | ||||
| 		return append(append(buf, s...), '"') | ||||
| 	} | ||||
| ESCAPE_END: | ||||
| 	for j < valLen { | ||||
| 		c := s[j] | ||||
|  | ||||
| 		if !needEscapeWithHTML[c] { | ||||
| 			// fast path: most of the time, printable ascii characters are used | ||||
| 			j++ | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		switch c { | ||||
| 		case '\\', '"': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', c) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\n': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 'n') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\r': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 'r') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\t': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 't') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '<', '>', '&': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u00`...) | ||||
| 			buf = append(buf, hex[c>>4], hex[c&0xF]) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// This encodes bytes < 0x20 except for \t, \n and \r. | ||||
| 		if c < 0x20 { | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u00`...) | ||||
| 			buf = append(buf, hex[c>>4], hex[c&0xF]) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		r, size := utf8.DecodeRuneInString(s[j:]) | ||||
|  | ||||
| 		if r == utf8.RuneError && size == 1 { | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\ufffd`...) | ||||
| 			i = j + size | ||||
| 			j = j + size | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		switch r { | ||||
| 		case '\u2028', '\u2029': | ||||
| 			// U+2028 is LINE SEPARATOR. | ||||
| 			// U+2029 is PARAGRAPH SEPARATOR. | ||||
| 			// They are both technically valid characters in JSON strings, | ||||
| 			// but don't work in JSONP, which has to be evaluated as JavaScript, | ||||
| 			// and can lead to security holes there. It is valid JSON to | ||||
| 			// escape them, so we do so unconditionally. | ||||
| 			// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u202`...) | ||||
| 			buf = append(buf, hex[r&0xF]) | ||||
| 			i = j + size | ||||
| 			j = j + size | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		j += size | ||||
| 	} | ||||
|  | ||||
| 	return append(append(buf, s[i:]...), '"') | ||||
| } | ||||
|  | ||||
| func appendString(buf []byte, s string) []byte { | ||||
| 	valLen := len(s) | ||||
| 	if valLen == 0 { | ||||
| 		return append(buf, `""`...) | ||||
| 	} | ||||
| 	buf = append(buf, '"') | ||||
| 	var escapeIdx int | ||||
| 	if valLen >= 8 { | ||||
| 		if escapeIdx = escapeIndex(s); escapeIdx < 0 { | ||||
| 			return append(append(buf, s...), '"') | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	i := 0 | ||||
| 	j := escapeIdx | ||||
| 	for j < valLen { | ||||
| 		c := s[j] | ||||
|  | ||||
| 		if c >= 0x20 && c <= 0x7f && c != '\\' && c != '"' { | ||||
| 			// fast path: most of the time, printable ascii characters are used | ||||
| 			j++ | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		switch c { | ||||
| 		case '\\', '"': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', c) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\n': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 'n') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\r': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 'r') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '\t': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, '\\', 't') | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
|  | ||||
| 		case '<', '>', '&': | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u00`...) | ||||
| 			buf = append(buf, hex[c>>4], hex[c&0xF]) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// This encodes bytes < 0x20 except for \t, \n and \r. | ||||
| 		if c < 0x20 { | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u00`...) | ||||
| 			buf = append(buf, hex[c>>4], hex[c&0xF]) | ||||
| 			i = j + 1 | ||||
| 			j = j + 1 | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		r, size := utf8.DecodeRuneInString(s[j:]) | ||||
|  | ||||
| 		if r == utf8.RuneError && size == 1 { | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\ufffd`...) | ||||
| 			i = j + size | ||||
| 			j = j + size | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		switch r { | ||||
| 		case '\u2028', '\u2029': | ||||
| 			// U+2028 is LINE SEPARATOR. | ||||
| 			// U+2029 is PARAGRAPH SEPARATOR. | ||||
| 			// They are both technically valid characters in JSON strings, | ||||
| 			// but don't work in JSONP, which has to be evaluated as JavaScript, | ||||
| 			// and can lead to security holes there. It is valid JSON to | ||||
| 			// escape them, so we do so unconditionally. | ||||
| 			// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. | ||||
| 			buf = append(buf, s[i:j]...) | ||||
| 			buf = append(buf, `\u202`...) | ||||
| 			buf = append(buf, hex[r&0xF]) | ||||
| 			i = j + size | ||||
| 			j = j + size | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		j += size | ||||
| 	} | ||||
|  | ||||
| 	return append(append(buf, s[i:]...), '"') | ||||
| } | ||||
							
								
								
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package vm | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| ) | ||||
|  | ||||
| func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]byte, error) { | ||||
| 	defer func() { | ||||
| 		var code *encoder.Opcode | ||||
| 		if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 { | ||||
| 			code = codeSet.EscapeKeyCode | ||||
| 		} else { | ||||
| 			code = codeSet.NoescapeKeyCode | ||||
| 		} | ||||
|  | ||||
| 		if err := recover(); err != nil { | ||||
| 			fmt.Println("=============[DEBUG]===============") | ||||
| 			fmt.Println("* [TYPE]") | ||||
| 			fmt.Println(codeSet.Type) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [ALL OPCODE]") | ||||
| 			fmt.Println(code.Dump()) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [CONTEXT]") | ||||
| 			fmt.Printf("%+v\n", ctx) | ||||
| 			fmt.Println("===================================") | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return Run(ctx, b, codeSet) | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package vm | ||||
|  | ||||
| import ( | ||||
| 	// HACK: compile order | ||||
| 	// `vm`, `vm_indent`, `vm_color`, `vm_color_indent` packages uses a lot of memory to compile, | ||||
| 	// so forcibly make dependencies and avoid compiling in concurrent. | ||||
| 	// dependency order: vm => vm_indent => vm_color => vm_color_indent | ||||
| 	_ "github.com/goccy/go-json/internal/encoder/vm_indent" | ||||
| ) | ||||
							
								
								
									
										182
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| package vm | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| const uintptrSize = 4 << (^uintptr(0) >> 63) | ||||
|  | ||||
| var ( | ||||
| 	appendInt           = encoder.AppendInt | ||||
| 	appendUint          = encoder.AppendUint | ||||
| 	appendFloat32       = encoder.AppendFloat32 | ||||
| 	appendFloat64       = encoder.AppendFloat64 | ||||
| 	appendString        = encoder.AppendString | ||||
| 	appendByteSlice     = encoder.AppendByteSlice | ||||
| 	appendNumber        = encoder.AppendNumber | ||||
| 	errUnsupportedValue = encoder.ErrUnsupportedValue | ||||
| 	errUnsupportedFloat = encoder.ErrUnsupportedFloat | ||||
| 	mapiterinit         = encoder.MapIterInit | ||||
| 	mapiterkey          = encoder.MapIterKey | ||||
| 	mapitervalue        = encoder.MapIterValue | ||||
| 	mapiternext         = encoder.MapIterNext | ||||
| 	maplen              = encoder.MapLen | ||||
| ) | ||||
|  | ||||
| type emptyInterface struct { | ||||
| 	typ *runtime.Type | ||||
| 	ptr unsafe.Pointer | ||||
| } | ||||
|  | ||||
| func errUnimplementedOp(op encoder.OpType) error { | ||||
| 	return fmt.Errorf("encoder: opcode %s has not been implemented", op) | ||||
| } | ||||
|  | ||||
| func load(base uintptr, idx uint32) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	return **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| } | ||||
|  | ||||
| func store(base uintptr, idx uint32, p uintptr) { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	**(**uintptr)(unsafe.Pointer(&addr)) = p | ||||
| } | ||||
|  | ||||
| func loadNPtr(base uintptr, idx uint32, ptrNum uint8) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	p := **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUint64(p uintptr) uint64              { return **(**uint64)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat32(p uintptr) float32            { return **(**float32)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat64(p uintptr) float64            { return **(**float64)(unsafe.Pointer(&p)) } | ||||
| func ptrToBool(p uintptr) bool                  { return **(**bool)(unsafe.Pointer(&p)) } | ||||
| func ptrToBytes(p uintptr) []byte               { return **(**[]byte)(unsafe.Pointer(&p)) } | ||||
| func ptrToNumber(p uintptr) json.Number         { return **(**json.Number)(unsafe.Pointer(&p)) } | ||||
| func ptrToString(p uintptr) string              { return **(**string)(unsafe.Pointer(&p)) } | ||||
| func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) } | ||||
| func ptrToPtr(p uintptr) uintptr { | ||||
| 	return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p))) | ||||
| } | ||||
| func ptrToNPtr(p uintptr, ptrNum uint8) uintptr { | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUnsafePtr(p uintptr) unsafe.Pointer { | ||||
| 	return *(*unsafe.Pointer)(unsafe.Pointer(&p)) | ||||
| } | ||||
| func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} { | ||||
| 	return *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)), | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func appendBool(_ *encoder.RuntimeContext, b []byte, v bool) []byte { | ||||
| 	if v { | ||||
| 		return append(b, "true"...) | ||||
| 	} | ||||
| 	return append(b, "false"...) | ||||
| } | ||||
|  | ||||
| func appendNull(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, "null"...) | ||||
| } | ||||
|  | ||||
| func appendComma(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = ':' | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func appendMapKeyValue(_ *encoder.RuntimeContext, _ *encoder.Opcode, b, key, value []byte) []byte { | ||||
| 	b = append(b, key...) | ||||
| 	b[len(b)-1] = ':' | ||||
| 	return append(b, value...) | ||||
| } | ||||
|  | ||||
| func appendMapEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	b[len(b)-1] = '}' | ||||
| 	b = append(b, ',') | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalJSON(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendMarshalText(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalText(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendArrayHead(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	return append(b, '[') | ||||
| } | ||||
|  | ||||
| func appendArrayEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = ']' | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendEmptyArray(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '[', ']', ',') | ||||
| } | ||||
|  | ||||
| func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '}', ',') | ||||
| } | ||||
|  | ||||
| func appendObjectEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = '}' | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendStructHead(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{') | ||||
| } | ||||
|  | ||||
| func appendStructKey(_ *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	return append(b, code.Key...) | ||||
| } | ||||
|  | ||||
| func appendStructEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	return append(b, '}', ',') | ||||
| } | ||||
|  | ||||
| func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	if b[last] == ',' { | ||||
| 		b[last] = '}' | ||||
| 		return appendComma(ctx, b) | ||||
| 	} | ||||
| 	return appendStructEnd(ctx, code, b) | ||||
| } | ||||
|  | ||||
| func restoreIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, _ uintptr)               {} | ||||
| func storeIndent(_ uintptr, _ *encoder.Opcode, _ uintptr)                                 {} | ||||
| func appendMapKeyIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte    { return b } | ||||
| func appendArrayElemIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b } | ||||
							
								
								
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package vm_color | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| ) | ||||
|  | ||||
| func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]byte, error) { | ||||
| 	var code *encoder.Opcode | ||||
| 	if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 { | ||||
| 		code = codeSet.EscapeKeyCode | ||||
| 	} else { | ||||
| 		code = codeSet.NoescapeKeyCode | ||||
| 	} | ||||
|  | ||||
| 	defer func() { | ||||
| 		if err := recover(); err != nil { | ||||
| 			fmt.Println("=============[DEBUG]===============") | ||||
| 			fmt.Println("* [TYPE]") | ||||
| 			fmt.Println(codeSet.Type) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [ALL OPCODE]") | ||||
| 			fmt.Println(code.Dump()) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [CONTEXT]") | ||||
| 			fmt.Printf("%+v\n", ctx) | ||||
| 			fmt.Println("===================================") | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return Run(ctx, b, codeSet) | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package vm_color | ||||
|  | ||||
| import ( | ||||
| 	// HACK: compile order | ||||
| 	// `vm`, `vm_indent`, `vm_color`, `vm_color_indent` packages uses a lot of memory to compile, | ||||
| 	// so forcibly make dependencies and avoid compiling in concurrent. | ||||
| 	// dependency order: vm => vm_indent => vm_color => vm_color_indent | ||||
| 	_ "github.com/goccy/go-json/internal/encoder/vm_color_indent" | ||||
| ) | ||||
							
								
								
									
										246
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,246 @@ | ||||
| package vm_color | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| const uintptrSize = 4 << (^uintptr(0) >> 63) | ||||
|  | ||||
| var ( | ||||
| 	errUnsupportedValue = encoder.ErrUnsupportedValue | ||||
| 	errUnsupportedFloat = encoder.ErrUnsupportedFloat | ||||
| 	mapiterinit         = encoder.MapIterInit | ||||
| 	mapiterkey          = encoder.MapIterKey | ||||
| 	mapitervalue        = encoder.MapIterValue | ||||
| 	mapiternext         = encoder.MapIterNext | ||||
| 	maplen              = encoder.MapLen | ||||
| ) | ||||
|  | ||||
| type emptyInterface struct { | ||||
| 	typ *runtime.Type | ||||
| 	ptr unsafe.Pointer | ||||
| } | ||||
|  | ||||
| func errUnimplementedOp(op encoder.OpType) error { | ||||
| 	return fmt.Errorf("encoder: opcode %s has not been implemented", op) | ||||
| } | ||||
|  | ||||
| func load(base uintptr, idx uint32) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	return **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| } | ||||
|  | ||||
| func store(base uintptr, idx uint32, p uintptr) { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	**(**uintptr)(unsafe.Pointer(&addr)) = p | ||||
| } | ||||
|  | ||||
| func loadNPtr(base uintptr, idx uint32, ptrNum uint8) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	p := **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUint64(p uintptr) uint64              { return **(**uint64)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat32(p uintptr) float32            { return **(**float32)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat64(p uintptr) float64            { return **(**float64)(unsafe.Pointer(&p)) } | ||||
| func ptrToBool(p uintptr) bool                  { return **(**bool)(unsafe.Pointer(&p)) } | ||||
| func ptrToBytes(p uintptr) []byte               { return **(**[]byte)(unsafe.Pointer(&p)) } | ||||
| func ptrToNumber(p uintptr) json.Number         { return **(**json.Number)(unsafe.Pointer(&p)) } | ||||
| func ptrToString(p uintptr) string              { return **(**string)(unsafe.Pointer(&p)) } | ||||
| func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) } | ||||
| func ptrToPtr(p uintptr) uintptr { | ||||
| 	return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p))) | ||||
| } | ||||
| func ptrToNPtr(p uintptr, ptrNum uint8) uintptr { | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUnsafePtr(p uintptr) unsafe.Pointer { | ||||
| 	return *(*unsafe.Pointer)(unsafe.Pointer(&p)) | ||||
| } | ||||
| func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} { | ||||
| 	return *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)), | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func appendInt(ctx *encoder.RuntimeContext, b []byte, v uint64, code *encoder.Opcode) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Int | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendInt(ctx, b, v, code) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendUint(ctx *encoder.RuntimeContext, b []byte, v uint64, code *encoder.Opcode) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Uint | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendUint(ctx, b, v, code) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendFloat32(ctx *encoder.RuntimeContext, b []byte, v float32) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Float | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendFloat32(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendFloat64(ctx *encoder.RuntimeContext, b []byte, v float64) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Float | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendFloat64(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendString(ctx *encoder.RuntimeContext, b []byte, v string) []byte { | ||||
| 	format := ctx.Option.ColorScheme.String | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendString(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendByteSlice(ctx *encoder.RuntimeContext, b []byte, src []byte) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Binary | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendByteSlice(ctx, b, src) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendNumber(ctx *encoder.RuntimeContext, b []byte, n json.Number) ([]byte, error) { | ||||
| 	format := ctx.Option.ColorScheme.Int | ||||
| 	b = append(b, format.Header...) | ||||
| 	bb, err := encoder.AppendNumber(ctx, b, n) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(bb, format.Footer...), nil | ||||
| } | ||||
|  | ||||
| func appendBool(ctx *encoder.RuntimeContext, b []byte, v bool) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Bool | ||||
| 	b = append(b, format.Header...) | ||||
| 	if v { | ||||
| 		b = append(b, "true"...) | ||||
| 	} else { | ||||
| 		b = append(b, "false"...) | ||||
| 	} | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendNull(ctx *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Null | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = append(b, "null"...) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendComma(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = ':' | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func appendMapKeyValue(_ *encoder.RuntimeContext, _ *encoder.Opcode, b, key, value []byte) []byte { | ||||
| 	b = append(b, key[:len(key)-1]...) | ||||
| 	b = append(b, ':') | ||||
| 	return append(b, value...) | ||||
| } | ||||
|  | ||||
| func appendMapEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = '}' | ||||
| 	b = append(b, ',') | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalJSON(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendMarshalText(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	format := ctx.Option.ColorScheme.String | ||||
| 	b = append(b, format.Header...) | ||||
| 	bb, err := encoder.AppendMarshalText(ctx, code, b, v) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(bb, format.Footer...), nil | ||||
| } | ||||
|  | ||||
| func appendArrayHead(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	return append(b, '[') | ||||
| } | ||||
|  | ||||
| func appendArrayEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = ']' | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendEmptyArray(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '[', ']', ',') | ||||
| } | ||||
|  | ||||
| func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '}', ',') | ||||
| } | ||||
|  | ||||
| func appendObjectEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = '}' | ||||
| 	return append(b, ',') | ||||
| } | ||||
|  | ||||
| func appendStructHead(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{') | ||||
| } | ||||
|  | ||||
| func appendStructKey(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	format := ctx.Option.ColorScheme.ObjectKey | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = append(b, code.Key[:len(code.Key)-1]...) | ||||
| 	b = append(b, format.Footer...) | ||||
|  | ||||
| 	return append(b, ':') | ||||
| } | ||||
|  | ||||
| func appendStructEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { | ||||
| 	return append(b, '}', ',') | ||||
| } | ||||
|  | ||||
| func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	if b[last] == ',' { | ||||
| 		b[last] = '}' | ||||
| 		return appendComma(ctx, b) | ||||
| 	} | ||||
| 	return appendStructEnd(ctx, code, b) | ||||
| } | ||||
|  | ||||
| func restoreIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, _ uintptr)               {} | ||||
| func storeIndent(_ uintptr, _ *encoder.Opcode, _ uintptr)                                 {} | ||||
| func appendMapKeyIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte    { return b } | ||||
| func appendArrayElemIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b } | ||||
							
								
								
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package vm_color_indent | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| ) | ||||
|  | ||||
| func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]byte, error) { | ||||
| 	var code *encoder.Opcode | ||||
| 	if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 { | ||||
| 		code = codeSet.EscapeKeyCode | ||||
| 	} else { | ||||
| 		code = codeSet.NoescapeKeyCode | ||||
| 	} | ||||
|  | ||||
| 	defer func() { | ||||
| 		if err := recover(); err != nil { | ||||
| 			fmt.Println("=============[DEBUG]===============") | ||||
| 			fmt.Println("* [TYPE]") | ||||
| 			fmt.Println(codeSet.Type) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [ALL OPCODE]") | ||||
| 			fmt.Println(code.Dump()) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [CONTEXT]") | ||||
| 			fmt.Printf("%+v\n", ctx) | ||||
| 			fmt.Println("===================================") | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return Run(ctx, b, codeSet) | ||||
| } | ||||
							
								
								
									
										267
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,267 @@ | ||||
| package vm_color_indent | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| const uintptrSize = 4 << (^uintptr(0) >> 63) | ||||
|  | ||||
| var ( | ||||
| 	appendIndent        = encoder.AppendIndent | ||||
| 	appendStructEnd     = encoder.AppendStructEndIndent | ||||
| 	errUnsupportedValue = encoder.ErrUnsupportedValue | ||||
| 	errUnsupportedFloat = encoder.ErrUnsupportedFloat | ||||
| 	mapiterinit         = encoder.MapIterInit | ||||
| 	mapiterkey          = encoder.MapIterKey | ||||
| 	mapitervalue        = encoder.MapIterValue | ||||
| 	mapiternext         = encoder.MapIterNext | ||||
| 	maplen              = encoder.MapLen | ||||
| ) | ||||
|  | ||||
| type emptyInterface struct { | ||||
| 	typ *runtime.Type | ||||
| 	ptr unsafe.Pointer | ||||
| } | ||||
|  | ||||
| func errUnimplementedOp(op encoder.OpType) error { | ||||
| 	return fmt.Errorf("encoder (indent): opcode %s has not been implemented", op) | ||||
| } | ||||
|  | ||||
| func load(base uintptr, idx uint32) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	return **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| } | ||||
|  | ||||
| func store(base uintptr, idx uint32, p uintptr) { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	**(**uintptr)(unsafe.Pointer(&addr)) = p | ||||
| } | ||||
|  | ||||
| func loadNPtr(base uintptr, idx uint32, ptrNum uint8) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	p := **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUint64(p uintptr) uint64              { return **(**uint64)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat32(p uintptr) float32            { return **(**float32)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat64(p uintptr) float64            { return **(**float64)(unsafe.Pointer(&p)) } | ||||
| func ptrToBool(p uintptr) bool                  { return **(**bool)(unsafe.Pointer(&p)) } | ||||
| func ptrToBytes(p uintptr) []byte               { return **(**[]byte)(unsafe.Pointer(&p)) } | ||||
| func ptrToNumber(p uintptr) json.Number         { return **(**json.Number)(unsafe.Pointer(&p)) } | ||||
| func ptrToString(p uintptr) string              { return **(**string)(unsafe.Pointer(&p)) } | ||||
| func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) } | ||||
| func ptrToPtr(p uintptr) uintptr { | ||||
| 	return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p))) | ||||
| } | ||||
| func ptrToNPtr(p uintptr, ptrNum uint8) uintptr { | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUnsafePtr(p uintptr) unsafe.Pointer { | ||||
| 	return *(*unsafe.Pointer)(unsafe.Pointer(&p)) | ||||
| } | ||||
| func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} { | ||||
| 	return *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)), | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func appendInt(ctx *encoder.RuntimeContext, b []byte, v uint64, code *encoder.Opcode) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Int | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendInt(ctx, b, v, code) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendUint(ctx *encoder.RuntimeContext, b []byte, v uint64, code *encoder.Opcode) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Uint | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendUint(ctx, b, v, code) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendFloat32(ctx *encoder.RuntimeContext, b []byte, v float32) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Float | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendFloat32(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendFloat64(ctx *encoder.RuntimeContext, b []byte, v float64) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Float | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendFloat64(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendString(ctx *encoder.RuntimeContext, b []byte, v string) []byte { | ||||
| 	format := ctx.Option.ColorScheme.String | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendString(ctx, b, v) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendByteSlice(ctx *encoder.RuntimeContext, b []byte, src []byte) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Binary | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = encoder.AppendByteSlice(ctx, b, src) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendNumber(ctx *encoder.RuntimeContext, b []byte, n json.Number) ([]byte, error) { | ||||
| 	format := ctx.Option.ColorScheme.Int | ||||
| 	b = append(b, format.Header...) | ||||
| 	bb, err := encoder.AppendNumber(ctx, b, n) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(bb, format.Footer...), nil | ||||
| } | ||||
|  | ||||
| func appendBool(ctx *encoder.RuntimeContext, b []byte, v bool) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Bool | ||||
| 	b = append(b, format.Header...) | ||||
| 	if v { | ||||
| 		b = append(b, "true"...) | ||||
| 	} else { | ||||
| 		b = append(b, "false"...) | ||||
| 	} | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendNull(ctx *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	format := ctx.Option.ColorScheme.Null | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = append(b, "null"...) | ||||
| 	return append(b, format.Footer...) | ||||
| } | ||||
|  | ||||
| func appendComma(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ':', ' ') | ||||
| } | ||||
|  | ||||
| func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte { | ||||
| 	b = appendIndent(ctx, b, code.Indent+1) | ||||
| 	b = append(b, key...) | ||||
| 	b[len(b)-2] = ':' | ||||
| 	b[len(b)-1] = ' ' | ||||
| 	return append(b, value...) | ||||
| } | ||||
|  | ||||
| func appendMapEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = b[:len(b)-2] | ||||
| 	b = append(b, '\n') | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
| 	return append(b, '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendArrayHead(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = append(b, '[', '\n') | ||||
| 	return appendIndent(ctx, b, code.Indent+1) | ||||
| } | ||||
|  | ||||
| func appendArrayEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = b[:len(b)-2] | ||||
| 	b = append(b, '\n') | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
| 	return append(b, ']', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendEmptyArray(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '[', ']', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = '\n' | ||||
| 	b = appendIndent(ctx, b, code.Indent-1) | ||||
| 	return append(b, '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalJSONIndent(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendMarshalText(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	format := ctx.Option.ColorScheme.String | ||||
| 	b = append(b, format.Header...) | ||||
| 	bb, err := encoder.AppendMarshalTextIndent(ctx, code, b, v) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(bb, format.Footer...), nil | ||||
| } | ||||
|  | ||||
| func appendStructHead(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '\n') | ||||
| } | ||||
|  | ||||
| func appendStructKey(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
|  | ||||
| 	format := ctx.Option.ColorScheme.ObjectKey | ||||
| 	b = append(b, format.Header...) | ||||
| 	b = append(b, code.Key[:len(code.Key)-1]...) | ||||
| 	b = append(b, format.Footer...) | ||||
|  | ||||
| 	return append(b, ':', ' ') | ||||
| } | ||||
|  | ||||
| func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	if b[last-1] == '{' { | ||||
| 		b[last] = '}' | ||||
| 	} else { | ||||
| 		if b[last] == '\n' { | ||||
| 			// to remove ',' and '\n' characters | ||||
| 			b = b[:len(b)-2] | ||||
| 		} | ||||
| 		b = append(b, '\n') | ||||
| 		b = appendIndent(ctx, b, code.Indent-1) | ||||
| 		b = append(b, '}') | ||||
| 	} | ||||
| 	return appendComma(ctx, b) | ||||
| } | ||||
|  | ||||
| func restoreIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, ctxptr uintptr) { | ||||
| 	ctx.BaseIndent = uint32(load(ctxptr, code.Length)) | ||||
| } | ||||
|  | ||||
| func storeIndent(ctxptr uintptr, code *encoder.Opcode, indent uintptr) { | ||||
| 	store(ctxptr, code.Length, indent) | ||||
| } | ||||
|  | ||||
| func appendArrayElemIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	return appendIndent(ctx, b, code.Indent+1) | ||||
| } | ||||
|  | ||||
| func appendMapKeyIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	return appendIndent(ctx, b, code.Indent) | ||||
| } | ||||
							
								
								
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package vm_indent | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| ) | ||||
|  | ||||
| func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]byte, error) { | ||||
| 	var code *encoder.Opcode | ||||
| 	if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 { | ||||
| 		code = codeSet.EscapeKeyCode | ||||
| 	} else { | ||||
| 		code = codeSet.NoescapeKeyCode | ||||
| 	} | ||||
|  | ||||
| 	defer func() { | ||||
| 		if err := recover(); err != nil { | ||||
| 			fmt.Println("=============[DEBUG]===============") | ||||
| 			fmt.Println("* [TYPE]") | ||||
| 			fmt.Println(codeSet.Type) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [ALL OPCODE]") | ||||
| 			fmt.Println(code.Dump()) | ||||
| 			fmt.Printf("\n") | ||||
| 			fmt.Println("* [CONTEXT]") | ||||
| 			fmt.Printf("%+v\n", ctx) | ||||
| 			fmt.Println("===================================") | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return Run(ctx, b, codeSet) | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package vm_indent | ||||
|  | ||||
| import ( | ||||
| 	// HACK: compile order | ||||
| 	// `vm`, `vm_indent`, `vm_color`, `vm_color_indent` packages uses a lot of memory to compile, | ||||
| 	// so forcibly make dependencies and avoid compiling in concurrent. | ||||
| 	// dependency order: vm => vm_indent => vm_color => vm_color_indent | ||||
| 	_ "github.com/goccy/go-json/internal/encoder/vm_color" | ||||
| ) | ||||
							
								
								
									
										204
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| package vm_indent | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"github.com/goccy/go-json/internal/encoder" | ||||
| 	"github.com/goccy/go-json/internal/runtime" | ||||
| ) | ||||
|  | ||||
| const uintptrSize = 4 << (^uintptr(0) >> 63) | ||||
|  | ||||
| var ( | ||||
| 	appendInt           = encoder.AppendInt | ||||
| 	appendUint          = encoder.AppendUint | ||||
| 	appendFloat32       = encoder.AppendFloat32 | ||||
| 	appendFloat64       = encoder.AppendFloat64 | ||||
| 	appendString        = encoder.AppendString | ||||
| 	appendByteSlice     = encoder.AppendByteSlice | ||||
| 	appendNumber        = encoder.AppendNumber | ||||
| 	appendStructEnd     = encoder.AppendStructEndIndent | ||||
| 	appendIndent        = encoder.AppendIndent | ||||
| 	errUnsupportedValue = encoder.ErrUnsupportedValue | ||||
| 	errUnsupportedFloat = encoder.ErrUnsupportedFloat | ||||
| 	mapiterinit         = encoder.MapIterInit | ||||
| 	mapiterkey          = encoder.MapIterKey | ||||
| 	mapitervalue        = encoder.MapIterValue | ||||
| 	mapiternext         = encoder.MapIterNext | ||||
| 	maplen              = encoder.MapLen | ||||
| ) | ||||
|  | ||||
| type emptyInterface struct { | ||||
| 	typ *runtime.Type | ||||
| 	ptr unsafe.Pointer | ||||
| } | ||||
|  | ||||
| func errUnimplementedOp(op encoder.OpType) error { | ||||
| 	return fmt.Errorf("encoder (indent): opcode %s has not been implemented", op) | ||||
| } | ||||
|  | ||||
| func load(base uintptr, idx uint32) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	return **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| } | ||||
|  | ||||
| func store(base uintptr, idx uint32, p uintptr) { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	**(**uintptr)(unsafe.Pointer(&addr)) = p | ||||
| } | ||||
|  | ||||
| func loadNPtr(base uintptr, idx uint32, ptrNum uint8) uintptr { | ||||
| 	addr := base + uintptr(idx) | ||||
| 	p := **(**uintptr)(unsafe.Pointer(&addr)) | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUint64(p uintptr) uint64              { return **(**uint64)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat32(p uintptr) float32            { return **(**float32)(unsafe.Pointer(&p)) } | ||||
| func ptrToFloat64(p uintptr) float64            { return **(**float64)(unsafe.Pointer(&p)) } | ||||
| func ptrToBool(p uintptr) bool                  { return **(**bool)(unsafe.Pointer(&p)) } | ||||
| func ptrToBytes(p uintptr) []byte               { return **(**[]byte)(unsafe.Pointer(&p)) } | ||||
| func ptrToNumber(p uintptr) json.Number         { return **(**json.Number)(unsafe.Pointer(&p)) } | ||||
| func ptrToString(p uintptr) string              { return **(**string)(unsafe.Pointer(&p)) } | ||||
| func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) } | ||||
| func ptrToPtr(p uintptr) uintptr { | ||||
| 	return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p))) | ||||
| } | ||||
| func ptrToNPtr(p uintptr, ptrNum uint8) uintptr { | ||||
| 	for i := uint8(0); i < ptrNum; i++ { | ||||
| 		if p == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		p = ptrToPtr(p) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func ptrToUnsafePtr(p uintptr) unsafe.Pointer { | ||||
| 	return *(*unsafe.Pointer)(unsafe.Pointer(&p)) | ||||
| } | ||||
| func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} { | ||||
| 	return *(*interface{})(unsafe.Pointer(&emptyInterface{ | ||||
| 		typ: code.Type, | ||||
| 		ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)), | ||||
| 	})) | ||||
| } | ||||
|  | ||||
| func appendBool(_ *encoder.RuntimeContext, b []byte, v bool) []byte { | ||||
| 	if v { | ||||
| 		return append(b, "true"...) | ||||
| 	} | ||||
| 	return append(b, "false"...) | ||||
| } | ||||
|  | ||||
| func appendNull(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, "null"...) | ||||
| } | ||||
|  | ||||
| func appendComma(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, ':', ' ') | ||||
| } | ||||
|  | ||||
| func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte { | ||||
| 	b = appendIndent(ctx, b, code.Indent+1) | ||||
| 	b = append(b, key...) | ||||
| 	b[len(b)-2] = ':' | ||||
| 	b[len(b)-1] = ' ' | ||||
| 	return append(b, value...) | ||||
| } | ||||
|  | ||||
| func appendMapEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = b[:len(b)-2] | ||||
| 	b = append(b, '\n') | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
| 	return append(b, '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendArrayHead(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = append(b, '[', '\n') | ||||
| 	return appendIndent(ctx, b, code.Indent+1) | ||||
| } | ||||
|  | ||||
| func appendArrayEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = b[:len(b)-2] | ||||
| 	b = append(b, '\n') | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
| 	return append(b, ']', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendEmptyArray(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '[', ']', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	b[last] = '\n' | ||||
| 	b = appendIndent(ctx, b, code.Indent-1) | ||||
| 	return append(b, '}', ',', '\n') | ||||
| } | ||||
|  | ||||
| func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalJSONIndent(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendMarshalText(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) { | ||||
| 	return encoder.AppendMarshalTextIndent(ctx, code, b, v) | ||||
| } | ||||
|  | ||||
| func appendStructHead(_ *encoder.RuntimeContext, b []byte) []byte { | ||||
| 	return append(b, '{', '\n') | ||||
| } | ||||
|  | ||||
| func appendStructKey(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	b = appendIndent(ctx, b, code.Indent) | ||||
| 	b = append(b, code.Key...) | ||||
| 	return append(b, ' ') | ||||
| } | ||||
|  | ||||
| func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	last := len(b) - 1 | ||||
| 	if b[last-1] == '{' { | ||||
| 		b[last] = '}' | ||||
| 	} else { | ||||
| 		if b[last] == '\n' { | ||||
| 			// to remove ',' and '\n' characters | ||||
| 			b = b[:len(b)-2] | ||||
| 		} | ||||
| 		b = append(b, '\n') | ||||
| 		b = appendIndent(ctx, b, code.Indent-1) | ||||
| 		b = append(b, '}') | ||||
| 	} | ||||
| 	return appendComma(ctx, b) | ||||
| } | ||||
|  | ||||
| func restoreIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, ctxptr uintptr) { | ||||
| 	ctx.BaseIndent = uint32(load(ctxptr, code.Length)) | ||||
| } | ||||
|  | ||||
| func storeIndent(ctxptr uintptr, code *encoder.Opcode, indent uintptr) { | ||||
| 	store(ctxptr, code.Length, indent) | ||||
| } | ||||
|  | ||||
| func appendArrayElemIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	return appendIndent(ctx, b, code.Indent+1) | ||||
| } | ||||
|  | ||||
| func appendMapKeyIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { | ||||
| 	return appendIndent(ctx, b, code.Indent) | ||||
| } | ||||
							
								
								
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5041
									
								
								vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user