From 70ba3102129dbaf6c943d1ed042103e0238842f4 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 14 Mar 2023 15:38:58 -0700 Subject: YJIT: Introduce no_gc attribute (#7511) --- yjit.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'yjit.c') diff --git a/yjit.c b/yjit.c index e5431e79b9..5bb8a37e53 100644 --- a/yjit.c +++ b/yjit.c @@ -724,28 +724,33 @@ rb_optimized_call(VALUE *recv, rb_execution_context_t *ec, int argc, VALUE *argv return rb_vm_invoke_proc(ec, proc, argc, argv, kw_splat, block_handler); } +unsigned int +rb_yjit_iseq_builtin_attrs(const rb_iseq_t *iseq) +{ + return iseq->body->builtin_attrs; +} -// If true, the iseq is leaf and it can be replaced by a single C call. -bool -rb_leaf_invokebuiltin_iseq_p(const rb_iseq_t *iseq) +// 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) && + 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) && - (iseq->body->builtin_attrs & BUILTIN_ATTR_LEAF) != 0 - ); + rb_vm_insn_addr2opcode((void *)iseq->body->iseq_encoded[invokebuiltin_len]) == BIN(leave); } -// Return an rb_builtin_function if the iseq contains only that leaf builtin function. +// Return an rb_builtin_function if the iseq contains only that builtin function. const struct rb_builtin_function * -rb_leaf_builtin_function(const rb_iseq_t *iseq) +rb_yjit_builtin_function(const rb_iseq_t *iseq) { - if (!rb_leaf_invokebuiltin_iseq_p(iseq)) + if (invokebuiltin_delegate_leave_p(iseq)) { + return (const struct rb_builtin_function *)iseq->body->iseq_encoded[1]; + } + else { return NULL; - return (const struct rb_builtin_function *)iseq->body->iseq_encoded[1]; + } } VALUE -- cgit v1.2.1