Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 49299184a8e1^
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: d455523145d6
Choose a head ref
  • 9 commits
  • 17 files changed
  • 1 contributor

Commits on Oct 10, 2017

  1. Mark blocks as escaped and raise LJE for break when appropriate.

    Fixes #4686.
    Fixes #4577.
    
    The logic here adds finally wrappers around all call paths that
    receive a block. When the call exits, the block is marked
    "escaped" since it no longer has a method activation to go with
    it. This indicates that non-local flow, like break, should
    immediately trigger a LocalJumpError.
    
    This passes specs but has not been tested extensively with other
    types of call forms that receive blocks.
    headius committed Oct 10, 2017
    Copy the full SHA
    4929918 View commit details
  2. Copy the full SHA
    e362373 View commit details
  3. Copy the full SHA
    120a64d View commit details
  4. Copy the full SHA
    c4b17de View commit details
  5. Copy the full SHA
    afdced0 View commit details
  6. Final tweaks to LJE break fixes.

    * Add literal closure method to IR closure-accepting interface
    * Replace double boolean in JIT code with enum
    * Check for null in non-local return logic
    headius committed Oct 10, 2017
    Copy the full SHA
    b02ae90 View commit details
  7. Copy the full SHA
    70d854a View commit details
  8. Copy the full SHA
    49be9b5 View commit details
  9. Simplify case/when eqq logic and enlist in normal invocation.

    Most case/when will have neither an undefined case value (for bare
    case statements) nor multiple values for a given when (splatted)
    so in those cases we can simply do a plain eqq call + isTrue. The
    unusual cases will still go to the old isEQQ logic, so there may
    be value in optimizing that path later.
    
    The main logic in isEQQ is the processing of a splatted array of
    when values in sequence, and a small bit of logic that simply
    checks truthiness of the when value for a bare case statement.
    
    This change reduces the bytecode for all case/when, and by more
    than half for the typical form. It also allows the === call to be
    optimized with invokedynamic like a normal call.
    headius committed Oct 10, 2017
    Copy the full SHA
    d455523 View commit details
Loading