aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Hams <daniel.hams@gmail.com>2014-02-26 19:43:49 +0800
committerDaniel Hams <daniel.hams@gmail.com>2014-02-26 19:43:49 +0800
commit41b271e342a8400fcff83a3ba5d36ae5c36f5ff2 (patch)
tree49454ceaf180cd9da1c5212479f15e8d5a5d6461
parente74a56030fbaf5b0ffd6c90d2b53f69296adc604 (diff)
downloaddexon-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.cpp80
1 files changed, 77 insertions, 3 deletions
diff --git a/vm.cpp b/vm.cpp
index 9fe858e1..137803a3 100644
--- a/vm.cpp
+++ b/vm.cpp
@@ -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
}
}
}