mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Env callback function: env_getExtCode
This commit is contained in:
parent
b21fc5ff9f
commit
eaa2890366
1 changed files with 22 additions and 8 deletions
30
vm/vm_jit.go
30
vm/vm_jit.go
|
|
@ -14,7 +14,8 @@ import "github.com/ethereum/go-ethereum/state"
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
import "fmt"
|
|
||||||
|
//import "fmt"
|
||||||
import "reflect"
|
import "reflect"
|
||||||
import "errors"
|
import "errors"
|
||||||
|
|
||||||
|
|
@ -87,6 +88,14 @@ func trim(m []byte) []byte {
|
||||||
return m[skip:]
|
return m[skip:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDataPtr(m []byte) *byte {
|
||||||
|
var p *byte
|
||||||
|
if len(m) > 0 {
|
||||||
|
p = &m[0]
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
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++ {
|
for i, l := 0, len(m); i < l/2; i++ {
|
||||||
|
|
@ -134,15 +143,11 @@ func (self *JitVm) Run(me, caller ContextRef, code []byte, value, gas, price *bi
|
||||||
data.elems[Difficulty] = big2llvm(self.env.Difficulty())
|
data.elems[Difficulty] = big2llvm(self.env.Difficulty())
|
||||||
data.elems[GasLimit] = big2llvm(self.env.GasLimit())
|
data.elems[GasLimit] = big2llvm(self.env.GasLimit())
|
||||||
data.elems[CodeSize] = big2llvm(big.NewInt(int64(len(code)))) // TODO: Keep code size as i64
|
data.elems[CodeSize] = big2llvm(big.NewInt(int64(len(code)))) // TODO: Keep code size as i64
|
||||||
if len(callData) > 0 {
|
data.callData = getDataPtr(callData)
|
||||||
data.callData = &callData[0]
|
data.code = getDataPtr(code)
|
||||||
}
|
|
||||||
if len(code) > 0 {
|
|
||||||
data.code = &code[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
r := C.evmjit_run(unsafe.Pointer(&data), unsafe.Pointer(self))
|
r := C.evmjit_run(unsafe.Pointer(&data), unsafe.Pointer(self))
|
||||||
fmt.Printf("JIT result: %d\n", r)
|
//fmt.Printf("JIT result: %d\n", r)
|
||||||
|
|
||||||
gasLeft := llvm2big(&data.elems[Gas]) // TODO: Set value directly to gas instance
|
gasLeft := llvm2big(&data.elems[Gas]) // TODO: Set value directly to gas instance
|
||||||
gas.Set(gasLeft)
|
gas.Set(gasLeft)
|
||||||
|
|
@ -291,3 +296,12 @@ func env_log(_vm unsafe.Pointer, dataPtr *byte, dataLen uint64, _topic1 unsafe.P
|
||||||
|
|
||||||
vm.Env().AddLog(state.NewLog(vm.me.Address(), topics, data))
|
vm.Env().AddLog(state.NewLog(vm.me.Address(), topics, data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//export env_getExtCode
|
||||||
|
func env_getExtCode(_vm unsafe.Pointer, _addr unsafe.Pointer, o_size *uint64) *byte {
|
||||||
|
vm := (*JitVm)(_vm)
|
||||||
|
addr := llvm2hash((*i256)(_addr))
|
||||||
|
code := vm.Env().State().GetCode(addr)
|
||||||
|
*o_size = uint64(len(code))
|
||||||
|
return getDataPtr(code)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue