summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-10-09 10:23:15 +0200
committerMax Bernstein <tekknolagi@gmail.com>2025-10-09 19:09:27 +0200
commit9020341bb4847d21339f6f45dceb2e498efd002c (patch)
treed4479b08184ccb7769d5475b2b5ce7bb6e482738
parentd798e3c46ffb25ec1000893d7e41ea8bc4dffed9 (diff)
ZJIT: Annotate Array#join as returning StringExact
-rw-r--r--zjit/src/cruby_methods.rs1
-rw-r--r--zjit/src/hir.rs26
2 files changed, 27 insertions, 0 deletions
diff --git a/zjit/src/cruby_methods.rs b/zjit/src/cruby_methods.rs
index 7721ca8440..5cb42291b0 100644
--- a/zjit/src/cruby_methods.rs
+++ b/zjit/src/cruby_methods.rs
@@ -186,6 +186,7 @@ pub fn init() -> Annotations {
annotate!(rb_cArray, "size", types::Fixnum, no_gc, leaf, elidable);
annotate!(rb_cArray, "empty?", types::BoolExact, no_gc, leaf, elidable);
annotate!(rb_cArray, "reverse", types::ArrayExact, leaf, elidable);
+ annotate!(rb_cArray, "join", types::StringExact);
annotate!(rb_cHash, "empty?", types::BoolExact, no_gc, leaf, elidable);
annotate!(rb_cNilClass, "nil?", types::TrueClass, no_gc, leaf, elidable);
annotate!(rb_mKernel, "nil?", types::FalseClass, no_gc, leaf, elidable);
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs
index cee546b026..5a8ebaf2f2 100644
--- a/zjit/src/hir.rs
+++ b/zjit/src/hir.rs
@@ -12492,4 +12492,30 @@ mod opt_tests {
Return v16
");
}
+
+ #[test]
+ fn test_array_join_returns_string() {
+ eval(r#"
+ def test = [].join ","
+ "#);
+ assert_snapshot!(hir_string("test"), @r"
+ fn test@<compiled>:2:
+ bb0():
+ EntryPoint interpreter
+ v1:BasicObject = LoadSelf
+ Jump bb2(v1)
+ bb1(v4:BasicObject):
+ EntryPoint JIT(0)
+ Jump bb2(v4)
+ bb2(v6:BasicObject):
+ v11:ArrayExact = NewArray
+ v12:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000))
+ v14:StringExact = StringCopy v12
+ PatchPoint MethodRedefined(Array@0x1008, join@0x1010, cme:0x1018)
+ PatchPoint NoSingletonClass(Array@0x1008)
+ v25:StringExact = CCallVariadic join@0x1040, v11, v14
+ CheckInterrupts
+ Return v25
+ ");
+ }
}