New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prepare literalArguments for immutable builtin functions #8626
Conversation
This PR contains unrelated commits. |
a45070b
to
68e08f3
Compare
68e08f3
to
c327b75
Compare
Please squash. |
05058ca
to
af8c3da
Compare
Pushed update that addresses the feedback |
@@ -293,11 +293,13 @@ vector<YulString> AsmAnalyzer::operator()(FunctionCall const& _funCall) | |||
); | |||
|
|||
vector<YulString> argTypes; | |||
for (auto const& arg: _funCall.arguments | boost::adaptors::reversed) | |||
for (size_t i = _funCall.arguments.size(); i > 0; i--) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we create a helper for that? I think the i - 1
is really dangerous. Is there something like python's enumerate? Then we could use for (auto&& [i, arg]: enumerate(_funCall.arguments) | reversed)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes absolutely. I wasn't happy with that either.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@christianparpart do you have a good idea how this could be done?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe just
for (size_t i : boost::counting_range(0, _funCall.arguments.size()) | boost::adaptors::reversed)
{
auto&& arg = _funCall.arguments[i];
? Or a very simple helper that returns boost::counting_range(0, _container.size())
?
I could look into helpers that give you tuples of index and value that are robust against reversing - or even helpers that let you iterate two containers simultanously, so you could use auto&& [needsLiteralArgument, arg]: someWrapper(*needsLiteralArguments, _funCall.arguments) | boost::adaptors::reversed
- that's possible, but it can get quite messy quickly :-).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you see the link I posted above?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By the way: the solution in the link always creates a copy - a more sophisticated solution would use references for lvalues and move for rvalues (again part of the messy-ness ;-))
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's fine as is. i - 1
is only used twice and the for
line is very clear
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe change i
to something else though? i
is also used below, might look confusing visually
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We have tons of other places in the code where an enumerate
or "iterate two lists at the same time" would be very handy.
Looks good apart from the enumerate feature. Should we merge this already as is? |
e93a9af
to
5203503
Compare
refs #8551
(incomplete)