/
interp_creator.go
62 lines (53 loc) · 1.64 KB
/
interp_creator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package xvm
import (
"io/ioutil"
"github.com/superconsensus-chain/xupercore/kernel/contract/bridge"
"github.com/xuperchain/xvm/exec"
"github.com/xuperchain/xvm/runtime/emscripten"
gowasm "github.com/xuperchain/xvm/runtime/go"
)
type xvmInterpCreator struct {
cm *codeManager
config bridge.InstanceCreatorConfig
}
func newXVMInterpCreator(creatorConfig *bridge.InstanceCreatorConfig) (bridge.InstanceCreator, error) {
creator := &xvmInterpCreator{
config: *creatorConfig,
}
var err error
creator.cm, err = newCodeManager(creator.config.Basedir,
creator.compileCode, creator.makeExecCode)
if err != nil {
return nil, err
}
return creator, nil
}
func (x *xvmInterpCreator) compileCode(buf []byte, outputPath string) error {
return ioutil.WriteFile(outputPath, buf, 0600)
}
func (x *xvmInterpCreator) makeExecCode(codepath string) (exec.Code, error) {
codebuf, err := ioutil.ReadFile(codepath)
if err != nil {
return nil, err
}
resolver := exec.NewMultiResolver(
gowasm.NewResolver(),
emscripten.NewResolver(),
newSyscallResolver(x.config.SyscallService),
builtinResolver,
)
return exec.NewInterpCode(codebuf, resolver)
}
func (x *xvmInterpCreator) CreateInstance(ctx *bridge.Context, cp bridge.ContractCodeProvider) (bridge.Instance, error) {
code, err := x.cm.GetExecCode(ctx.ContractName, cp)
if err != nil {
return nil, err
}
return createInstance(ctx, code, x.config.SyscallService)
}
func (x *xvmInterpCreator) RemoveCache(contractName string) {
x.cm.RemoveCode(contractName)
}
func init() {
bridge.Register(bridge.TypeWasm, "ixvm", newXVMInterpCreator)
}