go-json/encode_opcode.go

1550 lines
44 KiB
Go
Raw Normal View History

2020-04-29 18:31:50 +03:00
package json
import (
"fmt"
"reflect"
"strings"
"unsafe"
)
type opType int
const (
opEnd opType = iota
opInt
opInt8
opInt16
opInt32
opInt64
opUint
opUint8
opUint16
opUint32
opUint64
opFloat32
opFloat64
opString
opBool
opInterface
2020-04-29 18:31:50 +03:00
opPtr
2020-05-04 12:39:17 +03:00
opMarshalJSON
opMarshalText
2020-05-02 17:35:41 +03:00
2020-04-29 18:31:50 +03:00
opSliceHead
opSliceElem
opSliceEnd
2020-05-02 17:35:41 +03:00
opSliceHeadIndent
2020-08-12 10:54:15 +03:00
opRootSliceHeadIndent
2020-05-02 17:35:41 +03:00
opSliceElemIndent
2020-08-12 10:54:15 +03:00
opRootSliceElemIndent
2020-05-02 17:35:41 +03:00
opSliceEndIndent
opArrayHead
opArrayElem
opArrayEnd
2020-05-02 17:35:41 +03:00
opArrayHeadIndent
opArrayElemIndent
opArrayEndIndent
opMapHead
opMapHeadLoad
opMapKey
opMapValue
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
opMapHeadIndent
2020-08-12 10:54:15 +03:00
opRootMapHeadIndent
opMapHeadLoadIndent
2020-05-02 17:35:41 +03:00
opMapKeyIndent
2020-08-12 10:54:15 +03:00
opRootMapKeyIndent
2020-05-02 17:35:41 +03:00
opMapValueIndent
2020-08-12 10:54:15 +03:00
opMapEnd
2020-05-02 17:35:41 +03:00
opMapEndIndent
2020-05-01 07:12:01 +03:00
// StructFieldHead
2020-04-29 19:44:48 +03:00
opStructFieldHead
opStructFieldHeadInt
2020-04-30 05:56:56 +03:00
opStructFieldHeadInt8
opStructFieldHeadInt16
opStructFieldHeadInt32
opStructFieldHeadInt64
opStructFieldHeadUint
opStructFieldHeadUint8
opStructFieldHeadUint16
opStructFieldHeadUint32
opStructFieldHeadUint64
opStructFieldHeadFloat32
opStructFieldHeadFloat64
2020-04-29 19:44:48 +03:00
opStructFieldHeadString
2020-04-30 05:56:56 +03:00
opStructFieldHeadBool
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
opStructFieldHeadIndent
opStructFieldHeadIntIndent
opStructFieldHeadInt8Indent
opStructFieldHeadInt16Indent
opStructFieldHeadInt32Indent
opStructFieldHeadInt64Indent
opStructFieldHeadUintIndent
opStructFieldHeadUint8Indent
opStructFieldHeadUint16Indent
opStructFieldHeadUint32Indent
opStructFieldHeadUint64Indent
opStructFieldHeadFloat32Indent
opStructFieldHeadFloat64Indent
opStructFieldHeadStringIndent
opStructFieldHeadBoolIndent
2020-05-01 07:12:01 +03:00
// StructFieldHead with omitempty
opStructFieldHeadOmitEmpty
opStructFieldHeadIntOmitEmpty
opStructFieldHeadInt8OmitEmpty
opStructFieldHeadInt16OmitEmpty
opStructFieldHeadInt32OmitEmpty
opStructFieldHeadInt64OmitEmpty
opStructFieldHeadUintOmitEmpty
opStructFieldHeadUint8OmitEmpty
opStructFieldHeadUint16OmitEmpty
opStructFieldHeadUint32OmitEmpty
opStructFieldHeadUint64OmitEmpty
opStructFieldHeadFloat32OmitEmpty
opStructFieldHeadFloat64OmitEmpty
opStructFieldHeadStringOmitEmpty
opStructFieldHeadBoolOmitEmpty
2020-05-02 17:35:41 +03:00
opStructFieldHeadOmitEmptyIndent
opStructFieldHeadIntOmitEmptyIndent
opStructFieldHeadInt8OmitEmptyIndent
opStructFieldHeadInt16OmitEmptyIndent
opStructFieldHeadInt32OmitEmptyIndent
opStructFieldHeadInt64OmitEmptyIndent
opStructFieldHeadUintOmitEmptyIndent
opStructFieldHeadUint8OmitEmptyIndent
opStructFieldHeadUint16OmitEmptyIndent
opStructFieldHeadUint32OmitEmptyIndent
opStructFieldHeadUint64OmitEmptyIndent
opStructFieldHeadFloat32OmitEmptyIndent
opStructFieldHeadFloat64OmitEmptyIndent
opStructFieldHeadStringOmitEmptyIndent
opStructFieldHeadBoolOmitEmptyIndent
2020-05-01 07:12:01 +03:00
// StructFieldHead for pointer structure
2020-04-29 19:44:48 +03:00
opStructFieldPtrHead
opStructFieldPtrHeadInt
2020-04-30 05:56:56 +03:00
opStructFieldPtrHeadInt8
opStructFieldPtrHeadInt16
opStructFieldPtrHeadInt32
opStructFieldPtrHeadInt64
opStructFieldPtrHeadUint
opStructFieldPtrHeadUint8
opStructFieldPtrHeadUint16
opStructFieldPtrHeadUint32
opStructFieldPtrHeadUint64
opStructFieldPtrHeadFloat32
opStructFieldPtrHeadFloat64
2020-04-29 19:44:48 +03:00
opStructFieldPtrHeadString
2020-04-30 05:56:56 +03:00
opStructFieldPtrHeadBool
2020-05-01 07:12:01 +03:00
2020-08-12 12:42:29 +03:00
opStructFieldRecursive
2020-05-02 17:35:41 +03:00
opStructFieldPtrHeadIndent
opStructFieldPtrHeadIntIndent
opStructFieldPtrHeadInt8Indent
opStructFieldPtrHeadInt16Indent
opStructFieldPtrHeadInt32Indent
opStructFieldPtrHeadInt64Indent
opStructFieldPtrHeadUintIndent
opStructFieldPtrHeadUint8Indent
opStructFieldPtrHeadUint16Indent
opStructFieldPtrHeadUint32Indent
opStructFieldPtrHeadUint64Indent
opStructFieldPtrHeadFloat32Indent
opStructFieldPtrHeadFloat64Indent
opStructFieldPtrHeadStringIndent
opStructFieldPtrHeadBoolIndent
2020-05-01 07:12:01 +03:00
// StructFieldPtrHead with omitempty
opStructFieldPtrHeadOmitEmpty
opStructFieldPtrHeadIntOmitEmpty
opStructFieldPtrHeadInt8OmitEmpty
opStructFieldPtrHeadInt16OmitEmpty
opStructFieldPtrHeadInt32OmitEmpty
opStructFieldPtrHeadInt64OmitEmpty
opStructFieldPtrHeadUintOmitEmpty
opStructFieldPtrHeadUint8OmitEmpty
opStructFieldPtrHeadUint16OmitEmpty
opStructFieldPtrHeadUint32OmitEmpty
opStructFieldPtrHeadUint64OmitEmpty
opStructFieldPtrHeadFloat32OmitEmpty
opStructFieldPtrHeadFloat64OmitEmpty
opStructFieldPtrHeadStringOmitEmpty
opStructFieldPtrHeadBoolOmitEmpty
2020-05-02 17:35:41 +03:00
opStructFieldPtrHeadOmitEmptyIndent
opStructFieldPtrHeadIntOmitEmptyIndent
opStructFieldPtrHeadInt8OmitEmptyIndent
opStructFieldPtrHeadInt16OmitEmptyIndent
opStructFieldPtrHeadInt32OmitEmptyIndent
opStructFieldPtrHeadInt64OmitEmptyIndent
opStructFieldPtrHeadUintOmitEmptyIndent
opStructFieldPtrHeadUint8OmitEmptyIndent
opStructFieldPtrHeadUint16OmitEmptyIndent
opStructFieldPtrHeadUint32OmitEmptyIndent
opStructFieldPtrHeadUint64OmitEmptyIndent
opStructFieldPtrHeadFloat32OmitEmptyIndent
opStructFieldPtrHeadFloat64OmitEmptyIndent
opStructFieldPtrHeadStringOmitEmptyIndent
opStructFieldPtrHeadBoolOmitEmptyIndent
2020-05-01 07:12:01 +03:00
// StructField
2020-04-29 18:31:50 +03:00
opStructField
opStructFieldInt
2020-04-30 05:56:56 +03:00
opStructFieldInt8
opStructFieldInt16
opStructFieldInt32
opStructFieldInt64
opStructFieldUint
opStructFieldUint8
opStructFieldUint16
opStructFieldUint32
opStructFieldUint64
opStructFieldFloat32
opStructFieldFloat64
2020-04-29 18:31:50 +03:00
opStructFieldString
2020-04-30 05:56:56 +03:00
opStructFieldBool
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
opStructFieldIndent
opStructFieldIntIndent
opStructFieldInt8Indent
opStructFieldInt16Indent
opStructFieldInt32Indent
opStructFieldInt64Indent
opStructFieldUintIndent
opStructFieldUint8Indent
opStructFieldUint16Indent
opStructFieldUint32Indent
opStructFieldUint64Indent
opStructFieldFloat32Indent
opStructFieldFloat64Indent
opStructFieldStringIndent
opStructFieldBoolIndent
2020-05-01 07:12:01 +03:00
// StructField with omitempty
opStructFieldOmitEmpty
opStructFieldIntOmitEmpty
opStructFieldInt8OmitEmpty
opStructFieldInt16OmitEmpty
opStructFieldInt32OmitEmpty
opStructFieldInt64OmitEmpty
opStructFieldUintOmitEmpty
opStructFieldUint8OmitEmpty
opStructFieldUint16OmitEmpty
opStructFieldUint32OmitEmpty
opStructFieldUint64OmitEmpty
opStructFieldFloat32OmitEmpty
opStructFieldFloat64OmitEmpty
opStructFieldStringOmitEmpty
opStructFieldBoolOmitEmpty
2020-05-02 17:35:41 +03:00
opStructFieldOmitEmptyIndent
opStructFieldIntOmitEmptyIndent
opStructFieldInt8OmitEmptyIndent
opStructFieldInt16OmitEmptyIndent
opStructFieldInt32OmitEmptyIndent
opStructFieldInt64OmitEmptyIndent
opStructFieldUintOmitEmptyIndent
opStructFieldUint8OmitEmptyIndent
opStructFieldUint16OmitEmptyIndent
opStructFieldUint32OmitEmptyIndent
opStructFieldUint64OmitEmptyIndent
opStructFieldFloat32OmitEmptyIndent
opStructFieldFloat64OmitEmptyIndent
opStructFieldStringOmitEmptyIndent
opStructFieldBoolOmitEmptyIndent
2020-04-29 18:31:50 +03:00
opStructEnd
2020-05-02 17:35:41 +03:00
opStructEndIndent
2020-04-29 18:31:50 +03:00
)
func (t opType) String() string {
switch t {
case opEnd:
return "END"
case opInt:
return "INT"
case opInt8:
return "INT8"
case opInt16:
return "INT16"
case opInt32:
return "INT32"
case opInt64:
return "INT64"
case opUint:
return "UINT"
case opUint8:
return "UINT8"
case opUint16:
return "UINT16"
case opUint32:
return "UINT32"
case opUint64:
return "UINT64"
case opFloat32:
return "FLOAT32"
case opFloat64:
return "FLOAT64"
case opString:
return "STRING"
case opBool:
return "BOOL"
case opInterface:
return "INTERFACE"
2020-04-29 18:31:50 +03:00
case opPtr:
return "PTR"
2020-05-04 12:39:17 +03:00
case opMarshalJSON:
return "MARSHAL_JSON"
case opMarshalText:
return "MARSHAL_TEXT"
2020-05-02 17:35:41 +03:00
2020-04-29 18:31:50 +03:00
case opSliceHead:
return "SLICE_HEAD"
case opSliceElem:
return "SLICE_ELEM"
case opSliceEnd:
return "SLICE_END"
2020-05-02 17:35:41 +03:00
case opSliceHeadIndent:
return "SLICE_HEAD_INDENT"
2020-08-12 10:54:15 +03:00
case opRootSliceHeadIndent:
return "ROOT_SLICE_HEAD_INDENT"
2020-05-02 17:35:41 +03:00
case opSliceElemIndent:
return "SLICE_ELEM_INDENT"
2020-08-12 10:54:15 +03:00
case opRootSliceElemIndent:
return "ROOT_SLICE_ELEM_INDENT"
2020-05-02 17:35:41 +03:00
case opSliceEndIndent:
return "SLICE_END_INDENT"
case opArrayHead:
return "ARRAY_HEAD"
case opArrayElem:
return "ARRAY_ELEM"
case opArrayEnd:
return "ARRAY_END"
2020-05-02 17:35:41 +03:00
case opArrayHeadIndent:
return "ARRAY_HEAD_INDENT"
case opArrayElemIndent:
return "ARRAY_ELEM_INDENT"
case opArrayEndIndent:
return "ARRAY_END_INDENT"
case opMapHead:
return "MAP_HEAD"
case opMapHeadLoad:
return "MAP_HEAD_LOAD"
case opMapKey:
return "MAP_KEY"
case opMapValue:
return "MAP_VALUE"
case opMapEnd:
return "MAP_END"
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
case opMapHeadIndent:
return "MAP_HEAD_INDENT"
2020-08-12 10:54:15 +03:00
case opRootMapHeadIndent:
return "ROOT_MAP_HEAD_INDENT"
case opMapHeadLoadIndent:
return "MAP_HEAD_LOAD_INDENT"
2020-05-02 17:35:41 +03:00
case opMapKeyIndent:
return "MAP_KEY_INDENT"
2020-08-12 10:54:15 +03:00
case opRootMapKeyIndent:
return "ROOT_MAP_KEY_INDENT"
2020-05-02 17:35:41 +03:00
case opMapValueIndent:
return "MAP_VALUE_INDENT"
case opMapEndIndent:
return "MAP_END_INDENT"
2020-08-12 12:42:29 +03:00
case opStructFieldRecursive:
return "STRUCT_FIELD_RECURSIVE"
2020-04-29 19:44:48 +03:00
case opStructFieldHead:
return "STRUCT_FIELD_HEAD"
case opStructFieldHeadInt:
return "STRUCT_FIELD_HEAD_INT"
2020-04-30 05:56:56 +03:00
case opStructFieldHeadInt8:
return "STRUCT_FIELD_HEAD_INT8"
case opStructFieldHeadInt16:
return "STRUCT_FIELD_HEAD_INT16"
case opStructFieldHeadInt32:
return "STRUCT_FIELD_HEAD_INT32"
case opStructFieldHeadInt64:
return "STRUCT_FIELD_HEAD_INT64"
case opStructFieldHeadUint:
return "STRUCT_FIELD_HEAD_UINT"
case opStructFieldHeadUint8:
return "STRUCT_FIELD_HEAD_UINT8"
case opStructFieldHeadUint16:
return "STRUCT_FIELD_HEAD_UINT16"
case opStructFieldHeadUint32:
return "STRUCT_FIELD_HEAD_UINT32"
case opStructFieldHeadUint64:
return "STRUCT_FIELD_HEAD_UINT64"
case opStructFieldHeadFloat32:
return "STRUCT_FIELD_HEAD_FLOAT32"
case opStructFieldHeadFloat64:
return "STRUCT_FIELD_HEAD_FLOAT64"
2020-04-29 19:44:48 +03:00
case opStructFieldHeadString:
return "STRUCT_FIELD_HEAD_STRING"
2020-04-30 05:56:56 +03:00
case opStructFieldHeadBool:
return "STRUCT_FIELD_HEAD_BOOL"
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
case opStructFieldHeadIndent:
return "STRUCT_FIELD_HEAD_INDENT"
case opStructFieldHeadIntIndent:
return "STRUCT_FIELD_HEAD_INT_INDENT"
case opStructFieldHeadInt8Indent:
return "STRUCT_FIELD_HEAD_INT8_INDENT"
case opStructFieldHeadInt16Indent:
return "STRUCT_FIELD_HEAD_INT16_INDENT"
case opStructFieldHeadInt32Indent:
return "STRUCT_FIELD_HEAD_INT32_INDENT"
case opStructFieldHeadInt64Indent:
return "STRUCT_FIELD_HEAD_INT64_INDENT"
case opStructFieldHeadUintIndent:
return "STRUCT_FIELD_HEAD_UINT_INDENT"
case opStructFieldHeadUint8Indent:
return "STRUCT_FIELD_HEAD_UINT8_INDENT"
case opStructFieldHeadUint16Indent:
return "STRUCT_FIELD_HEAD_UINT16_INDENT"
case opStructFieldHeadUint32Indent:
return "STRUCT_FIELD_HEAD_UINT32_INDENT"
case opStructFieldHeadUint64Indent:
return "STRUCT_FIELD_HEAD_UINT64_INDENT"
case opStructFieldHeadFloat32Indent:
return "STRUCT_FIELD_HEAD_FLOAT32_INDENT"
case opStructFieldHeadFloat64Indent:
return "STRUCT_FIELD_HEAD_FLOAT64_INDENT"
case opStructFieldHeadStringIndent:
return "STRUCT_FIELD_HEAD_STRING_INDENT"
case opStructFieldHeadBoolIndent:
return "STRUCT_FIELD_HEAD_BOOL_INDENT"
2020-05-01 07:12:01 +03:00
case opStructFieldHeadOmitEmpty:
return "STRUCT_FIELD_HEAD_OMIT_EMPTY"
case opStructFieldHeadIntOmitEmpty:
return "STRUCT_FIELD_HEAD_INT_OMIT_EMPTY"
case opStructFieldHeadInt8OmitEmpty:
return "STRUCT_FIELD_HEAD_INT8_OMIT_EMPTY"
case opStructFieldHeadInt16OmitEmpty:
return "STRUCT_FIELD_HEAD_INT16_OMIT_EMPTY"
case opStructFieldHeadInt32OmitEmpty:
return "STRUCT_FIELD_HEAD_INT32_OMIT_EMPTY"
case opStructFieldHeadInt64OmitEmpty:
return "STRUCT_FIELD_HEAD_INT64_OMIT_EMPTY"
case opStructFieldHeadUintOmitEmpty:
return "STRUCT_FIELD_HEAD_UINT_OMIT_EMPTY"
case opStructFieldHeadUint8OmitEmpty:
return "STRUCT_FIELD_HEAD_UINT8_OMIT_EMPTY"
case opStructFieldHeadUint16OmitEmpty:
return "STRUCT_FIELD_HEAD_UINT16_OMIT_EMPTY"
case opStructFieldHeadUint32OmitEmpty:
return "STRUCT_FIELD_HEAD_UINT32_OMIT_EMPTY"
case opStructFieldHeadUint64OmitEmpty:
return "STRUCT_FIELD_HEAD_UINT64_OMIT_EMPTY"
case opStructFieldHeadFloat32OmitEmpty:
return "STRUCT_FIELD_HEAD_FLOAT32_OMIT_EMPTY"
case opStructFieldHeadFloat64OmitEmpty:
return "STRUCT_FIELD_HEAD_FLOAT64_OMIT_EMPTY"
case opStructFieldHeadStringOmitEmpty:
return "STRUCT_FIELD_HEAD_STRING_OMIT_EMPTY"
case opStructFieldHeadBoolOmitEmpty:
return "STRUCT_FIELD_HEAD_BOOL_OMIT_EMPTY"
2020-05-02 17:35:41 +03:00
case opStructFieldHeadOmitEmptyIndent:
return "STRUCT_FIELD_HEAD_OMIT_EMPTY_INDENT"
case opStructFieldHeadIntOmitEmptyIndent:
return "STRUCT_FIELD_HEAD_INT_OMIT_EMPTY_INDENT"
case opStructFieldHeadInt8OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_INT8_OMIT_EMPTY_INDENT"
case opStructFieldHeadInt16OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_INT16_OMIT_EMPTY_INDENT"
case opStructFieldHeadInt32OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_INT32_OMIT_EMPTY_INDENT"
case opStructFieldHeadInt64OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_INT64_OMIT_EMPTY_INDENT"
case opStructFieldHeadUintOmitEmptyIndent:
return "STRUCT_FIELD_HEAD_UINT_OMIT_EMPTY_INDENT"
case opStructFieldHeadUint8OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_UINT8_OMIT_EMPTY_INDENT"
case opStructFieldHeadUint16OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_UINT16_OMIT_EMPTY_INDENT"
case opStructFieldHeadUint32OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_UINT32_OMIT_EMPTY_INDENT"
case opStructFieldHeadUint64OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_UINT64_OMIT_EMPTY_INDENT"
case opStructFieldHeadFloat32OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_FLOAT32_OMIT_EMPTY_INDENT"
case opStructFieldHeadFloat64OmitEmptyIndent:
return "STRUCT_FIELD_HEAD_FLOAT64_OMIT_EMPTY_INDENT"
case opStructFieldHeadStringOmitEmptyIndent:
return "STRUCT_FIELD_HEAD_STRING_OMIT_EMPTY_INDENT"
case opStructFieldHeadBoolOmitEmptyIndent:
return "STRUCT_FIELD_HEAD_BOOL_OMIT_EMPTY_INDENT"
2020-04-29 19:44:48 +03:00
case opStructFieldPtrHead:
return "STRUCT_FIELD_PTR_HEAD"
case opStructFieldPtrHeadInt:
return "STRUCT_FIELD_PTR_HEAD_INT"
2020-04-30 05:56:56 +03:00
case opStructFieldPtrHeadInt8:
return "STRUCT_FIELD_PTR_HEAD_INT8"
case opStructFieldPtrHeadInt16:
return "STRUCT_FIELD_PTR_HEAD_INT16"
case opStructFieldPtrHeadInt32:
return "STRUCT_FIELD_PTR_HEAD_INT32"
case opStructFieldPtrHeadInt64:
return "STRUCT_FIELD_PTR_HEAD_INT64"
case opStructFieldPtrHeadUint:
return "STRUCT_FIELD_PTR_HEAD_UINT"
case opStructFieldPtrHeadUint8:
return "STRUCT_FIELD_PTR_HEAD_UINT8"
case opStructFieldPtrHeadUint16:
return "STRUCT_FIELD_PTR_HEAD_UINT16"
case opStructFieldPtrHeadUint32:
return "STRUCT_FIELD_PTR_HEAD_UINT32"
case opStructFieldPtrHeadUint64:
return "STRUCT_FIELD_PTR_HEAD_UINT64"
case opStructFieldPtrHeadFloat32:
return "STRUCT_FIELD_PTR_HEAD_FLOAT32"
case opStructFieldPtrHeadFloat64:
return "STRUCT_FIELD_PTR_HEAD_FLOAT64"
2020-04-29 19:44:48 +03:00
case opStructFieldPtrHeadString:
return "STRUCT_FIELD_PTR_HEAD_STRING"
2020-04-30 05:56:56 +03:00
case opStructFieldPtrHeadBool:
return "STRUCT_FIELD_PTR_HEAD_BOOL"
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadIndent:
return "STRUCT_FIELD_PTR_HEAD_INDENT"
case opStructFieldPtrHeadIntIndent:
return "STRUCT_FIELD_PTR_HEAD_INT_INDENT"
case opStructFieldPtrHeadInt8Indent:
return "STRUCT_FIELD_PTR_HEAD_INT8_INDENT"
case opStructFieldPtrHeadInt16Indent:
return "STRUCT_FIELD_PTR_HEAD_INT16_INDENT"
case opStructFieldPtrHeadInt32Indent:
return "STRUCT_FIELD_PTR_HEAD_INT32_INDENT"
case opStructFieldPtrHeadInt64Indent:
return "STRUCT_FIELD_PTR_HEAD_INT64_INDENT"
case opStructFieldPtrHeadUintIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT_INDENT"
case opStructFieldPtrHeadUint8Indent:
return "STRUCT_FIELD_PTR_HEAD_UINT8_INDENT"
case opStructFieldPtrHeadUint16Indent:
return "STRUCT_FIELD_PTR_HEAD_UINT16_INDENT"
case opStructFieldPtrHeadUint32Indent:
return "STRUCT_FIELD_PTR_HEAD_UINT32_INDENT"
case opStructFieldPtrHeadUint64Indent:
return "STRUCT_FIELD_PTR_HEAD_UINT64_INDENT"
case opStructFieldPtrHeadFloat32Indent:
return "STRUCT_FIELD_PTR_HEAD_FLOAT32_INDENT"
case opStructFieldPtrHeadFloat64Indent:
return "STRUCT_FIELD_PTR_HEAD_FLOAT64_INDENT"
case opStructFieldPtrHeadStringIndent:
return "STRUCT_FIELD_PTR_HEAD_STRING_INDENT"
case opStructFieldPtrHeadBoolIndent:
return "STRUCT_FIELD_PTR_HEAD_BOOL_INDENT"
2020-05-01 07:12:01 +03:00
case opStructFieldPtrHeadOmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_OMIT_EMPTY"
case opStructFieldPtrHeadIntOmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_INT_OMIT_EMPTY"
case opStructFieldPtrHeadInt8OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_INT8_OMIT_EMPTY"
case opStructFieldPtrHeadInt16OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_INT16_OMIT_EMPTY"
case opStructFieldPtrHeadInt32OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_INT32_OMIT_EMPTY"
case opStructFieldPtrHeadInt64OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_INT64_OMIT_EMPTY"
case opStructFieldPtrHeadUintOmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_UINT_OMIT_EMPTY"
case opStructFieldPtrHeadUint8OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_UINT8_OMIT_EMPTY"
case opStructFieldPtrHeadUint16OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_UINT16_OMIT_EMPTY"
case opStructFieldPtrHeadUint32OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_UINT32_OMIT_EMPTY"
case opStructFieldPtrHeadUint64OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_UINT64_OMIT_EMPTY"
case opStructFieldPtrHeadFloat32OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_FLOAT32_OMIT_EMPTY"
case opStructFieldPtrHeadFloat64OmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_FLOAT64_OMIT_EMPTY"
case opStructFieldPtrHeadStringOmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_STRING_OMIT_EMPTY"
case opStructFieldPtrHeadBoolOmitEmpty:
return "STRUCT_FIELD_PTR_HEAD_BOOL_OMIT_EMPTY"
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadOmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadIntOmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_INT_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadInt8OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_INT8_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadInt16OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_INT16_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadInt32OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_INT32_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadInt64OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_INT64_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadUintOmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadUint8OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT8_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadUint16OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT16_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadUint32OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT32_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadUint64OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_UINT64_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadFloat32OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_FLOAT32_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadFloat64OmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_FLOAT64_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadStringOmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_STRING_OMIT_EMPTY_INDENT"
case opStructFieldPtrHeadBoolOmitEmptyIndent:
return "STRUCT_FIELD_PTR_HEAD_BOOL_OMIT_EMPTY_INDENT"
2020-04-29 18:31:50 +03:00
case opStructField:
return "STRUCT_FIELD"
case opStructFieldInt:
return "STRUCT_FIELD_INT"
2020-04-30 05:56:56 +03:00
case opStructFieldInt8:
return "STRUCT_FIELD_INT8"
case opStructFieldInt16:
return "STRUCT_FIELD_INT16"
case opStructFieldInt32:
return "STRUCT_FIELD_INT32"
case opStructFieldInt64:
return "STRUCT_FIELD_INT64"
case opStructFieldUint:
return "STRUCT_FIELD_UINT"
case opStructFieldUint8:
return "STRUCT_FIELD_UINT8"
case opStructFieldUint16:
return "STRUCT_FIELD_UINT16"
case opStructFieldUint32:
return "STRUCT_FIELD_UINT32"
case opStructFieldUint64:
return "STRUCT_FIELD_UINT64"
case opStructFieldFloat32:
return "STRUCT_FIELD_FLOAT32"
case opStructFieldFloat64:
return "STRUCT_FIELD_FLOAT64"
2020-04-29 18:31:50 +03:00
case opStructFieldString:
return "STRUCT_FIELD_STRING"
2020-04-30 05:56:56 +03:00
case opStructFieldBool:
return "STRUCT_FIELD_BOOL"
2020-05-01 07:12:01 +03:00
2020-05-02 17:35:41 +03:00
case opStructFieldIndent:
return "STRUCT_FIELD_INDENT"
case opStructFieldIntIndent:
return "STRUCT_FIELD_INT_INDENT"
case opStructFieldInt8Indent:
return "STRUCT_FIELD_INT8_INDENT"
case opStructFieldInt16Indent:
return "STRUCT_FIELD_INT16_INDENT"
case opStructFieldInt32Indent:
return "STRUCT_FIELD_INT32_INDENT"
case opStructFieldInt64Indent:
return "STRUCT_FIELD_INT64_INDENT"
case opStructFieldUintIndent:
return "STRUCT_FIELD_UINT_INDENT"
case opStructFieldUint8Indent:
return "STRUCT_FIELD_UINT8_INDENT"
case opStructFieldUint16Indent:
return "STRUCT_FIELD_UINT16_INDENT"
case opStructFieldUint32Indent:
return "STRUCT_FIELD_UINT32_INDENT"
case opStructFieldUint64Indent:
return "STRUCT_FIELD_UINT64_INDENT"
case opStructFieldFloat32Indent:
return "STRUCT_FIELD_FLOAT32_INDENT"
case opStructFieldFloat64Indent:
return "STRUCT_FIELD_FLOAT64_INDENT"
case opStructFieldStringIndent:
return "STRUCT_FIELD_STRING_INDENT"
case opStructFieldBoolIndent:
return "STRUCT_FIELD_BOOL_INDENT"
2020-05-01 07:12:01 +03:00
case opStructFieldOmitEmpty:
return "STRUCT_FIELD_OMIT_EMPTY"
case opStructFieldIntOmitEmpty:
return "STRUCT_FIELD_INT_OMIT_EMPTY"
case opStructFieldInt8OmitEmpty:
return "STRUCT_FIELD_INT8_OMIT_EMPTY"
case opStructFieldInt16OmitEmpty:
return "STRUCT_FIELD_INT16_OMIT_EMPTY"
case opStructFieldInt32OmitEmpty:
return "STRUCT_FIELD_INT32_OMIT_EMPTY"
case opStructFieldInt64OmitEmpty:
return "STRUCT_FIELD_INT64_OMIT_EMPTY"
case opStructFieldUintOmitEmpty:
return "STRUCT_FIELD_UINT_OMIT_EMPTY"
case opStructFieldUint8OmitEmpty:
return "STRUCT_FIELD_UINT8_OMIT_EMPTY"
case opStructFieldUint16OmitEmpty:
return "STRUCT_FIELD_UINT16_OMIT_EMPTY"
case opStructFieldUint32OmitEmpty:
return "STRUCT_FIELD_UINT32_OMIT_EMPTY"
case opStructFieldUint64OmitEmpty:
return "STRUCT_FIELD_UINT64_OMIT_EMPTY"
case opStructFieldFloat32OmitEmpty:
return "STRUCT_FIELD_FLOAT32_OMIT_EMPTY"
case opStructFieldFloat64OmitEmpty:
return "STRUCT_FIELD_FLOAT64_OMIT_EMPTY"
case opStructFieldStringOmitEmpty:
return "STRUCT_FIELD_STRING_OMIT_EMPTY"
case opStructFieldBoolOmitEmpty:
return "STRUCT_FIELD_BOOL_OMIT_EMPTY"
2020-05-02 17:35:41 +03:00
case opStructFieldOmitEmptyIndent:
return "STRUCT_FIELD_OMIT_EMPTY_INDENT"
case opStructFieldIntOmitEmptyIndent:
return "STRUCT_FIELD_INT_OMIT_EMPTY_INDENT"
case opStructFieldInt8OmitEmptyIndent:
return "STRUCT_FIELD_INT8_OMIT_EMPTY_INDENT"
case opStructFieldInt16OmitEmptyIndent:
return "STRUCT_FIELD_INT16_OMIT_EMPTY_INDENT"
case opStructFieldInt32OmitEmptyIndent:
return "STRUCT_FIELD_INT32_OMIT_EMPTY_INDENT"
case opStructFieldInt64OmitEmptyIndent:
return "STRUCT_FIELD_INT64_OMIT_EMPTY_INDENT"
case opStructFieldUintOmitEmptyIndent:
return "STRUCT_FIELD_UINT_OMIT_EMPTY_INDENT"
case opStructFieldUint8OmitEmptyIndent:
return "STRUCT_FIELD_UINT8_OMIT_EMPTY_INDENT"
case opStructFieldUint16OmitEmptyIndent:
return "STRUCT_FIELD_UINT16_OMIT_EMPTY_INDENT"
case opStructFieldUint32OmitEmptyIndent:
return "STRUCT_FIELD_UINT32_OMIT_EMPTY_INDENT"
case opStructFieldUint64OmitEmptyIndent:
return "STRUCT_FIELD_UINT64_OMIT_EMPTY_INDENT"
case opStructFieldFloat32OmitEmptyIndent:
return "STRUCT_FIELD_FLOAT32_OMIT_EMPTY_INDENT"
case opStructFieldFloat64OmitEmptyIndent:
return "STRUCT_FIELD_FLOAT64_OMIT_EMPTY_INDENT"
case opStructFieldStringOmitEmptyIndent:
return "STRUCT_FIELD_STRING_OMIT_EMPTY_INDENT"
case opStructFieldBoolOmitEmptyIndent:
return "STRUCT_FIELD_BOOL_OMIT_EMPTY_INDENT"
2020-04-29 18:31:50 +03:00
case opStructEnd:
return "STRUCT_END"
2020-05-02 17:35:41 +03:00
case opStructEndIndent:
return "STRUCT_END_INDENT"
2020-04-29 18:31:50 +03:00
}
return ""
}
2020-08-09 11:48:28 +03:00
func copyOpcode(code *opcode) *opcode {
codeMap := map[uintptr]*opcode{}
return code.copy(codeMap)
}
2020-04-29 18:31:50 +03:00
type opcodeHeader struct {
2020-05-02 17:35:41 +03:00
op opType
typ *rtype
ptr uintptr
indent int
next *opcode
2020-04-29 18:31:50 +03:00
}
2020-08-09 11:48:28 +03:00
func (h *opcodeHeader) copy(codeMap map[uintptr]*opcode) *opcodeHeader {
return &opcodeHeader{
op: h.op,
typ: h.typ,
ptr: h.ptr,
indent: h.indent,
next: h.next.copy(codeMap),
}
}
2020-04-29 18:31:50 +03:00
type opcode struct {
*opcodeHeader
}
2020-05-02 17:35:41 +03:00
func newOpCode(op opType, typ *rtype, indent int, next *opcode) *opcode {
2020-04-29 18:31:50 +03:00
return &opcode{
opcodeHeader: &opcodeHeader{
2020-05-02 17:35:41 +03:00
op: op,
typ: typ,
indent: indent,
next: next,
2020-04-29 18:31:50 +03:00
},
}
}
2020-05-02 17:35:41 +03:00
func newEndOp(indent int) *opcode {
return newOpCode(opEnd, nil, indent, nil)
2020-04-29 18:31:50 +03:00
}
func (c *opcode) beforeLastCode() *opcode {
code := c
for {
var nextCode *opcode
switch code.op {
2020-05-02 17:35:41 +03:00
case opArrayElem, opArrayElemIndent:
nextCode = code.toArrayElemCode().end
2020-08-12 10:54:15 +03:00
case opSliceElem, opSliceElemIndent, opRootSliceElemIndent:
2020-04-29 18:31:50 +03:00
nextCode = code.toSliceElemCode().end
2020-08-12 10:54:15 +03:00
case opMapKey, opMapKeyIndent, opRootMapKeyIndent:
nextCode = code.toMapKeyCode().end
default:
2020-04-29 18:31:50 +03:00
nextCode = code.next
}
if nextCode.op == opEnd {
return code
}
code = nextCode
}
return nil
}
2020-08-09 11:48:28 +03:00
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
}
var code *opcode
switch c.op {
case opArrayHead, opArrayHeadIndent:
code = c.toArrayHeaderCode().copy(codeMap)
case opArrayElem, opArrayElemIndent:
code = c.toArrayElemCode().copy(codeMap)
2020-08-12 10:54:15 +03:00
case opSliceHead, opSliceHeadIndent, opRootSliceHeadIndent:
2020-08-09 11:48:28 +03:00
code = c.toSliceHeaderCode().copy(codeMap)
2020-08-12 10:54:15 +03:00
case opSliceElem, opSliceElemIndent, opRootSliceElemIndent:
2020-08-09 11:48:28 +03:00
code = c.toSliceElemCode().copy(codeMap)
2020-08-12 10:54:15 +03:00
case opMapHead, opMapHeadLoad, opMapHeadIndent, opMapHeadLoadIndent, opRootMapHeadIndent:
2020-08-09 11:48:28 +03:00
code = c.toMapHeadCode().copy(codeMap)
2020-08-12 10:54:15 +03:00
case opMapKey, opMapKeyIndent, opRootMapKeyIndent:
2020-08-09 11:48:28 +03:00
code = c.toMapKeyCode().copy(codeMap)
case opMapValue, opMapValueIndent:
code = c.toMapValueCode().copy(codeMap)
2020-08-12 12:42:29 +03:00
case opStructFieldRecursive:
code = c.toRecursiveCode().copy(codeMap)
2020-08-09 11:48:28 +03:00
case opStructFieldHead,
opStructFieldHeadInt,
opStructFieldHeadInt8,
opStructFieldHeadInt16,
opStructFieldHeadInt32,
opStructFieldHeadInt64,
opStructFieldHeadUint,
opStructFieldHeadUint8,
opStructFieldHeadUint16,
opStructFieldHeadUint32,
opStructFieldHeadUint64,
opStructFieldHeadFloat32,
opStructFieldHeadFloat64,
opStructFieldHeadString,
opStructFieldHeadBool,
opStructFieldHeadIndent,
opStructFieldHeadIntIndent,
opStructFieldHeadInt8Indent,
opStructFieldHeadInt16Indent,
opStructFieldHeadInt32Indent,
opStructFieldHeadInt64Indent,
opStructFieldHeadUintIndent,
opStructFieldHeadUint8Indent,
opStructFieldHeadUint16Indent,
opStructFieldHeadUint32Indent,
opStructFieldHeadUint64Indent,
opStructFieldHeadFloat32Indent,
opStructFieldHeadFloat64Indent,
opStructFieldHeadStringIndent,
opStructFieldHeadBoolIndent,
opStructFieldHeadOmitEmpty,
opStructFieldHeadIntOmitEmpty,
opStructFieldHeadInt8OmitEmpty,
opStructFieldHeadInt16OmitEmpty,
opStructFieldHeadInt32OmitEmpty,
opStructFieldHeadInt64OmitEmpty,
opStructFieldHeadUintOmitEmpty,
opStructFieldHeadUint8OmitEmpty,
opStructFieldHeadUint16OmitEmpty,
opStructFieldHeadUint32OmitEmpty,
opStructFieldHeadUint64OmitEmpty,
opStructFieldHeadFloat32OmitEmpty,
opStructFieldHeadFloat64OmitEmpty,
opStructFieldHeadStringOmitEmpty,
opStructFieldHeadBoolOmitEmpty,
opStructFieldHeadOmitEmptyIndent,
opStructFieldHeadIntOmitEmptyIndent,
opStructFieldHeadInt8OmitEmptyIndent,
opStructFieldHeadInt16OmitEmptyIndent,
opStructFieldHeadInt32OmitEmptyIndent,
opStructFieldHeadInt64OmitEmptyIndent,
opStructFieldHeadUintOmitEmptyIndent,
opStructFieldHeadUint8OmitEmptyIndent,
opStructFieldHeadUint16OmitEmptyIndent,
opStructFieldHeadUint32OmitEmptyIndent,
opStructFieldHeadUint64OmitEmptyIndent,
opStructFieldHeadFloat32OmitEmptyIndent,
opStructFieldHeadFloat64OmitEmptyIndent,
opStructFieldHeadStringOmitEmptyIndent,
opStructFieldHeadBoolOmitEmptyIndent,
opStructFieldPtrHead,
opStructFieldPtrHeadInt,
opStructFieldPtrHeadInt8,
opStructFieldPtrHeadInt16,
opStructFieldPtrHeadInt32,
opStructFieldPtrHeadInt64,
opStructFieldPtrHeadUint,
opStructFieldPtrHeadUint8,
opStructFieldPtrHeadUint16,
opStructFieldPtrHeadUint32,
opStructFieldPtrHeadUint64,
opStructFieldPtrHeadFloat32,
opStructFieldPtrHeadFloat64,
opStructFieldPtrHeadString,
opStructFieldPtrHeadBool,
opStructFieldPtrHeadIndent,
opStructFieldPtrHeadIntIndent,
opStructFieldPtrHeadInt8Indent,
opStructFieldPtrHeadInt16Indent,
opStructFieldPtrHeadInt32Indent,
opStructFieldPtrHeadInt64Indent,
opStructFieldPtrHeadUintIndent,
opStructFieldPtrHeadUint8Indent,
opStructFieldPtrHeadUint16Indent,
opStructFieldPtrHeadUint32Indent,
opStructFieldPtrHeadUint64Indent,
opStructFieldPtrHeadFloat32Indent,
opStructFieldPtrHeadFloat64Indent,
opStructFieldPtrHeadStringIndent,
opStructFieldPtrHeadBoolIndent,
opStructFieldPtrHeadOmitEmpty,
opStructFieldPtrHeadIntOmitEmpty,
opStructFieldPtrHeadInt8OmitEmpty,
opStructFieldPtrHeadInt16OmitEmpty,
opStructFieldPtrHeadInt32OmitEmpty,
opStructFieldPtrHeadInt64OmitEmpty,
opStructFieldPtrHeadUintOmitEmpty,
opStructFieldPtrHeadUint8OmitEmpty,
opStructFieldPtrHeadUint16OmitEmpty,
opStructFieldPtrHeadUint32OmitEmpty,
opStructFieldPtrHeadUint64OmitEmpty,
opStructFieldPtrHeadFloat32OmitEmpty,
opStructFieldPtrHeadFloat64OmitEmpty,
opStructFieldPtrHeadStringOmitEmpty,
opStructFieldPtrHeadBoolOmitEmpty,
opStructFieldPtrHeadOmitEmptyIndent,
opStructFieldPtrHeadIntOmitEmptyIndent,
opStructFieldPtrHeadInt8OmitEmptyIndent,
opStructFieldPtrHeadInt16OmitEmptyIndent,
opStructFieldPtrHeadInt32OmitEmptyIndent,
opStructFieldPtrHeadInt64OmitEmptyIndent,
opStructFieldPtrHeadUintOmitEmptyIndent,
opStructFieldPtrHeadUint8OmitEmptyIndent,
opStructFieldPtrHeadUint16OmitEmptyIndent,
opStructFieldPtrHeadUint32OmitEmptyIndent,
opStructFieldPtrHeadUint64OmitEmptyIndent,
opStructFieldPtrHeadFloat32OmitEmptyIndent,
opStructFieldPtrHeadFloat64OmitEmptyIndent,
opStructFieldPtrHeadStringOmitEmptyIndent,
opStructFieldPtrHeadBoolOmitEmptyIndent,
opStructField,
opStructFieldInt,
opStructFieldInt8,
opStructFieldInt16,
opStructFieldInt32,
opStructFieldInt64,
opStructFieldUint,
opStructFieldUint8,
opStructFieldUint16,
opStructFieldUint32,
opStructFieldUint64,
opStructFieldFloat32,
opStructFieldFloat64,
opStructFieldString,
opStructFieldBool,
opStructFieldIndent,
opStructFieldIntIndent,
opStructFieldInt8Indent,
opStructFieldInt16Indent,
opStructFieldInt32Indent,
opStructFieldInt64Indent,
opStructFieldUintIndent,
opStructFieldUint8Indent,
opStructFieldUint16Indent,
opStructFieldUint32Indent,
opStructFieldUint64Indent,
opStructFieldFloat32Indent,
opStructFieldFloat64Indent,
opStructFieldStringIndent,
opStructFieldBoolIndent,
opStructFieldOmitEmpty,
opStructFieldIntOmitEmpty,
opStructFieldInt8OmitEmpty,
opStructFieldInt16OmitEmpty,
opStructFieldInt32OmitEmpty,
opStructFieldInt64OmitEmpty,
opStructFieldUintOmitEmpty,
opStructFieldUint8OmitEmpty,
opStructFieldUint16OmitEmpty,
opStructFieldUint32OmitEmpty,
opStructFieldUint64OmitEmpty,
opStructFieldFloat32OmitEmpty,
opStructFieldFloat64OmitEmpty,
opStructFieldStringOmitEmpty,
opStructFieldBoolOmitEmpty,
opStructFieldOmitEmptyIndent,
opStructFieldIntOmitEmptyIndent,
opStructFieldInt8OmitEmptyIndent,
opStructFieldInt16OmitEmptyIndent,
opStructFieldInt32OmitEmptyIndent,
opStructFieldInt64OmitEmptyIndent,
opStructFieldUintOmitEmptyIndent,
opStructFieldUint8OmitEmptyIndent,
opStructFieldUint16OmitEmptyIndent,
opStructFieldUint32OmitEmptyIndent,
opStructFieldUint64OmitEmptyIndent,
opStructFieldFloat32OmitEmptyIndent,
opStructFieldFloat64OmitEmptyIndent,
opStructFieldStringOmitEmptyIndent,
opStructFieldBoolOmitEmptyIndent:
code = c.toStructFieldCode().copy(codeMap)
default:
code = &opcode{}
codeMap[addr] = code
code.opcodeHeader = c.opcodeHeader.copy(codeMap)
}
return code
}
2020-04-29 18:31:50 +03:00
func (c *opcode) dump() string {
codes := []string{}
for code := c; code.op != opEnd; {
2020-05-02 17:35:41 +03:00
indent := strings.Repeat(" ", code.indent)
codes = append(codes, fmt.Sprintf("%s%s", indent, code.op))
switch code.op {
2020-05-02 17:35:41 +03:00
case opArrayElem, opArrayElemIndent:
code = code.toArrayElemCode().end
2020-08-12 10:54:15 +03:00
case opSliceElem, opSliceElemIndent, opRootSliceElemIndent:
2020-04-29 18:31:50 +03:00
code = code.toSliceElemCode().end
2020-08-12 10:54:15 +03:00
case opMapKey, opMapKeyIndent, opRootMapKeyIndent:
code = code.toMapKeyCode().end
default:
2020-04-29 18:31:50 +03:00
code = code.next
}
}
return strings.Join(codes, "\n")
}
2020-04-29 19:44:48 +03:00
func (c *opcode) toSliceHeaderCode() *sliceHeaderCode {
return (*sliceHeaderCode)(unsafe.Pointer(c))
2020-04-29 18:31:50 +03:00
}
2020-04-29 19:44:48 +03:00
func (c *opcode) toSliceElemCode() *sliceElemCode {
return (*sliceElemCode)(unsafe.Pointer(c))
2020-04-29 18:31:50 +03:00
}
func (c *opcode) toArrayHeaderCode() *arrayHeaderCode {
return (*arrayHeaderCode)(unsafe.Pointer(c))
}
func (c *opcode) toArrayElemCode() *arrayElemCode {
return (*arrayElemCode)(unsafe.Pointer(c))
}
2020-04-29 18:31:50 +03:00
func (c *opcode) toStructFieldCode() *structFieldCode {
return (*structFieldCode)(unsafe.Pointer(c))
}
func (c *opcode) toMapHeadCode() *mapHeaderCode {
return (*mapHeaderCode)(unsafe.Pointer(c))
}
func (c *opcode) toMapKeyCode() *mapKeyCode {
return (*mapKeyCode)(unsafe.Pointer(c))
}
func (c *opcode) toMapValueCode() *mapValueCode {
return (*mapValueCode)(unsafe.Pointer(c))
}
2020-08-12 10:54:15 +03:00
func (c *opcode) toInterfaceCode() *interfaceCode {
return (*interfaceCode)(unsafe.Pointer(c))
}
2020-08-12 12:42:29 +03:00
func (c *opcode) toRecursiveCode() *recursiveCode {
return (*recursiveCode)(unsafe.Pointer(c))
}
2020-04-29 19:44:48 +03:00
type sliceHeaderCode struct {
*opcodeHeader
elem *sliceElemCode
end *opcode
}
2020-05-02 17:35:41 +03:00
func newSliceHeaderCode(indent int) *sliceHeaderCode {
2020-04-29 19:44:48 +03:00
return &sliceHeaderCode{
opcodeHeader: &opcodeHeader{
2020-05-02 17:35:41 +03:00
op: opSliceHead,
indent: indent,
2020-04-29 19:44:48 +03:00
},
}
}
2020-08-09 11:48:28 +03:00
func (c *sliceHeaderCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
header := &sliceHeaderCode{}
code := (*opcode)(unsafe.Pointer(header))
codeMap[addr] = code
header.opcodeHeader = c.opcodeHeader.copy(codeMap)
header.elem = (*sliceElemCode)(unsafe.Pointer(c.elem.copy(codeMap)))
header.end = c.end.copy(codeMap)
return code
}
2020-04-29 18:31:50 +03:00
type sliceElemCode struct {
*opcodeHeader
idx uintptr
len uintptr
size uintptr
data uintptr
end *opcode
}
func (c *sliceElemCode) set(header *reflect.SliceHeader) {
c.idx = uintptr(0)
c.len = uintptr(header.Len)
c.data = header.Data
}
2020-08-09 11:48:28 +03:00
func (c *sliceElemCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
elem := &sliceElemCode{
idx: c.idx,
len: c.len,
size: c.size,
data: c.data,
}
code := (*opcode)(unsafe.Pointer(elem))
codeMap[addr] = code
elem.opcodeHeader = c.opcodeHeader.copy(codeMap)
elem.end = c.end.copy(codeMap)
return code
}
type arrayHeaderCode struct {
*opcodeHeader
len uintptr
elem *arrayElemCode
end *opcode
}
2020-05-02 17:35:41 +03:00
func newArrayHeaderCode(indent, alen int) *arrayHeaderCode {
return &arrayHeaderCode{
opcodeHeader: &opcodeHeader{
2020-05-02 17:35:41 +03:00
op: opArrayHead,
indent: indent,
},
len: uintptr(alen),
}
}
2020-08-09 11:48:28 +03:00
func (c *arrayHeaderCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
header := &arrayHeaderCode{}
code := (*opcode)(unsafe.Pointer(header))
codeMap[addr] = code
header.opcodeHeader = c.opcodeHeader.copy(codeMap)
header.len = c.len
header.elem = (*arrayElemCode)(unsafe.Pointer(c.elem.copy(codeMap)))
header.end = c.end.copy(codeMap)
return code
}
type arrayElemCode struct {
*opcodeHeader
idx uintptr
len uintptr
size uintptr
end *opcode
}
2020-08-09 11:48:28 +03:00
func (c *arrayElemCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
elem := &arrayElemCode{
idx: c.idx,
len: c.len,
size: c.size,
}
code := (*opcode)(unsafe.Pointer(elem))
codeMap[addr] = code
elem.opcodeHeader = c.opcodeHeader.copy(codeMap)
elem.end = c.end.copy(codeMap)
return code
}
2020-04-29 18:31:50 +03:00
type structFieldCode struct {
*opcodeHeader
2020-04-30 05:56:56 +03:00
key []byte
2020-04-29 18:31:50 +03:00
offset uintptr
nextField *opcode
2020-04-29 19:44:48 +03:00
end *opcode
2020-04-29 18:31:50 +03:00
}
2020-08-09 11:48:28 +03:00
func (c *structFieldCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
field := &structFieldCode{
key: c.key,
offset: c.offset,
}
code := (*opcode)(unsafe.Pointer(field))
codeMap[addr] = code
field.opcodeHeader = c.opcodeHeader.copy(codeMap)
field.nextField = c.nextField.copy(codeMap)
field.end = c.end.copy(codeMap)
return code
}
type mapHeaderCode struct {
*opcodeHeader
key *mapKeyCode
value *mapValueCode
end *opcode
}
2020-08-09 11:48:28 +03:00
func (c *mapHeaderCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
header := &mapHeaderCode{}
code := (*opcode)(unsafe.Pointer(header))
codeMap[addr] = code
header.opcodeHeader = c.opcodeHeader.copy(codeMap)
header.key = (*mapKeyCode)(unsafe.Pointer(c.key.copy(codeMap)))
header.value = (*mapValueCode)(unsafe.Pointer(c.value.copy(codeMap)))
header.end = c.end.copy(codeMap)
return code
}
type mapKeyCode struct {
*opcodeHeader
idx int
len int
iter unsafe.Pointer
end *opcode
}
2020-08-09 11:48:28 +03:00
func (c *mapKeyCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
key := &mapKeyCode{
idx: c.idx,
len: c.len,
iter: c.iter,
}
code := (*opcode)(unsafe.Pointer(key))
codeMap[addr] = code
key.opcodeHeader = c.opcodeHeader.copy(codeMap)
key.end = c.end.copy(codeMap)
return code
}
func (c *mapKeyCode) set(len int, iter unsafe.Pointer) {
c.idx = 0
c.len = len
c.iter = iter
}
type mapValueCode struct {
*opcodeHeader
iter unsafe.Pointer
}
2020-08-09 11:48:28 +03:00
func (c *mapValueCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
value := &mapValueCode{
iter: c.iter,
}
code := (*opcode)(unsafe.Pointer(value))
codeMap[addr] = code
value.opcodeHeader = c.opcodeHeader.copy(codeMap)
return code
}
func (c *mapValueCode) set(iter unsafe.Pointer) {
c.iter = iter
}
func newMapHeaderCode(typ *rtype, withLoad bool, indent int) *mapHeaderCode {
var op opType
if withLoad {
op = opMapHeadLoad
} else {
op = opMapHead
}
return &mapHeaderCode{
opcodeHeader: &opcodeHeader{
op: op,
2020-05-02 17:35:41 +03:00
typ: typ,
indent: indent,
},
}
}
2020-05-02 17:35:41 +03:00
func newMapKeyCode(indent int) *mapKeyCode {
return &mapKeyCode{
opcodeHeader: &opcodeHeader{
2020-05-02 17:35:41 +03:00
op: opMapKey,
indent: indent,
},
}
}
2020-05-02 17:35:41 +03:00
func newMapValueCode(indent int) *mapValueCode {
return &mapValueCode{
opcodeHeader: &opcodeHeader{
2020-05-02 17:35:41 +03:00
op: opMapValue,
indent: indent,
},
}
}
2020-08-12 12:42:29 +03:00
type interfaceCode struct {
*opcodeHeader
root bool
}
func (c *interfaceCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
iface := &interfaceCode{}
code := (*opcode)(unsafe.Pointer(iface))
codeMap[addr] = code
iface.opcodeHeader = c.opcodeHeader.copy(codeMap)
return code
}
type recursiveCode struct {
*opcodeHeader
jmp *compiledCode
}
func (c *recursiveCode) copy(codeMap map[uintptr]*opcode) *opcode {
if c == nil {
return nil
}
addr := uintptr(unsafe.Pointer(c))
if code, exists := codeMap[addr]; exists {
return code
}
recur := &recursiveCode{}
code := (*opcode)(unsafe.Pointer(recur))
codeMap[addr] = code
recur.opcodeHeader = c.opcodeHeader.copy(codeMap)
recur.jmp = &compiledCode{
code: c.jmp.code.copy(codeMap),
}
return code
}
2020-08-13 09:26:35 +03:00
func newRecursiveCode(recursive *recursiveCode) *opcode {
code := copyOpcode(recursive.jmp.code)
head := (*structFieldCode)(unsafe.Pointer(code))
head.end.next = newEndOp(0)
code.ptr = recursive.ptr
switch code.op {
case opStructFieldPtrHead:
code.op = opStructFieldHead
case opStructFieldPtrHeadInt:
code.op = opStructFieldHeadInt
case opStructFieldPtrHeadInt8:
code.op = opStructFieldHeadInt8
case opStructFieldPtrHeadInt16:
code.op = opStructFieldHeadInt16
case opStructFieldPtrHeadInt32:
code.op = opStructFieldHeadInt32
case opStructFieldPtrHeadInt64:
code.op = opStructFieldHeadInt64
case opStructFieldPtrHeadUint:
code.op = opStructFieldHeadUint
case opStructFieldPtrHeadUint8:
code.op = opStructFieldHeadUint8
case opStructFieldPtrHeadUint16:
code.op = opStructFieldHeadUint16
case opStructFieldPtrHeadUint32:
code.op = opStructFieldHeadUint32
case opStructFieldPtrHeadUint64:
code.op = opStructFieldHeadUint64
case opStructFieldPtrHeadFloat32:
code.op = opStructFieldHeadFloat32
case opStructFieldPtrHeadFloat64:
code.op = opStructFieldHeadFloat64
case opStructFieldPtrHeadString:
code.op = opStructFieldHeadString
case opStructFieldPtrHeadBool:
code.op = opStructFieldHeadBool
case opStructFieldPtrHeadIndent:
code.op = opStructFieldHeadIndent
case opStructFieldPtrHeadIntIndent:
code.op = opStructFieldHeadIntIndent
case opStructFieldPtrHeadInt8Indent:
code.op = opStructFieldHeadInt8Indent
case opStructFieldPtrHeadInt16Indent:
code.op = opStructFieldHeadInt16Indent
case opStructFieldPtrHeadInt32Indent:
code.op = opStructFieldHeadInt32Indent
case opStructFieldPtrHeadInt64Indent:
code.op = opStructFieldHeadInt64Indent
case opStructFieldPtrHeadUintIndent:
code.op = opStructFieldHeadUintIndent
case opStructFieldPtrHeadUint8Indent:
code.op = opStructFieldHeadUint8Indent
case opStructFieldPtrHeadUint16Indent:
code.op = opStructFieldHeadUint16Indent
case opStructFieldPtrHeadUint32Indent:
code.op = opStructFieldHeadUint32Indent
case opStructFieldPtrHeadUint64Indent:
code.op = opStructFieldHeadUint64Indent
case opStructFieldPtrHeadFloat32Indent:
code.op = opStructFieldHeadFloat32Indent
case opStructFieldPtrHeadFloat64Indent:
code.op = opStructFieldHeadFloat64Indent
case opStructFieldPtrHeadStringIndent:
code.op = opStructFieldHeadStringIndent
case opStructFieldPtrHeadBoolIndent:
code.op = opStructFieldHeadBoolIndent
case opStructFieldPtrHeadOmitEmpty:
code.op = opStructFieldHeadOmitEmpty
case opStructFieldPtrHeadIntOmitEmpty:
code.op = opStructFieldHeadIntOmitEmpty
case opStructFieldPtrHeadInt8OmitEmpty:
code.op = opStructFieldHeadInt8OmitEmpty
case opStructFieldPtrHeadInt16OmitEmpty:
code.op = opStructFieldHeadInt16OmitEmpty
case opStructFieldPtrHeadInt32OmitEmpty:
code.op = opStructFieldHeadInt32OmitEmpty
case opStructFieldPtrHeadInt64OmitEmpty:
code.op = opStructFieldHeadInt64OmitEmpty
case opStructFieldPtrHeadUintOmitEmpty:
code.op = opStructFieldHeadUintOmitEmpty
case opStructFieldPtrHeadUint8OmitEmpty:
code.op = opStructFieldHeadUint8OmitEmpty
case opStructFieldPtrHeadUint16OmitEmpty:
code.op = opStructFieldHeadUint16OmitEmpty
case opStructFieldPtrHeadUint32OmitEmpty:
code.op = opStructFieldHeadUint32OmitEmpty
case opStructFieldPtrHeadUint64OmitEmpty:
code.op = opStructFieldHeadUint64OmitEmpty
case opStructFieldPtrHeadFloat32OmitEmpty:
code.op = opStructFieldHeadFloat32OmitEmpty
case opStructFieldPtrHeadFloat64OmitEmpty:
code.op = opStructFieldHeadFloat64OmitEmpty
case opStructFieldPtrHeadStringOmitEmpty:
code.op = opStructFieldHeadStringOmitEmpty
case opStructFieldPtrHeadBoolOmitEmpty:
code.op = opStructFieldHeadBoolOmitEmpty
case opStructFieldPtrHeadOmitEmptyIndent:
code.op = opStructFieldHeadOmitEmptyIndent
case opStructFieldPtrHeadIntOmitEmptyIndent:
code.op = opStructFieldHeadIntOmitEmptyIndent
case opStructFieldPtrHeadInt8OmitEmptyIndent:
code.op = opStructFieldHeadInt8OmitEmptyIndent
case opStructFieldPtrHeadInt16OmitEmptyIndent:
code.op = opStructFieldHeadInt16OmitEmptyIndent
case opStructFieldPtrHeadInt32OmitEmptyIndent:
code.op = opStructFieldHeadInt32OmitEmptyIndent
case opStructFieldPtrHeadInt64OmitEmptyIndent:
code.op = opStructFieldHeadInt64OmitEmptyIndent
case opStructFieldPtrHeadUintOmitEmptyIndent:
code.op = opStructFieldHeadUintOmitEmptyIndent
case opStructFieldPtrHeadUint8OmitEmptyIndent:
code.op = opStructFieldHeadUint8OmitEmptyIndent
case opStructFieldPtrHeadUint16OmitEmptyIndent:
code.op = opStructFieldHeadUint16OmitEmptyIndent
case opStructFieldPtrHeadUint32OmitEmptyIndent:
code.op = opStructFieldHeadUint32OmitEmptyIndent
case opStructFieldPtrHeadUint64OmitEmptyIndent:
code.op = opStructFieldHeadUint64OmitEmptyIndent
case opStructFieldPtrHeadFloat32OmitEmptyIndent:
code.op = opStructFieldHeadFloat32OmitEmptyIndent
case opStructFieldPtrHeadFloat64OmitEmptyIndent:
code.op = opStructFieldHeadFloat64OmitEmptyIndent
case opStructFieldPtrHeadStringOmitEmptyIndent:
code.op = opStructFieldHeadStringOmitEmptyIndent
case opStructFieldPtrHeadBoolOmitEmptyIndent:
code.op = opStructFieldHeadBoolOmitEmptyIndent
}
return code
}