diff options
author | Daniel Hams <daniel.hams@gmail.com> | 2014-02-26 19:43:49 +0800 |
---|---|---|
committer | Daniel Hams <daniel.hams@gmail.com> | 2014-02-26 19:43:49 +0800 |
commit | 41b271e342a8400fcff83a3ba5d36ae5c36f5ff2 (patch) | |
tree | 49454ceaf180cd9da1c5212479f15e8d5a5d6461 | |
parent | e74a56030fbaf5b0ffd6c90d2b53f69296adc604 (diff) | |
download | dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar.gz dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar.bz2 dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar.lz dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar.xz dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.tar.zst dexon-solidity-41b271e342a8400fcff83a3ba5d36ae5c36f5ff2.zip |
Workaround OSX clang broken map operator[] using ifdef guards and manual find/insert.
-rw-r--r-- | vm.cpp | 80 |
1 files changed, 77 insertions, 3 deletions
@@ -43,8 +43,34 @@ public: ExtVMFace(Address(), Address(), 0, u256s(), _fees, _previousBlock, _currentBlock, _currentNumber) {} - u256 store(u256 _n) { return get<3>(addresses[myAddress])[_n]; } - void setStore(u256 _n, u256 _v) { get<3>(addresses[myAddress])[_n] = _v; } + u256 store(u256 _n) + { +#ifdef __clang__ + tuple<u256, u256, u256, map<u256, u256> > & address = addresses[myAddress]; + map<u256, u256> & third = get<3>(address); + auto sFinder = third.find(_n); + if (sFinder != third.end()) + return sFinder->second; + else + return 0; +#else + return get<3>(addresses[myAddress])[_n]; +#endif + } + void setStore(u256 _n, u256 _v) + { +#ifdef __clang__ + tuple<u256, u256, u256, map<u256, u256> > & address = addresses[myAddress]; + map<u256, u256> & third = get<3>(address); + auto sFinder = third.find(_n); + if (sFinder != third.end()) + sFinder->second = _v; + else + third.insert(std::make_pair(_n, _v)); +#else + get<3>(addresses[myAddress])[_n] = _v; +#endif + } void mktx(Transaction& _t) { if (get<0>(addresses[myAddress]) >= _t.value) @@ -58,7 +84,20 @@ public: u256 balance(Address _a) { return get<0>(addresses[_a]); } void payFee(bigint _fee) { get<0>(addresses[myAddress]) = (u256)(get<0>(addresses[myAddress]) - _fee); } u256 txCount(Address _a) { return get<1>(addresses[_a]); } - u256 extro(Address _a, u256 _pos) { return get<3>(addresses[_a])[_pos]; } + u256 extro(Address _a, u256 _pos) + { +#ifdef __clang__ + tuple<u256, u256, u256, map<u256, u256> > & address = addresses[_a]; + map<u256, u256> & third = get<3>(address); + auto sFinder = third.find(_pos); + if (sFinder != third.end()) + return sFinder->second; + else + return 0; +#else + return get<3>(addresses[_a])[_pos]; +#endif + } u256 extroPrice(Address _a) { return get<2>(addresses[_a]); } void suicide(Address _a) { @@ -86,7 +125,19 @@ public: get<1>(addresses[_a]) = _myNonce; get<2>(addresses[_a]) = 0; for (unsigned i = 0; i < _myData.size(); ++i) +#ifdef __clang__ + { + tuple<u256, u256, u256, map<u256, u256> > & address = addresses[_a]; + map<u256, u256> & third = get<3>(address); + auto sFinder = third.find(i); + if (sFinder != third.end()) + sFinder->second = _myData[i]; + else + third.insert(std::make_pair(i, _myData[i])); + } +#else get<3>(addresses[_a])[i] = _myData[i]; +#endif } mObject exportEnv() @@ -194,13 +245,36 @@ public: { u256 adr(j.first); for (auto const& k: j.second.get_array()) +#ifdef __clang__ + { + map<u256, u256> & third = get<3>(a); + auto sFinder = third.find(adr); + if (sFinder != third.end()) + sFinder->second = toInt(k); + else + third.insert(std::make_pair(adr, toInt(k))); + adr++; + } +#else get<3>(a)[adr++] = toInt(k); +#endif } if (o.count("code")) { u256s d = compileLisp(o["code"].get_str()); for (unsigned i = 0; i < d.size(); ++i) +#ifdef __clang__ + { + map<u256, u256> & third = get<3>(a); + auto sFinder = third.find(i); + if (sFinder != third.end()) + sFinder->second = d[i]; + else + third.insert(std::make_pair(i, d[i])); + } +#else get<3>(a)[(u256)i] = d[i]; +#endif } } } |