Commit 496555ae authored by 袁兴强's avatar 袁兴强

copy slice

parent 8e6cba2c
...@@ -2,6 +2,7 @@ package executor ...@@ -2,6 +2,7 @@ package executor
import ( import (
"fmt" "fmt"
"strconv"
"github.com/perlin-network/life/exec" "github.com/perlin-network/life/exec"
) )
...@@ -21,10 +22,12 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -21,10 +22,12 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
key := vm.Memory[keyPtr : keyPtr+keyLen] key := vm.Memory[keyPtr : keyPtr+keyLen]
valuePtr := int(uint32(vm.GetCurrentFrame().Locals[2])) valuePtr := int(uint32(vm.GetCurrentFrame().Locals[2]))
valueLen := int(uint32(vm.GetCurrentFrame().Locals[3])) valueLen := int(uint32(vm.GetCurrentFrame().Locals[3]))
value := vm.Memory[valuePtr : valuePtr+valueLen] value := make([]byte, valueLen)
copy(value, vm.Memory[valuePtr:valuePtr+valueLen])
setStateDB(key, value) setStateDB(key, value)
return 0 return 0
} }
case "getStateDBSize": case "getStateDBSize":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -32,6 +35,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -32,6 +35,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
key := vm.Memory[keyPtr : keyPtr+keyLen] key := vm.Memory[keyPtr : keyPtr+keyLen]
return int64(getStateDBSize(key)) return int64(getStateDBSize(key))
} }
case "getStateDB": case "getStateDB":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -49,11 +53,10 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -49,11 +53,10 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
if valueLen != len(value) { if valueLen != len(value) {
return 0 return 0
} }
for i, c := range value { copy(vm.Memory[valuePtr:valuePtr+valueLen], value)
vm.Memory[valuePtr+i] = c
}
return int64(valueLen) return int64(valueLen)
} }
case "setLocalDB": case "setLocalDB":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -61,10 +64,12 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -61,10 +64,12 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
key := vm.Memory[keyPtr : keyPtr+keyLen] key := vm.Memory[keyPtr : keyPtr+keyLen]
valuePtr := int(uint32(vm.GetCurrentFrame().Locals[2])) valuePtr := int(uint32(vm.GetCurrentFrame().Locals[2]))
valueLen := int(uint32(vm.GetCurrentFrame().Locals[3])) valueLen := int(uint32(vm.GetCurrentFrame().Locals[3]))
value := vm.Memory[valuePtr : valuePtr+valueLen] value := make([]byte, valueLen)
copy(value, vm.Memory[valuePtr:valuePtr+valueLen])
setLocalDB(key, value) setLocalDB(key, value)
return 0 return 0
} }
case "getLocalDBSize": case "getLocalDBSize":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -72,6 +77,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -72,6 +77,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
key := vm.Memory[keyPtr : keyPtr+keyLen] key := vm.Memory[keyPtr : keyPtr+keyLen]
return int64(getLocalDBSize(key)) return int64(getLocalDBSize(key))
} }
case "getLocalDB": case "getLocalDB":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) keyPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -81,10 +87,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -81,10 +87,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
valueLen := int(uint32(vm.GetCurrentFrame().Locals[3])) valueLen := int(uint32(vm.GetCurrentFrame().Locals[3]))
value, err := getLocalDB(key) value, err := getLocalDB(key)
if err != nil { if err != nil {
for i := 0; i < valueLen; i++ { copy(vm.Memory[valuePtr:valuePtr+valueLen], make([]byte, valueLen))
vm.Memory[valuePtr+i] = 0
}
return 0
} }
if valueLen != len(value) { if valueLen != len(value) {
return 0 return 0
...@@ -94,6 +97,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -94,6 +97,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
} }
return int64(valueLen) return int64(valueLen)
} }
case "execFrozen": case "execFrozen":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
addrPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) addrPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -106,6 +110,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -106,6 +110,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
} }
return 0 return 0
} }
case "execActive": case "execActive":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
addrPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) addrPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -118,6 +123,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -118,6 +123,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
} }
return 0 return 0
} }
case "execTransfer": case "execTransfer":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
fromPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) fromPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -133,6 +139,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -133,6 +139,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
} }
return 0 return 0
} }
case "execTransferFrozen": case "execTransferFrozen":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
fromPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) fromPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
...@@ -148,6 +155,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -148,6 +155,7 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
} }
return 0 return 0
} }
case "getFrom": case "getFrom":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
fromAddr := []byte(getFrom()) fromAddr := []byte(getFrom())
...@@ -157,17 +165,13 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -157,17 +165,13 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
return 0 return 0
} }
case "getHeight": case "getHeight":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 { return getHeight() }
return getHeight()
}
case "getRandom": case "getRandom":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 { return getRandom() }
return getRandom()
}
case "printlog": case "printlog":
return func(vm *exec.VirtualMachine) int64 { return func(vm *exec.VirtualMachine) int64 {
fmt.Println(vm.GetCurrentFrame().Locals)
logPtr := int(uint32(vm.GetCurrentFrame().Locals[0])) logPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
logLen := int(uint32(vm.GetCurrentFrame().Locals[1])) logLen := int(uint32(vm.GetCurrentFrame().Locals[1]))
logInfo := string(vm.Memory[logPtr : logPtr+logLen]) logInfo := string(vm.Memory[logPtr : logPtr+logLen])
...@@ -175,12 +179,21 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport { ...@@ -175,12 +179,21 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
return 0 return 0
} }
case "printint":
return func(vm *exec.VirtualMachine) int64 {
n := vm.GetCurrentFrame().Locals[0]
printlog(strconv.FormatInt(n, 10))
return 0
}
default: default:
panic(fmt.Errorf("unknown field: %s", field)) log.Error("ResolveFunc", "unknown field", field)
} }
default: default:
panic(fmt.Errorf("unknown module: %s", module)) log.Error("ResolveFunc", "unknown module", module)
} }
return nil
} }
// ResolveGlobal defines a set of global variables for use within a WebAssembly module. // ResolveGlobal defines a set of global variables for use within a WebAssembly module.
...@@ -192,9 +205,11 @@ func (r *Resolver) ResolveGlobal(module, field string) int64 { ...@@ -192,9 +205,11 @@ func (r *Resolver) ResolveGlobal(module, field string) int64 {
case "__life_magic": case "__life_magic":
return 424 return 424
default: default:
panic(fmt.Errorf("unknown field: %s", field)) log.Error("ResolveGlobal", "unknown field", field)
} }
default: default:
panic(fmt.Errorf("unknown module: %s", module)) log.Error("ResolveGlobal", "unknown module", module)
} }
return 0
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment