diff --git a/CHANGELOG.md b/CHANGELOG.md index aff41c93ad12..86e7fb10d3e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ Compatibility: * Support passing anonymous * and ** parameters as method call arguments (#3039, @andrykonchin). * Handle either positional or keywords arguments by default in `Struct.new` (#3039, @rwstauner). * Add `rb_enc_interned_str_cstr` function (#3408, @goyox86, @thomasmarshall). +* Add `rb_str_to_interned_str` function (#3408, @thomasmarshall). Performance: diff --git a/lib/cext/ABI_check.txt b/lib/cext/ABI_check.txt index b4de39476753..48082f72f087 100644 --- a/lib/cext/ABI_check.txt +++ b/lib/cext/ABI_check.txt @@ -1 +1 @@ -11 +12 diff --git a/spec/ruby/optional/capi/ext/string_spec.c b/spec/ruby/optional/capi/ext/string_spec.c index 390c5a8ab2be..9c13d805c5ca 100644 --- a/spec/ruby/optional/capi/ext/string_spec.c +++ b/spec/ruby/optional/capi/ext/string_spec.c @@ -589,6 +589,10 @@ static VALUE string_spec_rb_enc_interned_str_cstr(VALUE self, VALUE str, VALUE e return rb_enc_interned_str_cstr(RSTRING_PTR(str), e); } +static VALUE string_spec_rb_str_to_interned_str(VALUE self, VALUE str) { + return rb_str_to_interned_str(str); +} + void Init_string_spec(void) { VALUE cls = rb_define_class("CApiStringSpecs", rb_cObject); rb_define_method(cls, "rb_cstr2inum", string_spec_rb_cstr2inum, 2); @@ -691,6 +695,7 @@ void Init_string_spec(void) { rb_define_method(cls, "rb_str_locktmp", string_spec_rb_str_locktmp, 1); rb_define_method(cls, "rb_str_unlocktmp", string_spec_rb_str_unlocktmp, 1); rb_define_method(cls, "rb_enc_interned_str_cstr", string_spec_rb_enc_interned_str_cstr, 2); + rb_define_method(cls, "rb_str_to_interned_str", string_spec_rb_str_to_interned_str, 1); } #ifdef __cplusplus diff --git a/spec/ruby/optional/capi/string_spec.rb b/spec/ruby/optional/capi/string_spec.rb index eef170e78bf9..48a06bfdcd38 100644 --- a/spec/ruby/optional/capi/string_spec.rb +++ b/spec/ruby/optional/capi/string_spec.rb @@ -1252,4 +1252,20 @@ def inspect result1.should_not.equal?(result2) end end + + describe "rb_str_to_interned_str" do + it "returns a frozen string" do + str = "hello" + result = @s.rb_str_to_interned_str(str) + result.should.is_a?(String) + result.should.frozen? + end + + it "returns the same frozen string" do + str = "hello" + result1 = @s.rb_str_to_interned_str(str) + result2 = @s.rb_str_to_interned_str(str) + result1.should.equal?(result2) + end + end end diff --git a/src/main/c/cext/string.c b/src/main/c/cext/string.c index 4c7e0be48b46..211af65bb87a 100644 --- a/src/main/c/cext/string.c +++ b/src/main/c/cext/string.c @@ -442,3 +442,7 @@ VALUE rb_enc_interned_str_cstr(const char *ptr, rb_encoding *enc) { VALUE str = rb_enc_str_new_cstr(ptr, enc); return rb_fstring(str); } + +VALUE rb_str_to_interned_str(VALUE str) { + return rb_fstring(str); +}