aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Jentzsch <jentzsch.software@gmail.com>2014-10-06 16:17:27 +0800
committerChristoph Jentzsch <jentzsch.software@gmail.com>2014-10-06 16:17:27 +0800
commit0d5a301957e1b521ed2fa71c55c9d4c0564aec53 (patch)
treee7225b03f2b1b395ceb16f2379646ead1fcefa5a
parentd490d3197bf55a693f0043bd817475f137ba5f82 (diff)
downloaddexon-solidity-0d5a301957e1b521ed2fa71c55c9d4c0564aec53.tar.gz
dexon-solidity-0d5a301957e1b521ed2fa71c55c9d4c0564aec53.tar.zst
dexon-solidity-0d5a301957e1b521ed2fa71c55c9d4c0564aec53.zip
Bug fix, push callcreate before changing gas value in FakeExtVM
-rw-r--r--vm.cpp29
-rw-r--r--vm.h2
2 files changed, 17 insertions, 14 deletions
diff --git a/vm.cpp b/vm.cpp
index 96eeb4d1..feba4ef7 100644
--- a/vm.cpp
+++ b/vm.cpp
@@ -35,6 +35,13 @@ FakeExtVM::FakeExtVM(eth::BlockInfo const& _previousBlock, eth::BlockInfo const&
h160 FakeExtVM::create(u256 _endowment, u256* _gas, bytesConstRef _init, OnOpFunc)
{
+ Transaction t;
+ t.value = _endowment;
+ t.gasPrice = gasPrice;
+ t.gas = *_gas;
+ t.data = _init.toBytes();
+ callcreates.push_back(t);
+
m_s.noteSending(myAddress);
m_ms.internal.resize(m_ms.internal.size() + 1);
auto ret = m_s.create(myAddress, _endowment, gasPrice, _gas, _init, origin, &suicides, &posts, &m_ms ? &(m_ms.internal.back()) : nullptr, OnOpFunc(), 1);
@@ -48,18 +55,18 @@ h160 FakeExtVM::create(u256 _endowment, u256* _gas, bytesConstRef _init, OnOpFun
get<3>(addresses[ret]) = m_s.code(ret);
}
- Transaction t;
- t.value = _endowment;
- t.gasPrice = gasPrice;
- t.gas = *_gas;
- t.data = _init.toBytes();
- callcreates.push_back(t);
-
return ret;
}
bool FakeExtVM::call(Address _receiveAddress, u256 _value, bytesConstRef _data, u256* _gas, bytesRef _out, OnOpFunc, Address, Address)
{
+ Transaction t;
+ t.value = _value;
+ t.gasPrice = gasPrice;
+ t.gas = *_gas;
+ t.data = _data.toVector();
+ t.receiveAddress = _receiveAddress;
+
string codeOf_receiveAddress = toHex(get<3>(addresses[_receiveAddress]) );
string sizeOfCode = toHex(toCompactBigEndian((codeOf_receiveAddress.size()+1)/2));
@@ -82,6 +89,7 @@ bool FakeExtVM::call(Address _receiveAddress, u256 _value, bytesConstRef _data,
{
cnote << "not able to call to : " << _receiveAddress << "\n";
cnote << "in FakeExtVM you can only make a call to " << na << "\n";
+ BOOST_THROW_EXCEPTION(FakeExtVMFailure() << errinfo_comment("Address not callable in FakeExtVM\n") << errinfo_wrongAddress(_receiveAddress));
return false;
}
}
@@ -110,14 +118,7 @@ bool FakeExtVM::call(Address _receiveAddress, u256 _value, bytesConstRef _data,
else
addresses.erase(_receiveAddress); // for the sake of comparison
- Transaction t;
- t.value = _value;
- t.gasPrice = gasPrice;
- t.gas = *_gas;
- t.data = _data.toVector();
- t.receiveAddress = _receiveAddress;
callcreates.push_back(t);
- (void)_out;
return true;
}
diff --git a/vm.h b/vm.h
index 6771fa76..5bad9d7d 100644
--- a/vm.h
+++ b/vm.h
@@ -38,6 +38,8 @@ along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
namespace dev { namespace test {
+struct FakeExtVMFailure : virtual Exception {};
+
class FakeExtVM: public eth::ExtVMFace
{
public: