diff options
author | Takashi Kokubun <[email protected]> | 2023-03-14 15:38:58 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2023-03-14 15:38:58 -0700 |
commit | 70ba3102129dbaf6c943d1ed042103e0238842f4 (patch) | |
tree | e0337226448cc96979a9cd382b7f22997c36d387 /yjit.c | |
parent | 868f03cce1a2d7a4df9b03b8338e3af4c69041d0 (diff) |
YJIT: Introduce no_gc attribute (#7511)
Notes
Notes:
Merged-By: k0kubun <[email protected]>
Diffstat (limited to 'yjit.c')
-rw-r--r-- | yjit.c | 29 |
1 files changed, 17 insertions, 12 deletions
@@ -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 |