summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/array.h1
-rw-r--r--internal/string.h1
-rw-r--r--object.c2
-rw-r--r--vm_core.h2
-rw-r--r--vm_insnhelper.c1
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)
{
diff --git a/object.c b/object.c
index 6bb3488153..4dfa7a44f8 100644
--- a/object.c
+++ b/object.c
@@ -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)));
}
diff --git a/vm_core.h b/vm_core.h
index 79aa22d3de..11af8a365d 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -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)
{