summaryrefslogtreecommitdiff
path: root/yjit.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-03-14 15:38:58 -0700
committerGitHub <noreply@github.com>2023-03-14 15:38:58 -0700
commit70ba3102129dbaf6c943d1ed042103e0238842f4 (patch)
treee0337226448cc96979a9cd382b7f22997c36d387 /yjit.c
parent868f03cce1a2d7a4df9b03b8338e3af4c69041d0 (diff)
downloadruby-70ba3102129dbaf6c943d1ed042103e0238842f4.tar.gz
YJIT: Introduce no_gc attribute (#7511)
Diffstat (limited to 'yjit.c')
-rw-r--r--yjit.c29
1 files changed, 17 insertions, 12 deletions
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