mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
SUICIDE support in JitVm
This commit is contained in:
parent
6a89bdc07a
commit
5e9c889b94
1 changed files with 16 additions and 1 deletions
17
vm/vm_jit.go
17
vm/vm_jit.go
|
|
@ -130,7 +130,6 @@ func llvm2bytes(data *byte, length uint64) []byte {
|
||||||
return (*[1 << 30]byte)(unsafe.Pointer(data))[:length:length]
|
return (*[1 << 30]byte)(unsafe.Pointer(data))[:length:length]
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
func untested(condition bool, message string) {
|
func untested(condition bool, message string) {
|
||||||
if condition {
|
if condition {
|
||||||
panic("Condition `" + message + "` tested. Remove assert.")
|
panic("Condition `" + message + "` tested. Remove assert.")
|
||||||
|
|
@ -175,6 +174,14 @@ func (self *JitVm) Run(me, caller ContextRef, code []byte, value, gas, price *bi
|
||||||
if result.returnCode == 1 { // RETURN
|
if result.returnCode == 1 { // RETURN
|
||||||
ret = C.GoBytes(result.returnData, C.int(result.returnDataSize))
|
ret = C.GoBytes(result.returnData, C.int(result.returnDataSize))
|
||||||
C.free(result.returnData)
|
C.free(result.returnData)
|
||||||
|
} else if result.returnCode == 2 { // SUICIDE
|
||||||
|
state := self.Env().State()
|
||||||
|
receiverAddr := llvm2hash(bswap(&self.data.elems[address]))
|
||||||
|
receiverAddr = trim(receiverAddr) // TODO: trim all zeros or subslice 160bits?
|
||||||
|
receiver := state.GetOrNewStateObject(receiverAddr)
|
||||||
|
balance := state.GetBalance(me.Address())
|
||||||
|
receiver.AddAmount(balance)
|
||||||
|
state.Delete(me.Address())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -256,6 +263,14 @@ func env_blockhash(_vm unsafe.Pointer, _number unsafe.Pointer, _result unsafe.Po
|
||||||
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 {
|
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)
|
||||||
|
|
||||||
|
//fmt.Printf("env_call (depth %d)\n", vm.Env().Depth())
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
fmt.Printf("Recovered in env_call (depth %d, out %p %d): %s\n", vm.Env().Depth(), outDataPtr, outDataLen, r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
balance := vm.Env().State().GetBalance(vm.me.Address())
|
balance := vm.Env().State().GetBalance(vm.me.Address())
|
||||||
value := llvm2big((*i256)(_value))
|
value := llvm2big((*i256)(_value))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue