-
-
Notifications
You must be signed in to change notification settings - Fork 925
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Clean out some oddities from NonlocalReturn and Break instructions
* This patch includes work from 11e3766 which was reverted in 3af83b3 since it was incomplete. This patch takes it to completion. * NonlocalReturnInstr and BreakInstr are really exception-raising instructions. Let them go through exception handling paths for running ensure code instead of duplicating ensure path code and then preventing these exceptions from being caught in the startup interpreter. * This also pushes lambda non-local returns & breaks through the local exception path so that non-local returns and breaks are handled uniformed wrt exception / ensure handling without special cases. * This also ensures that in the block call protocol scenario, for lambdas as well as non-lambdas, all non-return control flow (exceptions, breaks, nonlocal-returns) goes through the GEB which ensures correct popping of frame/scope state.
- 9.4.12.0
- 9.4.11.0
- 9.4.10.0
- 9.4.9.0
- 9.4.8.0
- 9.4.7.0
- 9.4.6.0
- 9.4.5.0
- 9.4.4.0
- 9.4.3.0
- 9.4.2.0
- 9.4.1.0
- 9.4.0.0
- 9.3.15.0
- 9.3.14.0
- 9.3.13.0
- 9.3.12.0
- 9.3.11.0
- 9.3.10.0
- 9.3.9.0
- 9.3.8.0
- 9.3.7.0
- 9.3.6.0
- 9.3.5.0
- 9.3.4.0
- 9.3.3.0
- 9.3.2.0
- 9.3.1.0
- 9.3.0.0
- 9.2.21.0
- 9.2.20.1
- 9.2.20.0
- 9.2.19.0
- 9.2.18.0
- 9.2.17.0
- 9.2.16.0
- 9.2.15.0
- 9.2.14.0
- 9.2.13.0
- 9.2.12.0
- 9.2.11.1
- 9.2.11.0
- 9.2.10.0
- 9.2.9.0
- 9.2.8.0
- 9.2.7.0
- 9.2.6.0
- 9.2.5.0
- 9.2.4.1
- 9.2.4.0
- 9.2.3.0
- 9.2.2.0
- 9.2.1.0
- 9.2.0.0
- 9.1.17.0
- 9.1.16.0
- 9.1.15.0
- 9.1.14.0
- 9.1.13.0
- 9.1.12.0
- 9.1.11.0
- 9.1.10.0
- 9.1.9.0
- 9.1.8.0
- 9.1.7.0
- 9.1.6.0
- 9.1.5.0
- 9.1.4.0
- 9.1.3.0
- 9.1.2.0
- 9.1.1.0
- 9.1.0.0
- 9.0.5.0
Showing
5 changed files
with
41 additions
and
18 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
22 changes: 22 additions & 0 deletions
22
core/src/main/java/org/jruby/ir/runtime/IRWrappedLambdaReturnValue.java
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package org.jruby.ir.runtime; | ||
|
||
import org.jruby.exceptions.Unrescuable; | ||
import org.jruby.runtime.builtin.IRubyObject; | ||
|
||
// This class is just a thin wrapper around a return value | ||
// from nonlocal-return and break instructions. | ||
// | ||
// At IR build time, we don't know if a return/break in a block | ||
// will be a non-local return / break (as in a proc or block) | ||
// or will just be a regular return (as in a lambda). To ensure | ||
// uniform instruction semantics at runtime, we push the local return | ||
// through an exception object (just like IRReturnJump and IRBreakJump) | ||
// and let it go through exception handlers which ensure that frame/scope | ||
// are updated properly and ruby-level ensure code is run. | ||
public class IRWrappedLambdaReturnValue extends RuntimeException implements Unrescuable { | ||
public final IRubyObject returnValue; | ||
|
||
public IRWrappedLambdaReturnValue(IRubyObject v) { | ||
this.returnValue = v; | ||
} | ||
} |