-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Exceptions refactoring and try-finally transform (#171)
* cps/[transform, environment]: use one exception local per try Nim has a "exception stack" system where inner except branches will push a new exception to the stack then pop it after it's done. To replicate this accurately in CPS, we use one local per cps `try` instead of a single field like how it is done currently. This is because we set the global exception to whatever the stored exception was in our continuation leg, so to prevent inner cps `try`s from overriding what is perceived to be the "current" exception of the outer branch, we simply give them different locals. Ideally we can tap right into Nim's exception `up` field, but it's not exported. * cps/transform: rewrite `n` instead of doing a roundabout Not sure what I thought of when I wrote that code, but we can just run filter on the outer node and don't have to think about the bugs this `for` would cause us. * move trampoline and bind to it in bootstrap * tests/[preamble, ttry]: test exception properties again * cps/rewrites: add a simplifying rewrite for except T as e Fixes disruptek/cps#164 * cps/transform: rewrite cps try-except into one continuation Instead of creating a continuation leg for each except branch, we merge all except branches into one, then turn that into a continuation. That way we only have one continuation for all handlers, allow for a better implementation of cps exceptions in the future. * cps/transform: try-finally transformation Implements try-finally transformation for CPS by generating finally as a continuation leg with a static generic for where it will continues after. Untested because the compiler broke. Known issues: - Early returns are not handled, which can be fixed by improving isScopeExit and making early termination an annotation. Fixes #80. * cps/transform: switch the implementation of try-finally to templating Instead of waiting for nim-lang/Nim#18254 and any other templates bug to be fix. We take the initiative and write our own continuation templater. It appears to work well enough to use as an alternative until a better alternative become available. I've also added an extra test that verify the exception re-raise property. * cps/spec: remove cpsRecovery We ended up not needing it for finally * cps/environment: implement early returns as an annotation We implement early returns as `cpsTerminate` then tie them up at the end via `cpsResolver`. This way try-finally can capture early termination and specialize to those. Need @disruptek to review this stuff. * tdefer: enable the test for defer across continuation * tzevv: enable the defer test * cps/transform: support except clause with multiple exceptions * cps/transform: cosmetics for disruptek Co-authored-by: Andy Davidoff <github@andy.disruptek.com>
- Loading branch information
Showing
9 changed files
with
622 additions
and
237 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.