-
Notifications
You must be signed in to change notification settings - Fork 6.2k
eof: new contract creation #15512
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
eof: new contract creation #15512
Conversation
Thank you for your contribution to the Solidity compiler! A team member will follow up shortly. If you haven't read our contributing guidelines and our review checklist before, please do it now, this makes the reviewing process and accepting your contribution smoother. If you have any questions or need our help, feel free to post them in the PR or talk to us directly on the #solidity-dev channel on Matrix. |
f8a9ae7
to
947c5dd
Compare
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 only skimmed through the PR for now. Here's some initial feedback.
My main question would be whether it wouldn't make more sense to deal with loadimmutable
/setimmutable
in a separate PR first. It's related dataloadn
and looks like creation depends on immutables to some extent.
6567616
to
82930c3
Compare
feeb58b
to
75122e0
Compare
This comment was marked as resolved.
This comment was marked as resolved.
7bde2af
to
e1840a3
Compare
a200d15
to
107b86e
Compare
107b86e
to
2bb05a2
Compare
def54bb
to
46af949
Compare
e213e0e
to
57bcb13
Compare
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.
Approving, since only a few cosmetic things are left now.
// dup1 | ||
// dup1 | ||
// dup1 | ||
// eofcreate(0) |
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.
This actually looks a bit ambiguous, as if EOFCREATE
was getting only one argument.
How about we change the notation to for immediates in asm output to {}
in AssemblyItem::toAssemblyText)
? Then we'd get this:
// eofcreate(0) | |
// eofcreate{0} |
I'd do that for RETURNCONTRACT
and AUXDATALOADN
as well. And I'd also return true for RETURNCONTRACT
from AssemblyItem::canBeFunctional()
. Is there actually a good reason why it's not like that already?
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 will change to brackets in AssemblyItem::toAssemblyText
. Fot DATALOADN I would do this in a separated PR #15545.
Regarding ssemblyItem::canBeFunctional()
It depends how you define functional context. I assumed that if there is no return value it's not functional.
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.
It depends how you define functional context. I assumed that if there is no return value it's not functional.
canBeFunctional()
determines whether the parameters of the item should be printed in parentheses after it (in functional style) or as separate instructions before it.
At least that's how I understand it from how Functionalizer
uses it: https://github.com/ethereum/solidity/blob/879d8e69f884419a9bc4a0cfe17a6d73ae14d836/libevmasm/Assembly.cpp#L324-L345
Here m_pending
is a list of previous expressions, which are assumed to be the arguments.
I think that we want true
for almost everything. The only things for which we return false seem to be PUSH
and DUP
instructions and Tag
, AssignImmutable
, VerbatimBytecode
items. Not sure about the reasons for all of them but e.g. DUP
is defined as taking the whole top of the stack as arguments (so e.g. DUP16
takes 17 arguments).
The closest thing we have to RETURNCONTRACT
is probably RETURN
and for that we return true
.
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.
BTW, I wonder if it wouldn't be better to show sub names like we do for dataOffset
/dataSize
instead of the numeric container IDs.
So for example in the assembly we would print eofcreate{sub_0}
rather than eofcreate{0}
.
Though I guess with EOF the ID approach is actually viable because we can't have nesting so maybe the current approach is still good. It's something to consider though.
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.
First fixed. I will check the later.
57bcb13
to
bc58b12
Compare
0c242cd
to
5e691b4
Compare
5e691b4
to
d1d6eb3
Compare
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.
Looks good, can be merged as soon as #15536 goes in.
In the meantime... a few more nitpicks :P
b80ff60
to
4777b33
Compare
#15536 has been merged. Please rebase. |
4777b33
to
974c112
Compare
Depends on #15456.MergedDepends on #15521DroppedDepends on: #15529MergedDepends on #15535MergedDepends on #15536Merged