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 积分,解读结果公开显示在下面。

还没有人解读过这个文件。