diff options
author | chriseth <chris@ethereum.org> | 2019-01-08 22:03:40 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2019-01-08 22:05:09 +0800 |
commit | f5b24a38b8006b66f5e5bed37e8041d87998eddf (patch) | |
tree | f523e9a63aed68e1303b5883b79fb74665e9c94a /libyul | |
parent | 6414d63906d1a768d4f8829eca49d6020630a261 (diff) | |
download | dexon-solidity-f5b24a38b8006b66f5e5bed37e8041d87998eddf.tar.gz dexon-solidity-f5b24a38b8006b66f5e5bed37e8041d87998eddf.tar.zst dexon-solidity-f5b24a38b8006b66f5e5bed37e8041d87998eddf.zip |
Make function grouper idempotent.
Diffstat (limited to 'libyul')
-rw-r--r-- | libyul/optimiser/FunctionGrouper.cpp | 15 | ||||
-rw-r--r-- | libyul/optimiser/FunctionGrouper.h | 3 |
2 files changed, 18 insertions, 0 deletions
diff --git a/libyul/optimiser/FunctionGrouper.cpp b/libyul/optimiser/FunctionGrouper.cpp index 02ce22cd..b9852fcd 100644 --- a/libyul/optimiser/FunctionGrouper.cpp +++ b/libyul/optimiser/FunctionGrouper.cpp @@ -33,6 +33,9 @@ using namespace dev::solidity; void FunctionGrouper::operator()(Block& _block) { + if (alreadyGrouped(_block)) + return; + vector<Statement> reordered; reordered.emplace_back(Block{_block.location, {}}); @@ -45,3 +48,15 @@ void FunctionGrouper::operator()(Block& _block) } _block.statements = std::move(reordered); } + +bool FunctionGrouper::alreadyGrouped(Block const& _block) +{ + if (_block.statements.empty()) + return false; + if (_block.statements.front().type() != typeid(Block)) + return false; + for (size_t i = 1; i < _block.statements.size(); ++i) + if (_block.statements.at(i).type() != typeid(FunctionDefinition)) + return false; + return true; +} diff --git a/libyul/optimiser/FunctionGrouper.h b/libyul/optimiser/FunctionGrouper.h index 3b3f48a7..4b6abf76 100644 --- a/libyul/optimiser/FunctionGrouper.h +++ b/libyul/optimiser/FunctionGrouper.h @@ -38,6 +38,9 @@ class FunctionGrouper { public: void operator()(Block& _block); + +private: + bool alreadyGrouped(Block const& _block); }; } |