Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@headius
Copy link
Member

@headius headius commented Jan 6, 2026

When generating backtraces for caller, JRuby maintains compat with CRuby by replacing all internal native frames with the most recent external Ruby frame, as illustrated below:

$ cx jruby-10.0.2.0 ruby -e "def foo; puts caller(0); end; foo"
-e:1:in 'foo'
-e:1:in '<main>'

Up until now, we did not treat internal Ruby sources the same way, but Ruby 4.0 now does a similar masking of such sources:

JRuby:

$ cx jruby-10.0.2.0 ruby -e "def foo; puts caller(0); end; tap { foo }"
-e:1:in 'foo'
-e:1:in 'block in <main>'
<internal:uri:classloader:/jruby/kernel/kernel.rb>:19:in 'tap'
-e:1:in '<main>'

CRuby:

$ cx 4.0.0 ruby -e "def foo; puts caller(0); end; tap { foo }"
-e:1:in 'Object#foo'
-e:1:in 'block in <main>'
-e:1:in 'Kernel#tap'
-e:1:in '<main>'

This patch uses the native masking logic in backtrace building to also mask internal Ruby source frames, producing a caller trace that matches CRuby:

$ ruby -v -e "def foo; puts caller(0); end; tap { foo }"
jruby 10.1.0.0-SNAPSHOT (4.0.0) 2026-01-06 ef3d5d0851 OpenJDK 64-Bit Server VM 25+36-LTS on 25+36-LTS +indy +jit [arm64-darwin]
-e:1:in 'foo'
-e:1:in 'block in <main>'
-e:1:in 'tap'
-e:1:in '<main>'

Additionally, this patch expands the omission of internal Ruby frames from warn line calculation in the case those methods have been JIT compiled (this logic was missing before).

When generating backtraces for `caller`, JRuby maintains compat
with CRuby by replacing all internal native frames with the most
recent external Ruby frame, as illustrated below:

```
$ cx jruby-10.0.2.0 ruby -e "def foo; puts caller(0); end; foo"
-e:1:in 'foo'
-e:1:in '<main>'
```

Up until now, we did not treat internal Ruby sources the same way,
but Ruby 4.0 now does a similar masking of such sources:

JRuby:
```
$ cx jruby-10.0.2.0 ruby -e "def foo; puts caller(0); end; tap { foo }"
-e:1:in 'foo'
-e:1:in 'block in <main>'
<internal:uri:classloader:/jruby/kernel/kernel.rb>:19:in 'tap'
-e:1:in '<main>'

```

CRuby:
```
$ cx 4.0.0 ruby -e "def foo; puts caller(0); end; tap { foo }"
-e:1:in 'Object#foo'
-e:1:in 'block in <main>'
-e:1:in 'Kernel#tap'
-e:1:in '<main>'
```

This patch uses the native masking logic in backtrace building to
also mask internal Ruby source frames, producing a `caller` trace
that matches CRuby:

```
$ ruby -v -e "def foo; puts caller(0); end; tap { foo }"
jruby 10.1.0.0-SNAPSHOT (4.0.0) 2026-01-06 ef3d5d0 OpenJDK 64-Bit Server VM 25+36-LTS on 25+36-LTS +indy +jit [arm64-darwin]
-e:1:in 'foo'
-e:1:in 'block in <main>'
-e:1:in 'tap'
-e:1:in '<main>'
```

Additionally, this patch expands the omission of internal Ruby
frames from `warn` line calculation in the case those methods have
been JIT compiled (this logic was missing before).
@headius headius added this to the JRuby 10.1.0.0 milestone Jan 6, 2026
headius added a commit to headius/jruby that referenced this pull request Jan 6, 2026
At some point, we started including native .java lines in the MRI-
formatted trace. This was probably unintended, since MRI-format
traces should always follow CRuby's standard of replacing native
call frames with the most recent Ruby frame.

See jruby#9154 for some discussion of filtering and omitting
internal frames (that PR is about Ruby, but the same filtering
already applied to native frames used in `caller`).

This patch uses the same backtrace gathering logic for the MRI
format as it does for `caller`, since in both cases users expect
not to see .java frames for internal methods, and now with Ruby 4.0
they will also expect not to see internal Ruby sources.
headius added a commit to headius/jruby that referenced this pull request Jan 6, 2026
At some point, we started including native .java lines in the MRI-
formatted trace. This was probably unintended, since MRI-format
traces should always follow CRuby's standard of replacing native
call frames with the most recent Ruby frame.

See jruby#9154 for some discussion of filtering and omitting
internal frames (that PR is about Ruby, but the same filtering
already applied to native frames used in `caller`).

This patch uses the same backtrace gathering logic for the MRI
format as it does for `caller`, since in both cases users expect
not to see .java frames for internal methods, and now with Ruby 4.0
they will also expect not to see internal Ruby sources.
headius added a commit to headius/jruby that referenced this pull request Jan 6, 2026
At some point, we started including native .java lines in the MRI-
formatted trace. This was probably unintended, since MRI-format
traces should always follow CRuby's standard of replacing native
call frames with the most recent Ruby frame.

See jruby#9154 for some discussion of filtering and omitting
internal frames (that PR is about Ruby, but the same filtering
already applied to native frames used in `caller`).

This patch uses the same backtrace gathering logic for the MRI
format as it does for `caller`, since in both cases users expect
not to see .java frames for internal methods, and now with Ruby 4.0
they will also expect not to see internal Ruby sources.
@headius headius merged commit 7a732e2 into jruby:ruby-4.0 Jan 7, 2026
44 of 77 checks passed
@headius headius deleted the mask_internal_frames branch January 7, 2026 22:51
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.

1 participant