1 /**
2 * Copyright 2024 ByteDance Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 17 package x86
18 19 import (
20 "unsafe"
21 _ "unsafe"
22 23 "github.com/bytedance/sonic/internal/encoder/alg"
24 "github.com/bytedance/sonic/internal/encoder/vars"
25 "github.com/bytedance/sonic/internal/rt"
26 "github.com/bytedance/sonic/loader"
27 _ "github.com/cloudwego/base64x"
28 )
29 30 var compiler func(*rt.GoType, ... interface{}) (interface{}, error)
31 32 func SetCompiler(c func(*rt.GoType, ... interface{}) (interface{}, error)) {
33 compiler = c
34 }
35 36 func ptoenc(p loader.Function) vars.Encoder {
37 return *(*vars.Encoder)(unsafe.Pointer(&p))
38 }
39 40 func EncodeTypedPointer(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error {
41 if vt == nil {
42 return alg.EncodeNil(buf)
43 } else if fn, err := vars.FindOrCompile(vt, (fv&(1<<alg.BitPointerValue)) != 0, compiler); err != nil {
44 return err
45 } else if vt.Indirect() {
46 return fn.(vars.Encoder)(buf, *vp, sb, fv)
47 } else {
48 return fn.(vars.Encoder)(buf, unsafe.Pointer(vp), sb, fv)
49 }
50 }
51 52