aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/instructions.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-08-16 22:09:29 +0800
committerPéter Szilágyi <peterke@gmail.com>2017-08-17 21:50:35 +0800
commitf9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b (patch)
treeea623fa39c51265de09020ead1840ba881748bc9 /core/vm/instructions.go
parentb70a73cd3e49e249a9ab2c41c2dd268786dcd1a3 (diff)
downloadgo-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar.gz
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar.bz2
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar.lz
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar.xz
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.tar.zst
go-tangerine-f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b.zip
core/vm: rework reversion to work on a higher level
Diffstat (limited to 'core/vm/instructions.go')
-rw-r--r--core/vm/instructions.go19
1 files changed, 13 insertions, 6 deletions
diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index b3b7310dd..ece4d2229 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -32,6 +32,7 @@ var (
bigZero = new(big.Int)
errWriteProtection = errors.New("evm: write protection")
errReturnDataOutOfBounds = errors.New("evm: return data out of bounds")
+ errExecutionReverted = errors.New("evm: execution reverted")
)
func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
@@ -579,7 +580,7 @@ func opCreate(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S
}
contract.UseGas(gas)
- _, addr, returnGas, suberr := evm.Create(contract, input, gas, value)
+ res, addr, returnGas, suberr := evm.Create(contract, input, gas, value)
// Push item on the stack based on the returned error. If the ruleset is
// homestead we must check for CodeStoreOutOfGasError (homestead only
// rule) and treat as an error, if the ruleset is frontier we must
@@ -592,9 +593,11 @@ func opCreate(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S
stack.push(addr.Big())
}
contract.Gas += returnGas
-
evm.interpreter.intPool.put(value, offset, size)
+ if suberr == errExecutionReverted {
+ return res, nil
+ }
return nil, nil
}
@@ -622,7 +625,8 @@ func opCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta
stack.push(new(big.Int))
} else {
stack.push(big.NewInt(1))
-
+ }
+ if err == nil || err == errExecutionReverted {
memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
}
contract.Gas += returnGas
@@ -653,10 +657,10 @@ func opCallCode(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack
ret, returnGas, err := evm.CallCode(contract, address, args, gas, value)
if err != nil {
stack.push(new(big.Int))
-
} else {
stack.push(big.NewInt(1))
-
+ }
+ if err == nil || err == errExecutionReverted {
memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
}
contract.Gas += returnGas
@@ -676,6 +680,8 @@ func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st
stack.push(new(big.Int))
} else {
stack.push(big.NewInt(1))
+ }
+ if err == nil || err == errExecutionReverted {
memory.Set(outOffset.Uint64(), outSize.Uint64(), ret)
}
contract.Gas += returnGas
@@ -704,7 +710,8 @@ func opStaticCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stac
stack.push(new(big.Int))
} else {
stack.push(big.NewInt(1))
-
+ }
+ if err == nil || err == errExecutionReverted {
memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
}
contract.Gas += returnGas