mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Fix some memory issues
This commit is contained in:
parent
96b15abff6
commit
78947dc8ad
1 changed files with 15 additions and 25 deletions
40
vm/vm_jit.go
40
vm/vm_jit.go
|
|
@ -103,9 +103,7 @@ func getDataPtr(m []byte) *byte {
|
||||||
|
|
||||||
func big2llvm(n *big.Int) i256 {
|
func big2llvm(n *big.Int) i256 {
|
||||||
m := hash2llvm(n.Bytes())
|
m := hash2llvm(n.Bytes())
|
||||||
for i, l := 0, len(m); i < l/2; i++ {
|
bswap(&m)
|
||||||
m[i], m[l-i-1] = m[l-i-1], m[i]
|
|
||||||
}
|
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,6 +131,7 @@ func NewJitVm(env Environment) *JitVm {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *JitVm) Run(me, caller ContextRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) {
|
func (self *JitVm) Run(me, caller ContextRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) {
|
||||||
|
self.env.SetDepth(self.env.Depth() + 1)
|
||||||
self.me = me // FIXME: Make sure Run() is not used more than once
|
self.me = me // FIXME: Make sure Run() is not used more than once
|
||||||
self.price = price
|
self.price = price
|
||||||
|
|
||||||
|
|
@ -184,18 +183,11 @@ func (self *JitVm) Env() Environment {
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_sha3
|
//export env_sha3
|
||||||
func env_sha3(dataPtr *byte, length uint64, hashPtr unsafe.Pointer) {
|
func env_sha3(dataPtr unsafe.Pointer, length uint64, resultPtr unsafe.Pointer) {
|
||||||
data := llvm2bytes(dataPtr, length)
|
data := C.GoBytes(dataPtr, C.int(length))
|
||||||
hash := crypto.Sha3(data)
|
hash := crypto.Sha3(data)
|
||||||
|
result := (*i256)(resultPtr)
|
||||||
hashHdr := reflect.SliceHeader{
|
*result = hash2llvm(hash)
|
||||||
Data: uintptr(hashPtr),
|
|
||||||
Len: 32,
|
|
||||||
Cap: 32,
|
|
||||||
}
|
|
||||||
oHash := *(*[]byte)(unsafe.Pointer(&hashHdr))
|
|
||||||
|
|
||||||
copy(oHash, hash)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_sstore
|
//export env_sstore
|
||||||
|
|
@ -243,17 +235,17 @@ 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 *byte, inDataLen uint64, outDataPtr *byte, 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 unsafe.Pointer, 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())
|
||||||
value := llvm2big((*i256)(_value))
|
value := llvm2big((*i256)(_value))
|
||||||
|
|
||||||
if vm.env.Depth() < 1024 && balance.Cmp(value) >= 0 {
|
if balance.Cmp(value) >= 0 {
|
||||||
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 := llvm2bytes(inDataPtr, inDataLen)
|
inData := C.GoBytes(inDataPtr, C.int(inDataLen))
|
||||||
outData := llvm2bytes(outDataPtr, outDataLen)
|
outData := C.GoBytes(outDataPtr, C.int(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)
|
||||||
|
|
@ -269,16 +261,16 @@ func env_call(_vm unsafe.Pointer, _gas unsafe.Pointer, _receiveAddr unsafe.Point
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_create
|
//export env_create
|
||||||
func env_create(_vm unsafe.Pointer, _gas unsafe.Pointer, _value unsafe.Pointer, initDataPtr *byte, initDataLen uint64, _result unsafe.Pointer) {
|
func env_create(_vm unsafe.Pointer, _gas unsafe.Pointer, _value unsafe.Pointer, initDataPtr unsafe.Pointer, initDataLen uint64, _result unsafe.Pointer) {
|
||||||
vm := (*JitVm)(_vm)
|
vm := (*JitVm)(_vm)
|
||||||
|
|
||||||
balance := vm.Env().State().GetBalance(vm.me.Address())
|
balance := vm.Env().State().GetBalance(vm.me.Address())
|
||||||
value := llvm2big((*i256)(_value))
|
value := llvm2big((*i256)(_value))
|
||||||
result := (*i256)(_result)
|
result := (*i256)(_result)
|
||||||
|
|
||||||
if vm.env.Depth() < 1024 && balance.Cmp(value) >= 0 {
|
if balance.Cmp(value) >= 0 {
|
||||||
vm.env.State().AddBalance(vm.me.Address(), value.Neg(value))
|
vm.env.State().AddBalance(vm.me.Address(), value.Neg(value))
|
||||||
initData := llvm2bytes(initDataPtr, initDataLen)
|
initData := C.GoBytes(initDataPtr, C.int(initDataLen))
|
||||||
llvmGas := (*i256)(_gas)
|
llvmGas := (*i256)(_gas)
|
||||||
gas := llvm2big(llvmGas)
|
gas := llvm2big(llvmGas)
|
||||||
addr, _, _ := vm.Env().Create(vm.me, vm.me.Address(), initData, gas, vm.price, value)
|
addr, _, _ := vm.Env().Create(vm.me, vm.me.Address(), initData, gas, vm.price, value)
|
||||||
|
|
@ -290,12 +282,10 @@ func env_create(_vm unsafe.Pointer, _gas unsafe.Pointer, _value unsafe.Pointer,
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_log
|
//export env_log
|
||||||
func env_log(_vm unsafe.Pointer, dataPtr *byte, dataLen uint64, _topic1 unsafe.Pointer, _topic2 unsafe.Pointer, _topic3 unsafe.Pointer, _topic4 unsafe.Pointer) {
|
func env_log(_vm unsafe.Pointer, dataPtr unsafe.Pointer, dataLen uint64, _topic1 unsafe.Pointer, _topic2 unsafe.Pointer, _topic3 unsafe.Pointer, _topic4 unsafe.Pointer) {
|
||||||
vm := (*JitVm)(_vm)
|
vm := (*JitVm)(_vm)
|
||||||
|
|
||||||
dataRef := llvm2bytes(dataPtr, dataLen)
|
data := C.GoBytes(dataPtr, C.int(dataLen))
|
||||||
data := make([]byte, len(dataRef))
|
|
||||||
copy(data, dataRef)
|
|
||||||
|
|
||||||
topics := make([][]byte, 0, 4)
|
topics := make([][]byte, 0, 4)
|
||||||
if _topic1 != nil {
|
if _topic1 != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue