From eaa2890366ed7c3733ee76248d7326b859ac52d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 15 Jan 2015 15:16:39 +0100 Subject: [PATCH] Env callback function: env_getExtCode --- vm/vm_jit.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/vm/vm_jit.go b/vm/vm_jit.go index 7d693a501b..76b5776e7d 100644 --- a/vm/vm_jit.go +++ b/vm/vm_jit.go @@ -14,7 +14,8 @@ import "github.com/ethereum/go-ethereum/state" import "C" import "unsafe" -import "fmt" + +//import "fmt" import "reflect" import "errors" @@ -87,6 +88,14 @@ func trim(m []byte) []byte { 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 { m := hash2llvm(n.Bytes()) 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[GasLimit] = big2llvm(self.env.GasLimit()) data.elems[CodeSize] = big2llvm(big.NewInt(int64(len(code)))) // TODO: Keep code size as i64 - if len(callData) > 0 { - data.callData = &callData[0] - } - if len(code) > 0 { - data.code = &code[0] - } + data.callData = getDataPtr(callData) + data.code = getDataPtr(code) 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 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)) } + +//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) +}