xvm/exec/interp.go
(开头部分) 6KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
package exec
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"math"
"reflect"
"github.com/xuperchain/wagon/exec"
"github.com/xuperchain/wagon/wasm"
"github.com/xuperchain/wagon/wasm/leb128"
)
var funcTypes = []interface{}{
(func(*exec.Process) uint32)(nil),
(func(*exec.Process, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32, uint32, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32, uint32, uint32, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32, uint32, uint32, uint32, uint32) uint32)(nil),
(func(*exec.Process, uint32, uint32, uint32, uint32, uint32, uint32, uint32) uint32)(nil),
}
func makeExportFunc(sig wasm.FunctionSig, fun interface{}) (*wasm.Function, error) {
paramLen := len(sig.ParamTypes)
if paramLen >= len(funcTypes) {
return nil, errors.New("bad function type")
}
ftype := reflect.TypeOf(funcTypes[paramLen])
body := reflect.MakeFunc(ftype, func(args []reflect.Value) []reflect.Value {
proc := args[0].Interface().(*exec.Process)
ctx := proc.VM().UserData.(*wagonContext)
params := make([]uint32, len(args)-1)
for i := 1; i < len(args); i++ {
params[i-1] = uint32(args[i].Uint())
}
ret, _ := applyFuncCall(ctx, fun, params)
return []reflect.Value{reflect.ValueOf(ret)}
})
return &wasm.Function{
Sig: &sig,
Host: body,
Body: new(wasm.FunctionBody),
}, nil
}
func makeExportGlobal(sig *wasm.GlobalVar, v int64) (*wasm.GlobalEntry, error) {
buf := new(bytes.Buffer)
switch sig.Type {
case wasm.ValueTypeI32:
buf.WriteByte(0x41)
leb128.WriteVarUint32(buf, uint32(v))
case wasm.ValueTypeI64:
buf.WriteByte(0x42)
leb128.WriteVarint64(buf, v)
case wasm.ValueTypeF32:
后面还有 189 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
