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

fix(gnovm): use OpCall to run deferred statements #2597

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

thehowl
Copy link
Member

@thehowl thehowl commented Jul 17, 2024

This is an itch that started when noticing something reviewing #2145, and then continued when breaking down #1672, and here we are.

Essentially, currently on master using defer will not create a new *Frame. This results, in #2145, in the deferred function not showing up in the stacktrace. doOpReturnCallDefers (the function in charge of executing deferred functions) actually has its own copied implementation of OpCall.

I haven't been able to fully track down the implications of not creating a new frame (zrealm_std7_stdlibs.gno is an attempt at doing so, but is actually correct on master, so 🤷). But what I do know is that having two copied implementations leads to bug being fixed in one case, and not in another one: to prove this, see defer10.gno.

defer10's case is fixed on OpCall, as a previous commit moved it from using copy(b.Values, dfr.Args) to using b.Values[i] = pv.Copy(m.Alloc) over all the values instead. (ie. copying values by reference when calling a function).

So, by always using OpCall to do everything, we create the frame correctly, and use a unique implementation to actually call functions.

I also modified the logic to determine whether a recover() can correctly recover a panic or not. (cc @deelawn). Instead of keeping a Scope counter in the Machine, the Exception now contains a slice of the frame pointers at the time of creation of the exception. The frame will be considered as being run during a panicking sequence only if it is in this array. We use this both for recover(), and for doOpReturnCallDefers, too.

@deelawn I tried using your system, but I couldn't get it working on a case like recover12b, with the new frame added. And I'm still not 100% sure how the system you had worked. Do you think this is ok?

@thehowl thehowl self-assigned this Jul 17, 2024
@thehowl thehowl requested review from jaekwon, moul, piux2, deelawn, mvertes and a team as code owners July 17, 2024 01:04
@github-actions github-actions bot added 🧾 package/realm Tag used for new Realms or Packages. 📦 🤖 gnovm Issues or PRs gnovm related labels Jul 17, 2024
Copy link

codecov bot commented Jul 17, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

@thehowl
Copy link
Member Author

thehowl commented Jul 17, 2024

Btw this is against the current direction of #2596, as it heavily relies on the "frame as a pointer" system. Maybe there's a way to do this without Frame being a pointer.

@thehowl thehowl marked this pull request as draft July 17, 2024 01:37
@thehowl
Copy link
Member Author

thehowl commented Jul 17, 2024

Looks like there's some CI trouble, back to draft for now.

Copy link

github-actions bot commented Dec 3, 2024

This PR is stale because it has been open 3 months with no activity. Remove stale label or comment or this will be closed in 3 months.

@github-actions github-actions bot added the Stale label Dec 3, 2024
@Gno2D2
Copy link

Gno2D2 commented Dec 3, 2024

I'm a bot that assists the Gno Core team in maintaining this repository. My role is to ensure that contributors understand and follow our guidelines, helping to streamline the development process.

The following requirements must be fulfilled before a pull request can be merged.
Some requirement checks are automated and can be verified by the CI, while others need manual verification by a staff member.

These requirements are defined in this configuration file.

Automated Checks

🔴 Maintainers must be able to edit this pull request
🔴 The pull request head branch must be up-to-date with its base

Manual Checks

No manual checks match this pull request.

Debug
Automated Checks
Maintainers must be able to edit this pull request

If

🟢 Condition met
└── 🟢 On every pull request

Then

🔴 Requirement not satisfied
└── 🔴 Maintainer can modify this pull request

The pull request head branch must be up-to-date with its base

If

🟢 Condition met
└── 🟢 On every pull request

Then

🔴 Requirement not satisfied
└── 🔴 Head branch (dev/morgan/use-op-call-for-defers) is up to date with base (master): behind by 199 / ahead by 4

@jefft0 jefft0 mentioned this pull request Dec 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📦 🤖 gnovm Issues or PRs gnovm related 🧾 package/realm Tag used for new Realms or Packages. Stale
Projects
Status: No status
Status: Triage
Development

Successfully merging this pull request may close these issues.

2 participants