Env callback function: env_getExtCode

This commit is contained in:
Paweł Bylica 2015-01-15 15:16:39 +01:00
parent b21fc5ff9f
commit eaa2890366

View file

@ -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)
}