diff options
-rw-r--r-- | internal/array.h | 1 | ||||
-rw-r--r-- | internal/string.h | 1 | ||||
-rw-r--r-- | object.c | 2 | ||||
-rw-r--r-- | vm_core.h | 2 | ||||
-rw-r--r-- | vm_insnhelper.c | 1 |
5 files changed, 7 insertions, 0 deletions
diff --git a/internal/array.h b/internal/array.h index 6fcb4e83f5..60f66f31bf 100644 --- a/internal/array.h +++ b/internal/array.h @@ -46,6 +46,7 @@ struct rb_execution_context_struct; VALUE rb_ec_ary_new_from_values(struct rb_execution_context_struct *ec, long n, const VALUE *elts); MJIT_SYMBOL_EXPORT_END +// YJIT needs this function to never allocate and never raise static inline VALUE rb_ary_entry_internal(VALUE ary, long offset) { diff --git a/internal/string.h b/internal/string.h index d010669ca8..18b01862f7 100644 --- a/internal/string.h +++ b/internal/string.h @@ -116,6 +116,7 @@ is_broken_string(VALUE str) } /* expect tail call optimization */ +// YJIT needs this function to never allocate and never raise static inline VALUE rb_str_eql_internal(const VALUE str1, const VALUE str2) { @@ -790,6 +790,8 @@ rb_obj_is_kind_of(VALUE obj, VALUE c) { VALUE cl = CLASS_OF(obj); + // Note: YJIT needs this function to never allocate and never raise when + // `c` is a class or a module. c = class_or_module_required(c); return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c))); } @@ -446,6 +446,8 @@ struct rb_iseq_constant_body { char catch_except_p; /* If a frame of this ISeq may catch exception, set TRUE */ // If true, this ISeq is leaf *and* backtraces are not used, for example, // by rb_profile_frames. We verify only leafness on VM_CHECK_MODE though. + // Note that GC allocations might use backtraces due to + // ObjectSpace#trace_object_allocations. // For more details, see: https://bugs.ruby-lang.org/issues/16956 bool builtin_inline_p; struct rb_id_table *outer_variables; diff --git a/vm_insnhelper.c b/vm_insnhelper.c index d068beb8be..3b99f7c350 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -4790,6 +4790,7 @@ vm_ic_hit_p(const struct iseq_inline_constant_cache_entry *ice, const VALUE *reg return vm_inlined_ic_hit_p(ice->flags, ice->value, ice->ic_cref, ice->ic_serial, reg_ep); } +// YJIT needs this function to never allocate and never raise bool rb_vm_ic_hit_p(IC ic, const VALUE *reg_ep) { |