mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Support for CALLCODE in JitVm
This commit is contained in:
parent
78947dc8ad
commit
cf6c66b8bf
1 changed files with 11 additions and 4 deletions
15
vm/vm_jit.go
15
vm/vm_jit.go
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue