Fix CREATE gas counting in JitVm

This commit is contained in:
Paweł Bylica 2015-01-21 20:29:46 +01:00
parent 5e9c889b94
commit ce677ffd87

View file

@ -136,6 +136,12 @@ func untested(condition bool, message string) {
} }
} }
func assert(condition bool, message string) {
if !condition {
panic("Assert `" + message + "` failed!")
}
}
func NewJitVm(env Environment) *JitVm { func NewJitVm(env Environment) *JitVm {
return &JitVm{env: env} return &JitVm{env: env}
} }
@ -302,20 +308,22 @@ func env_call(_vm unsafe.Pointer, _gas unsafe.Pointer, _receiveAddr unsafe.Point
func env_create(_vm unsafe.Pointer, _gas unsafe.Pointer, _value unsafe.Pointer, initDataPtr unsafe.Pointer, 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())
value := llvm2big((*i256)(_value)) value := llvm2big((*i256)(_value))
initData := C.GoBytes(initDataPtr, C.int(initDataLen)) // TODO: Unnecessary if low balance
result := (*i256)(_result) result := (*i256)(_result)
*result = i256{}
if balance.Cmp(value) >= 0 {
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)
*llvmGas = big2llvm(gas) ret, suberr, ref := vm.env.Create(vm.me, nil, initData, gas, vm.price, value)
*result = hash2llvm(addr) if suberr == nil {
} else { dataGas := big.NewInt(int64(len(ret))) // TODO: Nto the best design. env.Create can do it, it has the reference to gas counter
*result = i256{} dataGas.Mul(dataGas, GasCreateByte)
gas.Sub(gas, dataGas)
*result = hash2llvm(ref.Address())
} }
*llvmGas = big2llvm(gas)
} }
//export env_log //export env_log