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 vm
18 19 import (
20 "unsafe"
21 _ "unsafe"
22 23 "github.com/bytedance/sonic/internal/encoder/alg"
24 "github.com/bytedance/sonic/internal/encoder/ir"
25 "github.com/bytedance/sonic/internal/encoder/vars"
26 "github.com/bytedance/sonic/internal/rt"
27 )
28 29 func EncodeTypedPointer(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error {
30 if vt == nil {
31 return alg.EncodeNil(buf)
32 } else if pp, err := vars.FindOrCompile(vt, (fv&(1<<alg.BitPointerValue)) != 0, compiler); err != nil {
33 return err
34 } else if vt.Indirect() {
35 return Execute(buf, *vp, sb, fv, pp.(*ir.Program))
36 } else {
37 return Execute(buf, unsafe.Pointer(vp), sb, fv, pp.(*ir.Program))
38 }
39 }
40 41 var compiler func(*rt.GoType, ... interface{}) (interface{}, error)
42 43 func SetCompiler(c func(*rt.GoType, ... interface{}) (interface{}, error)) {
44 compiler = c
45 }
46