26
`github.com/bytedance/sonic/internal/caching`
27
`github.com/bytedance/sonic/option`
28
`github.com/bytedance/sonic/internal/rt`
34
_StackSize = unsafe.Sizeof(_Stack{})
38
bytesPool = sync.Pool{}
39
stackPool = sync.Pool{}
40
bufferPool = sync.Pool{}
41
programCache = caching.CreateProgramCache()
63
var _KeepAlive struct {
72
var errCallShadow = errors.New("DON'T CALL THIS!")
75
func _Encoder_Shadow(rb *[]byte, vp unsafe.Pointer, sb *_Stack, fv uint64) (err error) {
77
var frame [_FP_offs]byte
85
_KeepAlive.frame = frame
90
func newBytes() []byte {
91
if ret := bytesPool.Get(); ret != nil {
94
return make([]byte, 0, option.DefaultEncoderBufferSize)
98
func newStack() *_Stack {
99
if ret := stackPool.Get(); ret == nil {
106
func resetStack(p *_Stack) {
107
memclrNoHeapPointers(unsafe.Pointer(p), _StackSize)
110
func newBuffer() *bytes.Buffer {
111
if ret := bufferPool.Get(); ret != nil {
112
return ret.(*bytes.Buffer)
114
return bytes.NewBuffer(make([]byte, 0, option.DefaultEncoderBufferSize))
118
func freeBytes(p []byte) {
123
func freeStack(p *_Stack) {
128
func freeBuffer(p *bytes.Buffer) {
133
func makeEncoder(vt *rt.GoType, ex ...interface{}) (interface{}, error) {
134
if pp, err := newCompiler().compile(vt.Pack(), ex[0].(bool)); err != nil {
137
as := newAssembler(pp)
138
as.name = vt.String()
139
return as.Load(), nil
143
func findOrCompile(vt *rt.GoType, pv bool) (_Encoder, error) {
144
if val := programCache.Get(vt); val != nil {
145
return val.(_Encoder), nil
146
} else if ret, err := programCache.Compute(vt, makeEncoder, pv); err == nil {
147
return ret.(_Encoder), nil
153
func pretouchType(_vt reflect.Type, opts option.CompileOptions, v uint8) (map[reflect.Type]uint8, error) {
155
compiler := newCompiler().apply(opts)
156
encoder := func(vt *rt.GoType, ex ...interface{}) (interface{}, error) {
157
if pp, err := compiler.compile(_vt, ex[0].(bool)); err != nil {
160
as := newAssembler(pp)
161
as.name = vt.String()
162
return as.Load(), nil
167
vt := rt.UnpackType(_vt)
168
if val := programCache.Get(vt); val != nil {
170
} else if _, err := programCache.Compute(vt, encoder, v == 1); err == nil {
171
return compiler.rec, nil
177
func pretouchRec(vtm map[reflect.Type]uint8, opts option.CompileOptions) error {
178
if opts.RecursiveDepth < 0 || len(vtm) == 0 {
181
next := make(map[reflect.Type]uint8)
182
for vt, v := range vtm {
183
sub, err := pretouchType(vt, opts, v)
187
for svt, v := range sub {
191
opts.RecursiveDepth -= 1
192
return pretouchRec(next, opts)