YJIT: jit_prepare_routine_call() for String#+@ missing
We saw SEGVs due to this when running with StackProf, which needs a correct PC for RUBY_INTERNAL_EVENT_NEWOBJ, the same event used for ObjectSpace allocation tracing. [Bug #19444]
This commit is contained in:
parent
a49bc73e1f
commit
c178926fbe
Notes:
git
2023-02-16 23:51:02 +00:00
@ -1092,6 +1092,33 @@ class TestYJIT < Test::Unit::TestCase
|
||||
RUBY
|
||||
end
|
||||
|
||||
def test_tracing_str_uplus
|
||||
assert_compiles(<<~RUBY, frozen_string_literal: true, result: :ok)
|
||||
def str_uplus
|
||||
_ = 1
|
||||
_ = 2
|
||||
ret = [+"frfr", __LINE__]
|
||||
_ = 3
|
||||
_ = 4
|
||||
|
||||
ret
|
||||
end
|
||||
|
||||
str_uplus
|
||||
require 'objspace'
|
||||
ObjectSpace.trace_object_allocations_start
|
||||
|
||||
str, expected_line = str_uplus
|
||||
alloc_line = ObjectSpace.allocation_sourceline(str)
|
||||
|
||||
if expected_line == alloc_line
|
||||
:ok
|
||||
else
|
||||
[expected_line, alloc_line]
|
||||
end
|
||||
RUBY
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def code_gc_helpers
|
||||
|
@ -4157,7 +4157,7 @@ fn jit_rb_int_equal(
|
||||
|
||||
/// If string is frozen, duplicate it to get a non-frozen string. Otherwise, return it.
|
||||
fn jit_rb_str_uplus(
|
||||
_jit: &mut JITState,
|
||||
jit: &mut JITState,
|
||||
ctx: &mut Context,
|
||||
asm: &mut Assembler,
|
||||
_ocb: &mut OutlinedCb,
|
||||
@ -4168,6 +4168,9 @@ fn jit_rb_str_uplus(
|
||||
_known_recv_class: *const VALUE,
|
||||
) -> bool
|
||||
{
|
||||
// We allocate when we dup the string
|
||||
jit_prepare_routine_call(jit, ctx, asm);
|
||||
|
||||
asm.comment("Unary plus on string");
|
||||
let recv_opnd = asm.load(ctx.stack_pop(1));
|
||||
let flags_opnd = asm.load(Opnd::mem(64, recv_opnd, RUBY_OFFSET_RBASIC_FLAGS));
|
||||
|
Loading…
x
Reference in New Issue
Block a user