YJIT: Filter &
calls from specialized C method codegen
Evident with the crash reported in [Bug #20997], the C replacement codegen functions aren't authored to handle block arguments (nor should they because the extra code from the complexity defeats optimization). Filter sites with VM_CALL_ARGS_BLOCKARG.
This commit is contained in:
parent
96f23306f0
commit
dd80d9b089
Notes:
git
2025-01-09 00:47:58 +00:00
@ -5347,3 +5347,11 @@ assert_equal '["x", "Y", "c", "A", "t", "A", "b", "C", "d"]', <<~'RUBY'
|
|||||||
|
|
||||||
Swap.new("xy").swap + Swap.new("cat").reverse_odd + Swap.new("abcd").reverse_even
|
Swap.new("xy").swap + Swap.new("cat").reverse_odd + Swap.new("abcd").reverse_even
|
||||||
RUBY
|
RUBY
|
||||||
|
|
||||||
|
assert_normal_exit %{
|
||||||
|
class Bug20997
|
||||||
|
def foo(&) = self.class.name(&)
|
||||||
|
|
||||||
|
new.foo
|
||||||
|
end
|
||||||
|
}
|
||||||
|
@ -6894,11 +6894,12 @@ fn gen_send_cfunc(
|
|||||||
// Increment total cfunc send count
|
// Increment total cfunc send count
|
||||||
gen_counter_incr(jit, asm, Counter::num_send_cfunc);
|
gen_counter_incr(jit, asm, Counter::num_send_cfunc);
|
||||||
|
|
||||||
// Delegate to codegen for C methods if we have it.
|
// Delegate to codegen for C methods if we have it and the callsite is simple enough.
|
||||||
if kw_arg.is_null() &&
|
if kw_arg.is_null() &&
|
||||||
!kw_splat &&
|
!kw_splat &&
|
||||||
flags & VM_CALL_OPT_SEND == 0 &&
|
flags & VM_CALL_OPT_SEND == 0 &&
|
||||||
flags & VM_CALL_ARGS_SPLAT == 0 &&
|
flags & VM_CALL_ARGS_SPLAT == 0 &&
|
||||||
|
flags & VM_CALL_ARGS_BLOCKARG == 0 &&
|
||||||
(cfunc_argc == -1 || argc == cfunc_argc) {
|
(cfunc_argc == -1 || argc == cfunc_argc) {
|
||||||
let expected_stack_after = asm.ctx.get_stack_size() as i32 - argc;
|
let expected_stack_after = asm.ctx.get_stack_size() as i32 - argc;
|
||||||
if let Some(known_cfunc_codegen) = lookup_cfunc_codegen(unsafe { (*cme).def }) {
|
if let Some(known_cfunc_codegen) = lookup_cfunc_codegen(unsafe { (*cme).def }) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user