Skip to content

Commit 3f96be0

Browse files
committed
[GR-18163] Implement rb_str_format C function
PullRequest: truffleruby/4403
2 parents b48ba93 + 842ae6f commit 3f96be0

File tree

5 files changed

+20
-0
lines changed

5 files changed

+20
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Compatibility:
2525
* Remove deprecated `Pathname#{taint,untaint}` methods (#3681, @andrykonchin).
2626
* Add `rb_category_warn` function (#3710, @andrykonchin).
2727
* Add `rb_gc_mark_locations()` (#3704, @andrykonchin).
28+
* Implement `rb_str_format()` (#3716, @andrykonchin).
2829

2930
Performance:
3031

lib/truffle/truffle/cext.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,6 +1416,10 @@ def rb_f_sprintf(args)
14161416
sprintf(*args)
14171417
end
14181418

1419+
def rb_str_format(args, format)
1420+
sprintf(format, *args)
1421+
end
1422+
14191423
def rb_io_printf(out, args)
14201424
out.printf(*args)
14211425
end

spec/ruby/optional/capi/ext/kernel_spec.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ static VALUE kernel_spec_rb_f_sprintf(VALUE self, VALUE ary) {
332332
return rb_f_sprintf((int)RARRAY_LEN(ary), RARRAY_PTR(ary));
333333
}
334334

335+
static VALUE kernel_spec_rb_str_format(VALUE self, VALUE count, VALUE ary, VALUE format) {
336+
return rb_str_format(FIX2INT(count), RARRAY_PTR(ary), format);
337+
}
338+
335339
static VALUE kernel_spec_rb_make_backtrace(VALUE self) {
336340
return rb_make_backtrace();
337341
}
@@ -421,6 +425,7 @@ void Init_kernel_spec(void) {
421425
rb_define_method(cls, "rb_exec_recursive", kernel_spec_rb_exec_recursive, 1);
422426
rb_define_method(cls, "rb_set_end_proc", kernel_spec_rb_set_end_proc, 1);
423427
rb_define_method(cls, "rb_f_sprintf", kernel_spec_rb_f_sprintf, 1);
428+
rb_define_method(cls, "rb_str_format", kernel_spec_rb_str_format, 3);
424429
rb_define_method(cls, "rb_make_backtrace", kernel_spec_rb_make_backtrace, 0);
425430
rb_define_method(cls, "rb_funcallv", kernel_spec_rb_funcallv, 3);
426431
#ifdef RUBY_VERSION_IS_3_0

spec/ruby/optional/capi/kernel_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,4 +892,10 @@ def obj.method_missing(name, *args)
892892
@s.rb_check_funcall(object, :protected_method, []).should == :protected
893893
end
894894
end
895+
896+
describe "rb_str_format" do
897+
it "returns a string according to format and arguments" do
898+
@s.rb_str_format(3, [10, 2.5, "test"], "%d %f %s").should == "10 2.500000 test"
899+
end
900+
end
895901
end

src/main/c/cext/printf.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,7 @@ VALUE rb_str_vcatf(VALUE str, const char *fmt, va_list args) {
183183
rb_str_concat(str, result);
184184
return str;
185185
}
186+
187+
VALUE rb_str_format(int argc, const VALUE *argv, VALUE fmt) {
188+
return RUBY_CEXT_INVOKE("rb_str_format", rb_ary_new4(argc, argv), fmt);
189+
}

0 commit comments

Comments
 (0)