Skip to content

Commit

Permalink
fixup! [libevmasm] Add support to import evm assembly json.
Browse files Browse the repository at this point in the history
  • Loading branch information
cameel committed Oct 20, 2023
1 parent b9ba67f commit 5794f98
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 28 deletions.
39 changes: 12 additions & 27 deletions libevmasm/Assembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <libsolutil/StringUtils.h>

#include <range/v3/algorithm/any_of.hpp>
#include <range/v3/view/drop_exactly.hpp>
#include <range/v3/view/enumerate.hpp>

#include <fstream>
Expand Down Expand Up @@ -618,40 +619,24 @@ std::pair<std::shared_ptr<Assembly>, std::vector<std::string>> Assembly::fromJSO
solThrow(AssemblyImportException, "The value of key '" + dataItemID + "' inside '.data' is neither a hex-string nor an object.");
}
}

if (_level == 0)
result->updatePaths();
result->encodeAllPossibleSubPathsInAssemblyTree();

return std::make_pair(result, _level == 0 ? parsedSourceList : std::vector<std::string>{});
}

void Assembly::updatePaths(std::vector<Assembly*> const& _parents, std::vector<size_t> const& _absolutePathFromRoot)
void Assembly::encodeAllPossibleSubPathsInAssemblyTree(std::vector<size_t> _pathFromRoot, std::vector<Assembly*> _assembliesOnPath)
{
size_t subId = 0;
for (std::shared_ptr<Assembly> assembly: m_subs)
_assembliesOnPath.push_back(this);
for (_pathFromRoot.push_back(0); _pathFromRoot.back() < m_subs.size(); ++_pathFromRoot.back())
{
std::vector<Assembly*> parents{_parents};
parents.push_back(this);

std::vector<size_t> absolutePathFromRoot{_absolutePathFromRoot};
absolutePathFromRoot.emplace_back(subId);

int pindex = 0;
for (Assembly* parent: parents)
{
if (pindex == 0)
parent->encodeSubPath(absolutePathFromRoot);
else
{
std::vector<size_t> relativePath{absolutePathFromRoot};
for (int i = 0; i < pindex; ++i)
relativePath.erase(relativePath.begin());
parent->encodeSubPath(relativePath);
}
++pindex;
}

assembly->updatePaths(parents, absolutePathFromRoot);
for (size_t distanceFromRoot = 0; distanceFromRoot < _assembliesOnPath.size(); ++distanceFromRoot)
_assembliesOnPath[distanceFromRoot]->encodeSubPath(
_pathFromRoot | ranges::views::drop_exactly(distanceFromRoot) | ranges::to<std::vector>
);

++subId;
m_subs[_pathFromRoot.back()]->encodeAllPossibleSubPathsInAssemblyTree(_pathFromRoot, _assembliesOnPath);
}
}

Expand Down
2 changes: 1 addition & 1 deletion libevmasm/Assembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ class Assembly

Assembly const* subAssemblyById(size_t _subId) const;

void updatePaths(std::vector<Assembly *> const& _parents = {}, std::vector<size_t> const& _absolutePathFromRoot = {});
void encodeAllPossibleSubPathsInAssemblyTree(std::vector<size_t> _pathFromRoot = {}, std::vector<Assembly*> _assembliesOnPath = {});

protected:
/// 0 is reserved for exception
Expand Down

0 comments on commit 5794f98

Please sign in to comment.