Skip to content

Commit 840e7e3

Browse files
committed
Process subAssemblies ensuring that there are no gaps between the keys
1 parent b32d5fd commit 840e7e3

File tree

7 files changed

+88
-56
lines changed

7 files changed

+88
-56
lines changed

libevmasm/Assembly.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <range/v3/algorithm/any_of.hpp>
4343
#include <range/v3/view/drop_exactly.hpp>
4444
#include <range/v3/view/enumerate.hpp>
45+
#include <range/v3/view/transform.hpp>
4546

4647
#include <fstream>
4748
#include <limits>
@@ -565,7 +566,7 @@ std::pair<std::shared_ptr<Assembly>, std::vector<std::string>> Assembly::fromJSO
565566
{
566567
solRequire(_json[".data"].isObject(), AssemblyImportException, "Optional member '.data' is not an object.");
567568
Json::Value const& data = _json[".data"];
568-
size_t subId{};
569+
std::map<size_t, std::shared_ptr<Assembly>> subAssemblies{};
569570
for (Json::ValueConstIterator dataIter = data.begin(); dataIter != data.end(); dataIter++)
570571
{
571572
solAssert(dataIter.key().isString());
@@ -599,17 +600,27 @@ std::pair<std::shared_ptr<Assembly>, std::vector<std::string>> Assembly::fromJSO
599600
{
600601
solThrow(AssemblyImportException, "The key '" + dataItemID + "' inside '.data' is out of the supported integer range.");
601602
}
602-
solRequire(subId == index, AssemblyImportException, "Invalid order of keys in '.data'. Expect key '" + std::to_string(subId) + "' but got '" + dataItemID + "'.");
603603

604604
auto [subassembly, emptySourceList] = Assembly::fromJSON(dataItem, _level == 0 ? parsedSourceList : _sourceList, _level + 1);
605605
solAssert(subassembly);
606606
solAssert(emptySourceList.empty());
607-
result->m_subs.emplace_back(subassembly);
608-
subId++;
607+
subAssemblies[index] = subassembly;
609608
}
610609
else
611610
solThrow(AssemblyImportException, "The value of key '" + dataItemID + "' inside '.data' is neither a hex string nor an object.");
612611
}
612+
613+
size_t subId{};
614+
result->m_subs = subAssemblies
615+
| ranges::views::transform([&](auto const& _sub) {
616+
solRequire(
617+
subId == _sub.first,
618+
AssemblyImportException,
619+
"Invalid order of keys in '.data'. Expect key '" + std::to_string(subId) + "' but got '" + std::to_string(_sub.first) + "'.");
620+
subId++;
621+
return _sub.second;
622+
})
623+
| ranges::to<std::vector<std::shared_ptr<Assembly>>>;
613624
}
614625

615626
if (_level == 0)

test/cmdlineTests/asm_json_import_missing_subobjects_indices/stdin

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@
66
}
77
],
88
".data": {
9-
"2": {
10-
".code": []
11-
},
12-
"0": {
13-
".code": []
14-
},
15-
"4": {
16-
".code": []
17-
},
18-
"1": {
19-
".code": []
20-
}
9+
"2": { ".code": [] },
10+
"0": { ".code": [] },
11+
"4": { ".code": [] },
12+
"5": { ".code": [] },
13+
"7": { ".code": [] },
14+
"6": { ".code": [] },
15+
"9": { ".code": [] },
16+
"10": { ".code": [] },
17+
"1": { ".code": [] },
18+
"8": { ".code": [] },
19+
"11": { ".code": [] }
2120
}
2221
}

test/cmdlineTests/asm_json_import_random_index_ordering/output

Lines changed: 0 additions & 18 deletions
This file was deleted.

test/cmdlineTests/asm_json_import_random_index_ordering/stdin

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
Opcodes:
2+
PUSH0 INVALID
3+
EVM assembly:
4+
/* */
5+
0x00
6+
stop
7+
8+
sub_0: assembly {
9+
}
10+
11+
sub_1: assembly {
12+
stop
13+
14+
sub_0: assembly {
15+
}
16+
17+
sub_1: assembly {
18+
}
19+
20+
sub_2: assembly {
21+
}
22+
}
23+
24+
sub_2: assembly {
25+
stop
26+
27+
sub_0: assembly {
28+
}
29+
30+
sub_1: assembly {
31+
}
32+
}
33+
34+
sub_3: assembly {
35+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
".code": [
3+
{
4+
"name": "PUSH",
5+
"value": "0"
6+
}
7+
],
8+
".data": {
9+
"2": {
10+
".code": [],
11+
".data": {
12+
"1": { ".code": [] },
13+
"0": { ".code": [] }
14+
}
15+
},
16+
"0": { ".code": [] },
17+
"1": {
18+
".code": [],
19+
".data": {
20+
"1": { ".code": [] },
21+
"2": { ".code": [] },
22+
"0": { ".code": [] }
23+
}
24+
},
25+
"3": { ".code": [] }
26+
}
27+
}

0 commit comments

Comments
 (0)