Skip to content

Commit 2b08406

Browse files
etiennebarriebyroot
andcommitted
Expose rb_str_chilled_p
Some extensions (like stringio) may need to differentiate between chilled strings and frozen strings. They can now use rb_str_chilled_p but must check for its presence since the function will be removed when chilled strings are removed. [Bug #20389] [Feature #20205] Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
1 parent 8cfa8e8 commit 2b08406

File tree

5 files changed

+212
-0
lines changed

5 files changed

+212
-0
lines changed

ext/-test-/string/chilled.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "ruby.h"
2+
3+
static VALUE
4+
bug_s_rb_str_chilled_p(VALUE self, VALUE str)
5+
{
6+
return rb_str_chilled_p(str) ? Qtrue : Qfalse;
7+
}
8+
9+
void
10+
Init_string_chilled(VALUE klass)
11+
{
12+
rb_define_singleton_method(klass, "rb_str_chilled_p", bug_s_rb_str_chilled_p, 1);
13+
}

ext/-test-/string/depend

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,165 @@ capacity.o: $(hdrdir)/ruby/subst.h
173173
capacity.o: $(top_srcdir)/internal/compilers.h
174174
capacity.o: $(top_srcdir)/internal/string.h
175175
capacity.o: capacity.c
176+
chilled.o: $(RUBY_EXTCONF_H)
177+
chilled.o: $(arch_hdrdir)/ruby/config.h
178+
chilled.o: $(hdrdir)/ruby.h
179+
chilled.o: $(hdrdir)/ruby/assert.h
180+
chilled.o: $(hdrdir)/ruby/backward.h
181+
chilled.o: $(hdrdir)/ruby/backward/2/assume.h
182+
chilled.o: $(hdrdir)/ruby/backward/2/attributes.h
183+
chilled.o: $(hdrdir)/ruby/backward/2/bool.h
184+
chilled.o: $(hdrdir)/ruby/backward/2/inttypes.h
185+
chilled.o: $(hdrdir)/ruby/backward/2/limits.h
186+
chilled.o: $(hdrdir)/ruby/backward/2/long_long.h
187+
chilled.o: $(hdrdir)/ruby/backward/2/stdalign.h
188+
chilled.o: $(hdrdir)/ruby/backward/2/stdarg.h
189+
chilled.o: $(hdrdir)/ruby/defines.h
190+
chilled.o: $(hdrdir)/ruby/intern.h
191+
chilled.o: $(hdrdir)/ruby/internal/abi.h
192+
chilled.o: $(hdrdir)/ruby/internal/anyargs.h
193+
chilled.o: $(hdrdir)/ruby/internal/arithmetic.h
194+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/char.h
195+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/double.h
196+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
197+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
198+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/int.h
199+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
200+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/long.h
201+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
202+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
203+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
204+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
205+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/short.h
206+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
207+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
208+
chilled.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
209+
chilled.o: $(hdrdir)/ruby/internal/assume.h
210+
chilled.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
211+
chilled.o: $(hdrdir)/ruby/internal/attr/artificial.h
212+
chilled.o: $(hdrdir)/ruby/internal/attr/cold.h
213+
chilled.o: $(hdrdir)/ruby/internal/attr/const.h
214+
chilled.o: $(hdrdir)/ruby/internal/attr/constexpr.h
215+
chilled.o: $(hdrdir)/ruby/internal/attr/deprecated.h
216+
chilled.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
217+
chilled.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
218+
chilled.o: $(hdrdir)/ruby/internal/attr/error.h
219+
chilled.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
220+
chilled.o: $(hdrdir)/ruby/internal/attr/forceinline.h
221+
chilled.o: $(hdrdir)/ruby/internal/attr/format.h
222+
chilled.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
223+
chilled.o: $(hdrdir)/ruby/internal/attr/noalias.h
224+
chilled.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
225+
chilled.o: $(hdrdir)/ruby/internal/attr/noexcept.h
226+
chilled.o: $(hdrdir)/ruby/internal/attr/noinline.h
227+
chilled.o: $(hdrdir)/ruby/internal/attr/nonnull.h
228+
chilled.o: $(hdrdir)/ruby/internal/attr/noreturn.h
229+
chilled.o: $(hdrdir)/ruby/internal/attr/packed_struct.h
230+
chilled.o: $(hdrdir)/ruby/internal/attr/pure.h
231+
chilled.o: $(hdrdir)/ruby/internal/attr/restrict.h
232+
chilled.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
233+
chilled.o: $(hdrdir)/ruby/internal/attr/warning.h
234+
chilled.o: $(hdrdir)/ruby/internal/attr/weakref.h
235+
chilled.o: $(hdrdir)/ruby/internal/cast.h
236+
chilled.o: $(hdrdir)/ruby/internal/compiler_is.h
237+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
238+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
239+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
240+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
241+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
242+
chilled.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
243+
chilled.o: $(hdrdir)/ruby/internal/compiler_since.h
244+
chilled.o: $(hdrdir)/ruby/internal/config.h
245+
chilled.o: $(hdrdir)/ruby/internal/constant_p.h
246+
chilled.o: $(hdrdir)/ruby/internal/core.h
247+
chilled.o: $(hdrdir)/ruby/internal/core/rarray.h
248+
chilled.o: $(hdrdir)/ruby/internal/core/rbasic.h
249+
chilled.o: $(hdrdir)/ruby/internal/core/rbignum.h
250+
chilled.o: $(hdrdir)/ruby/internal/core/rclass.h
251+
chilled.o: $(hdrdir)/ruby/internal/core/rdata.h
252+
chilled.o: $(hdrdir)/ruby/internal/core/rfile.h
253+
chilled.o: $(hdrdir)/ruby/internal/core/rhash.h
254+
chilled.o: $(hdrdir)/ruby/internal/core/robject.h
255+
chilled.o: $(hdrdir)/ruby/internal/core/rregexp.h
256+
chilled.o: $(hdrdir)/ruby/internal/core/rstring.h
257+
chilled.o: $(hdrdir)/ruby/internal/core/rstruct.h
258+
chilled.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
259+
chilled.o: $(hdrdir)/ruby/internal/ctype.h
260+
chilled.o: $(hdrdir)/ruby/internal/dllexport.h
261+
chilled.o: $(hdrdir)/ruby/internal/dosish.h
262+
chilled.o: $(hdrdir)/ruby/internal/error.h
263+
chilled.o: $(hdrdir)/ruby/internal/eval.h
264+
chilled.o: $(hdrdir)/ruby/internal/event.h
265+
chilled.o: $(hdrdir)/ruby/internal/fl_type.h
266+
chilled.o: $(hdrdir)/ruby/internal/gc.h
267+
chilled.o: $(hdrdir)/ruby/internal/glob.h
268+
chilled.o: $(hdrdir)/ruby/internal/globals.h
269+
chilled.o: $(hdrdir)/ruby/internal/has/attribute.h
270+
chilled.o: $(hdrdir)/ruby/internal/has/builtin.h
271+
chilled.o: $(hdrdir)/ruby/internal/has/c_attribute.h
272+
chilled.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
273+
chilled.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
274+
chilled.o: $(hdrdir)/ruby/internal/has/extension.h
275+
chilled.o: $(hdrdir)/ruby/internal/has/feature.h
276+
chilled.o: $(hdrdir)/ruby/internal/has/warning.h
277+
chilled.o: $(hdrdir)/ruby/internal/intern/array.h
278+
chilled.o: $(hdrdir)/ruby/internal/intern/bignum.h
279+
chilled.o: $(hdrdir)/ruby/internal/intern/class.h
280+
chilled.o: $(hdrdir)/ruby/internal/intern/compar.h
281+
chilled.o: $(hdrdir)/ruby/internal/intern/complex.h
282+
chilled.o: $(hdrdir)/ruby/internal/intern/cont.h
283+
chilled.o: $(hdrdir)/ruby/internal/intern/dir.h
284+
chilled.o: $(hdrdir)/ruby/internal/intern/enum.h
285+
chilled.o: $(hdrdir)/ruby/internal/intern/enumerator.h
286+
chilled.o: $(hdrdir)/ruby/internal/intern/error.h
287+
chilled.o: $(hdrdir)/ruby/internal/intern/eval.h
288+
chilled.o: $(hdrdir)/ruby/internal/intern/file.h
289+
chilled.o: $(hdrdir)/ruby/internal/intern/hash.h
290+
chilled.o: $(hdrdir)/ruby/internal/intern/io.h
291+
chilled.o: $(hdrdir)/ruby/internal/intern/load.h
292+
chilled.o: $(hdrdir)/ruby/internal/intern/marshal.h
293+
chilled.o: $(hdrdir)/ruby/internal/intern/numeric.h
294+
chilled.o: $(hdrdir)/ruby/internal/intern/object.h
295+
chilled.o: $(hdrdir)/ruby/internal/intern/parse.h
296+
chilled.o: $(hdrdir)/ruby/internal/intern/proc.h
297+
chilled.o: $(hdrdir)/ruby/internal/intern/process.h
298+
chilled.o: $(hdrdir)/ruby/internal/intern/random.h
299+
chilled.o: $(hdrdir)/ruby/internal/intern/range.h
300+
chilled.o: $(hdrdir)/ruby/internal/intern/rational.h
301+
chilled.o: $(hdrdir)/ruby/internal/intern/re.h
302+
chilled.o: $(hdrdir)/ruby/internal/intern/ruby.h
303+
chilled.o: $(hdrdir)/ruby/internal/intern/select.h
304+
chilled.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
305+
chilled.o: $(hdrdir)/ruby/internal/intern/signal.h
306+
chilled.o: $(hdrdir)/ruby/internal/intern/sprintf.h
307+
chilled.o: $(hdrdir)/ruby/internal/intern/string.h
308+
chilled.o: $(hdrdir)/ruby/internal/intern/struct.h
309+
chilled.o: $(hdrdir)/ruby/internal/intern/thread.h
310+
chilled.o: $(hdrdir)/ruby/internal/intern/time.h
311+
chilled.o: $(hdrdir)/ruby/internal/intern/variable.h
312+
chilled.o: $(hdrdir)/ruby/internal/intern/vm.h
313+
chilled.o: $(hdrdir)/ruby/internal/interpreter.h
314+
chilled.o: $(hdrdir)/ruby/internal/iterator.h
315+
chilled.o: $(hdrdir)/ruby/internal/memory.h
316+
chilled.o: $(hdrdir)/ruby/internal/method.h
317+
chilled.o: $(hdrdir)/ruby/internal/module.h
318+
chilled.o: $(hdrdir)/ruby/internal/newobj.h
319+
chilled.o: $(hdrdir)/ruby/internal/scan_args.h
320+
chilled.o: $(hdrdir)/ruby/internal/special_consts.h
321+
chilled.o: $(hdrdir)/ruby/internal/static_assert.h
322+
chilled.o: $(hdrdir)/ruby/internal/stdalign.h
323+
chilled.o: $(hdrdir)/ruby/internal/stdbool.h
324+
chilled.o: $(hdrdir)/ruby/internal/symbol.h
325+
chilled.o: $(hdrdir)/ruby/internal/value.h
326+
chilled.o: $(hdrdir)/ruby/internal/value_type.h
327+
chilled.o: $(hdrdir)/ruby/internal/variable.h
328+
chilled.o: $(hdrdir)/ruby/internal/warning_push.h
329+
chilled.o: $(hdrdir)/ruby/internal/xmalloc.h
330+
chilled.o: $(hdrdir)/ruby/missing.h
331+
chilled.o: $(hdrdir)/ruby/ruby.h
332+
chilled.o: $(hdrdir)/ruby/st.h
333+
chilled.o: $(hdrdir)/ruby/subst.h
334+
chilled.o: chilled.c
176335
coderange.o: $(RUBY_EXTCONF_H)
177336
coderange.o: $(arch_hdrdir)/ruby/config.h
178337
coderange.o: $(hdrdir)/ruby/assert.h

include/ruby/internal/intern/string.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,21 @@ VALUE rb_str_dup(VALUE str);
601601
*/
602602
VALUE rb_str_resurrect(VALUE str);
603603

604+
/**
605+
* Returns whether a string is chilled or not.
606+
*
607+
* This function is temporary and users must check for its presence using
608+
* #ifdef HAVE_RB_STR_CHILLED_P. If HAVE_RB_STR_CHILLED_P is not defined, then
609+
* strings can't be chilled.
610+
*
611+
* @param[in] str A string.
612+
* @retval 1 The string is chilled.
613+
* @retval 0 Otherwise.
614+
*/
615+
bool rb_str_chilled_p(VALUE str);
616+
617+
#define HAVE_RB_STR_CHILLED_P 1
618+
604619
/**
605620
* Obtains a "temporary lock" of the string. This advisory locking mechanism
606621
* prevents other cooperating threads from tampering the receiver. The same

string.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,6 +1833,12 @@ rb_ec_str_resurrect(struct rb_execution_context_struct *ec, VALUE str, bool chil
18331833
return new_str;
18341834
}
18351835

1836+
bool
1837+
rb_str_chilled_p(VALUE str)
1838+
{
1839+
return CHILLED_STRING_P(str);
1840+
}
1841+
18361842
/*
18371843
*
18381844
* call-seq:

test/-ext-/string/test_chilled.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require 'test/unit'
2+
require '-test-/string'
3+
4+
class Test_String_ChilledString < Test::Unit::TestCase
5+
def test_rb_str_chilled_p
6+
str = ""
7+
assert_equal true, Bug::String.rb_str_chilled_p(str)
8+
end
9+
10+
def test_rb_str_chilled_p_frozen
11+
str = "".freeze
12+
assert_equal false, Bug::String.rb_str_chilled_p(str)
13+
end
14+
15+
def test_rb_str_chilled_p_mutable
16+
str = "".dup
17+
assert_equal false, Bug::String.rb_str_chilled_p(str)
18+
end
19+
end

0 commit comments

Comments
 (0)