Support for CALLCODE in JitVm

This commit is contained in:
Paweł Bylica 2015-01-21 00:44:01 +01:00
parent 78947dc8ad
commit cf6c66b8bf

View file

@ -17,6 +17,7 @@ import (
"math/big" "math/big"
"reflect" "reflect"
"unsafe" "unsafe"
"bytes"
) )
type JitVm struct { type JitVm struct {
@ -235,7 +236,7 @@ func env_blockhash(_vm unsafe.Pointer, _number unsafe.Pointer, _result unsafe.Po
} }
//export env_call //export env_call
func env_call(_vm unsafe.Pointer, _gas unsafe.Pointer, _receiveAddr unsafe.Pointer, _value unsafe.Pointer, inDataPtr unsafe.Pointer, inDataLen uint64, outDataPtr unsafe.Pointer, outDataLen uint64, _codeAddr unsafe.Pointer) bool { func env_call(_vm unsafe.Pointer, _gas unsafe.Pointer, _receiveAddr unsafe.Pointer, _value unsafe.Pointer, inDataPtr unsafe.Pointer, inDataLen uint64, outDataPtr *byte, outDataLen uint64, _codeAddr unsafe.Pointer) bool {
vm := (*JitVm)(_vm) vm := (*JitVm)(_vm)
balance := vm.Env().State().GetBalance(vm.me.Address()) balance := vm.Env().State().GetBalance(vm.me.Address())
@ -245,11 +246,17 @@ func env_call(_vm unsafe.Pointer, _gas unsafe.Pointer, _receiveAddr unsafe.Point
vm.env.State().AddBalance(vm.me.Address(), value.Neg(value)) vm.env.State().AddBalance(vm.me.Address(), value.Neg(value))
receiveAddr := llvm2hash((*i256)(_receiveAddr)) receiveAddr := llvm2hash((*i256)(_receiveAddr))
inData := C.GoBytes(inDataPtr, C.int(inDataLen)) inData := C.GoBytes(inDataPtr, C.int(inDataLen))
outData := C.GoBytes(outDataPtr, C.int(outDataLen)) outData := llvm2bytes(outDataPtr, outDataLen)
//codeAddr := llvm2hash((*i256)(_codeAddr)) //TODO: Handle CallCode codeAddr := llvm2hash((*i256)(_codeAddr)) //TODO: Handle CallCode
llvmGas := (*i256)(_gas) llvmGas := (*i256)(_gas)
gas := llvm2big(llvmGas) gas := llvm2big(llvmGas)
out, err := vm.env.Call(vm.me, receiveAddr, inData, gas, vm.price, value) var out []byte
var err error
if bytes.Equal(codeAddr, receiveAddr) {
out, err = vm.env.Call(vm.me, codeAddr, inData, gas, vm.price, value)
} else {
out, err = vm.env.CallCode(vm.me, codeAddr, inData, gas, vm.price, value)
}
*llvmGas = big2llvm(gas) *llvmGas = big2llvm(gas)
if err == nil { if err == nil {
copy(outData, out) copy(outData, out)