Skip to content
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

perf: Don't clone method body when adapting it for isOverriding #4862

Merged
merged 1 commit into from
Sep 11, 2022

Conversation

I-Al-Istannen
Copy link
Collaborator

Cloning is quite slow and method bodies can be large - this results in the isOverriding check taking quite a bit longer than needed.

Removing the type adaption is not possible as the javadoc explains: If we do not adapt the method, we have no CtTypeParameter declaration lying around our references can attach to. This results in getTypeErasure() potentially entering an infinite recursion.

There are some more gains to be had if one really wants to, but I currently don't see the need. This one is quite unobtrusive and doesn't really make the code more confusing.

Side effects

This creates an unnecessary change event for the Sniper printer (body changed), but it seems to ignore that and properly print it anyways.

Cloning is quite slow and method bodies can be large - this results in
the isOverriding check taking quite a bit longer than needed.

Removing the type adaption is not possible as the javadoc explains: If
we do not adapt the method, we have no CtTypeParameter declaration
lying around our references can attach to. This results in
getTypeErasure() potentially entering an infinite recursion.
@I-Al-Istannen I-Al-Istannen changed the title wip: perf: Don't clone method body when adapting it for isOverriding review: perf: Don't clone method body when adapting it for isOverriding Aug 25, 2022
Copy link
Collaborator

@SirYwell SirYwell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Makes sense to avoid costs that depend on the method body here.

@MartinWitt MartinWitt changed the title review: perf: Don't clone method body when adapting it for isOverriding perf: Don't clone method body when adapting it for isOverriding Sep 11, 2022
@MartinWitt MartinWitt merged commit e466b82 into INRIA:master Sep 11, 2022
@MartinWitt
Copy link
Collaborator

Thanks @I-Al-Istannen

I-Al-Istannen pushed a commit that referenced this pull request Jan 17, 2024
When checking whether a method overrides another, we need to adapt both
methods to a common ground.
In an early version this required cloning the entire method, including
its body, to perform the adaption. PR #4862 fixed this by nulling the
body before cloning the method and then restoring it afterwards. This
operation is not thread safe, as it may write concurrently and also
modifies what other parallel threads might see when traversing the
model.

This patch now introduces a private override specifying whether we are
only interested in the signature. If that is the case, we explicitly
construct a new method using the factory instead of cloning the
original.

Closes: #5619
I-Al-Istannen added a commit that referenced this pull request Jan 17, 2024
When checking whether a method overrides another, we need to adapt both
methods to a common ground.
In an early version this required cloning the entire method, including
its body, to perform the adaption. PR #4862 fixed this by nulling the
body before cloning the method and then restoring it afterwards. This
operation is not thread safe, as it may write concurrently and also
modifies what other parallel threads might see when traversing the
model.

This patch now introduces a private override specifying whether we are
only interested in the signature. If that is the case, we explicitly
construct a new method using the factory instead of cloning the
original.

Closes: #5619
SirYwell pushed a commit that referenced this pull request Jan 22, 2024
When checking whether a method overrides another, we need to adapt both
methods to a common ground.
In an early version this required cloning the entire method, including
its body, to perform the adaption. PR #4862 fixed this by nulling the
body before cloning the method and then restoring it afterwards. This
operation is not thread safe, as it may write concurrently and also
modifies what other parallel threads might see when traversing the
model.

This patch now introduces a private override specifying whether we are
only interested in the signature. If that is the case, we explicitly
construct a new method using the factory instead of cloning the
original.

Closes: #5619

Co-authored-by: I-Al-Istannen <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants