From 661f9e6d03d04667b5488ec202c0e1ec6f97c080 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Fri, 1 Mar 2024 10:03:00 -0800 Subject: YJIT: Support opt_invokebuiltin_delegate for leaf builtin (#10152) --- yjit.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'yjit.c') diff --git a/yjit.c b/yjit.c index 13707900c0..349f4f6d02 100644 --- a/yjit.c +++ b/yjit.c @@ -739,15 +739,17 @@ rb_yjit_iseq_builtin_attrs(const rb_iseq_t *iseq) return iseq->body->builtin_attrs; } -// If true, the iseq has only opt_invokebuiltin_delegate_leave and leave insns. +// If true, the iseq has only opt_invokebuiltin_delegate(_leave) and leave insns. static bool invokebuiltin_delegate_leave_p(const rb_iseq_t *iseq) { - unsigned int invokebuiltin_len = insn_len(BIN(opt_invokebuiltin_delegate_leave)); - unsigned int leave_len = insn_len(BIN(leave)); - return iseq->body->iseq_size == (invokebuiltin_len + leave_len) && - rb_vm_insn_addr2opcode((void *)iseq->body->iseq_encoded[0]) == BIN(opt_invokebuiltin_delegate_leave) && - rb_vm_insn_addr2opcode((void *)iseq->body->iseq_encoded[invokebuiltin_len]) == BIN(leave); + int insn1 = rb_vm_insn_addr2opcode((void *)iseq->body->iseq_encoded[0]); + if ((int)iseq->body->iseq_size != insn_len(insn1) + insn_len(BIN(leave))) { + return false; + } + int insn2 = rb_vm_insn_addr2opcode((void *)iseq->body->iseq_encoded[insn_len(insn1)]); + return (insn1 == BIN(opt_invokebuiltin_delegate) || insn1 == BIN(opt_invokebuiltin_delegate_leave)) && + insn2 == BIN(leave); } // Return an rb_builtin_function if the iseq contains only that builtin function. -- cgit v1.2.3