Skip to content

Commit 232cc9c

Browse files
committed
Merge remote-tracking branch 'gh/master' into zjit-filter-send-with-block-local-reloads
2 parents 51d7db7 + 5d1a023 commit 232cc9c

101 files changed

Lines changed: 1724 additions & 5867 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

NEWS.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,15 @@ releases.
7575
### The following default gems are updated.
7676

7777
* RubyGems 4.1.0.dev
78-
* 4.0.3 to [v4.0.4][RubyGems-v4.0.4], [v4.0.5][RubyGems-v4.0.5], [v4.0.6][RubyGems-v4.0.6], [v4.0.7][RubyGems-v4.0.7], [v4.0.8][RubyGems-v4.0.8], [v4.0.9][RubyGems-v4.0.9], [v4.0.10][RubyGems-v4.0.10], [v4.0.11][RubyGems-v4.0.11], [v4.0.12][RubyGems-v4.0.12], [v4.0.13][RubyGems-v4.0.13], [v4.0.14][RubyGems-v4.0.14]
78+
* 4.0.3 to [v4.0.4][RubyGems-v4.0.4], [v4.0.5][RubyGems-v4.0.5], [v4.0.6][RubyGems-v4.0.6], [v4.0.7][RubyGems-v4.0.7], [v4.0.8][RubyGems-v4.0.8], [v4.0.9][RubyGems-v4.0.9], [v4.0.10][RubyGems-v4.0.10], [v4.0.11][RubyGems-v4.0.11], [v4.0.12][RubyGems-v4.0.12], [v4.0.13][RubyGems-v4.0.13], [v4.0.14][RubyGems-v4.0.14], [v4.0.15][RubyGems-v4.0.15]
7979
* bundler 4.1.0.dev
80-
* 4.0.3 to [v4.0.4][bundler-v4.0.4], [v4.0.5][bundler-v4.0.5], [v4.0.6][bundler-v4.0.6], [v4.0.7][bundler-v4.0.7], [v4.0.8][bundler-v4.0.8], [v4.0.9][bundler-v4.0.9], [v4.0.10][bundler-v4.0.10], [v4.0.11][bundler-v4.0.11], [v4.0.12][bundler-v4.0.12], [v4.0.13][bundler-v4.0.13], [v4.0.14][bundler-v4.0.14]
80+
* 4.0.3 to [v4.0.4][bundler-v4.0.4], [v4.0.5][bundler-v4.0.5], [v4.0.6][bundler-v4.0.6], [v4.0.7][bundler-v4.0.7], [v4.0.8][bundler-v4.0.8], [v4.0.9][bundler-v4.0.9], [v4.0.10][bundler-v4.0.10], [v4.0.11][bundler-v4.0.11], [v4.0.12][bundler-v4.0.12], [v4.0.13][bundler-v4.0.13], [v4.0.14][bundler-v4.0.14], [v4.0.15][bundler-v4.0.15]
8181
* erb 6.0.4
8282
* 6.0.1 to [v6.0.1.1][erb-v6.0.1.1], [v6.0.2][erb-v6.0.2], [v6.0.3][erb-v6.0.3], [v6.0.4][erb-v6.0.4]
8383
* ipaddr 1.2.9
8484
* 1.2.8 to [v1.2.9][ipaddr-v1.2.9]
8585
* json 2.20.0
86-
* 2.18.0 to [v2.18.1][json-v2.18.1], [v2.19.0][json-v2.19.0], [v2.19.1][json-v2.19.1], [v2.19.2][json-v2.19.2], [v2.19.3][json-v2.19.3], [v2.19.4][json-v2.19.4], [v2.19.5][json-v2.19.5], [v2.19.6][json-v2.19.6], [v2.19.7][json-v2.19.7], [v2.19.8][json-v2.19.8], [v2.19.9][json-v2.19.9]
86+
* 2.18.0 to [v2.18.1][json-v2.18.1], [v2.19.0][json-v2.19.0], [v2.19.1][json-v2.19.1], [v2.19.2][json-v2.19.2], [v2.19.3][json-v2.19.3], [v2.19.4][json-v2.19.4], [v2.19.5][json-v2.19.5], [v2.19.6][json-v2.19.6], [v2.19.7][json-v2.19.7], [v2.19.8][json-v2.19.8], [v2.19.9][json-v2.19.9], [v2.20.0][json-v2.20.0]
8787
* openssl 4.0.2
8888
* 4.0.0 to [v4.0.1][openssl-v4.0.1], [v4.0.2][openssl-v4.0.2]
8989
* pp 0.6.4
@@ -114,7 +114,7 @@ releases.
114114
* net-imap 0.6.4.1
115115
* 0.6.2 to [v0.6.3][net-imap-v0.6.3], [v0.6.4][net-imap-v0.6.4], [v0.6.4.1][net-imap-v0.6.4.1]
116116
* rbs 4.0.3
117-
* 3.10.0 to [v3.10.1][rbs-v3.10.1], [v3.10.2][rbs-v3.10.2], [v3.10.3][rbs-v3.10.3], [v3.10.4][rbs-v3.10.4], [v4.0.0.dev.5][rbs-v4.0.0.dev.5], [v4.0.0][rbs-v4.0.0], [v4.0.2][rbs-v4.0.2]
117+
* 3.10.0 to [v3.10.1][rbs-v3.10.1], [v3.10.2][rbs-v3.10.2], [v3.10.3][rbs-v3.10.3], [v3.10.4][rbs-v3.10.4], [v4.0.0.dev.5][rbs-v4.0.0.dev.5], [v4.0.0][rbs-v4.0.0], [v4.0.2][rbs-v4.0.2], [v4.0.3][rbs-v4.0.3]
118118
* typeprof 0.32.0
119119
* mutex_m 0.3.0
120120
* bigdecimal 4.1.2
@@ -213,6 +213,7 @@ A lot of work has gone into making Ractors more stable, performant, and usable.
213213
[RubyGems-v4.0.12]: https://github.com/rubygems/rubygems/releases/tag/v4.0.12
214214
[RubyGems-v4.0.13]: https://github.com/rubygems/rubygems/releases/tag/v4.0.13
215215
[RubyGems-v4.0.14]: https://github.com/rubygems/rubygems/releases/tag/v4.0.14
216+
[RubyGems-v4.0.15]: https://github.com/rubygems/rubygems/releases/tag/v4.0.15
216217
[bundler-v4.0.4]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.4
217218
[bundler-v4.0.5]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.5
218219
[bundler-v4.0.6]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.6
@@ -224,6 +225,7 @@ A lot of work has gone into making Ractors more stable, performant, and usable.
224225
[bundler-v4.0.12]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.12
225226
[bundler-v4.0.13]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.13
226227
[bundler-v4.0.14]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.14
228+
[bundler-v4.0.15]: https://github.com/rubygems/rubygems/releases/tag/bundler-v4.0.15
227229
[erb-v6.0.1.1]: https://github.com/ruby/erb/releases/tag/v6.0.1.1
228230
[erb-v6.0.2]: https://github.com/ruby/erb/releases/tag/v6.0.2
229231
[erb-v6.0.3]: https://github.com/ruby/erb/releases/tag/v6.0.3
@@ -240,6 +242,7 @@ A lot of work has gone into making Ractors more stable, performant, and usable.
240242
[json-v2.19.7]: https://github.com/ruby/json/releases/tag/v2.19.7
241243
[json-v2.19.8]: https://github.com/ruby/json/releases/tag/v2.19.8
242244
[json-v2.19.9]: https://github.com/ruby/json/releases/tag/v2.19.9
245+
[json-v2.20.0]: https://github.com/ruby/json/releases/tag/v2.20.0
243246
[openssl-v4.0.1]: https://github.com/ruby/openssl/releases/tag/v4.0.1
244247
[openssl-v4.0.2]: https://github.com/ruby/openssl/releases/tag/v4.0.2
245248
[pp-v0.6.4]: https://github.com/ruby/pp/releases/tag/v0.6.4
@@ -268,6 +271,7 @@ A lot of work has gone into making Ractors more stable, performant, and usable.
268271
[rbs-v4.0.0.dev.5]: https://github.com/ruby/rbs/releases/tag/v4.0.0.dev.5
269272
[rbs-v4.0.0]: https://github.com/ruby/rbs/releases/tag/v4.0.0
270273
[rbs-v4.0.2]: https://github.com/ruby/rbs/releases/tag/v4.0.2
274+
[rbs-v4.0.3]: https://github.com/ruby/rbs/releases/tag/v4.0.3
271275
[bigdecimal-v4.1.0]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.0
272276
[bigdecimal-v4.1.1]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.1
273277
[bigdecimal-v4.1.2]: https://github.com/ruby/bigdecimal/releases/tag/v4.1.2

benchmark/string_ascii_only_p.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
prelude: |
2+
ascii = "hello world"
3+
utf8 = "héllo wörld 晦"
4+
benchmark:
5+
ascii_only_true: ascii.ascii_only?
6+
ascii_only_false: utf8.ascii_only?
7+
loop_count: 20000000
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
prelude: |
2+
utf8 = "héllo wörld 晦"
3+
broken = "\xff\xfe".dup.force_encoding("UTF-8")
4+
benchmark:
5+
valid_enc_true: utf8.valid_encoding?
6+
valid_enc_false: broken.valid_encoding?
7+
loop_count: 20000000

common.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,7 @@ BUILTIN_RB_SRCS = \
11991199
$(srcdir)/kernel.rb \
12001200
$(srcdir)/pathname_builtin.rb \
12011201
$(srcdir)/ractor.rb \
1202+
$(srcdir)/string.rb \
12021203
$(srcdir)/symbol.rb \
12031204
$(srcdir)/timev.rb \
12041205
$(srcdir)/thread_sync.rb \

compile.c

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3149,41 +3149,56 @@ find_destination(INSN *i)
31493149
static int
31503150
remove_unreachable_chunk(rb_iseq_t *iseq, LINK_ELEMENT *i)
31513151
{
3152-
LINK_ELEMENT *first = i, *end;
3152+
LINK_ELEMENT *first = i, *end, *scan;
31533153
int *unref_counts = 0, nlabels = ISEQ_COMPILE_DATA(iseq)->label_no;
31543154

31553155
if (!i) return 0;
31563156
unref_counts = ALLOCA_N(int, nlabels);
31573157
MEMZERO(unref_counts, int, nlabels);
3158-
end = i;
3158+
3159+
scan = i;
31593160
do {
31603161
LABEL *lab;
3161-
if (IS_INSN(i)) {
3162-
if (IS_INSN_ID(i, leave)) {
3163-
end = i;
3162+
if (IS_INSN(scan)) {
3163+
if (IS_INSN_ID(scan, leave)) {
31643164
break;
31653165
}
3166-
else if ((lab = find_destination((INSN *)i)) != 0) {
3166+
else if ((lab = find_destination((INSN *)scan)) != 0) {
31673167
unref_counts[lab->label_no]++;
31683168
}
31693169
}
3170-
else if (IS_LABEL(i)) {
3171-
lab = (LABEL *)i;
3170+
else if (IS_LABEL(scan)) {
3171+
lab = (LABEL *)scan;
31723172
if (lab->unremovable) return 0;
3173+
}
3174+
else if (IS_ADJUST(scan)) {
3175+
return 0;
3176+
}
3177+
} while ((scan = scan->next) != 0);
3178+
3179+
end = i;
3180+
scan = i;
3181+
do {
3182+
LABEL *lab;
3183+
if (IS_INSN(scan)) {
3184+
if (IS_INSN_ID(scan, leave)) {
3185+
end = scan;
3186+
break;
3187+
}
3188+
}
3189+
else if (IS_LABEL(scan)) {
3190+
lab = (LABEL *)scan;
31733191
if (lab->refcnt > unref_counts[lab->label_no]) {
3174-
if (i == first) return 0;
3192+
if (scan == first) return 0;
31753193
break;
31763194
}
31773195
continue;
31783196
}
3179-
else if (IS_TRACE(i)) {
3180-
/* do nothing */
3181-
}
3182-
else if (IS_ADJUST(i)) {
3197+
else if (IS_ADJUST(scan)) {
31833198
return 0;
31843199
}
3185-
end = i;
3186-
} while ((i = i->next) != 0);
3200+
end = scan;
3201+
} while ((scan = scan->next) != 0);
31873202
i = first;
31883203
do {
31893204
if (IS_INSN(i)) {
@@ -3366,6 +3381,22 @@ ci_argc_set(const rb_iseq_t *iseq, const struct rb_callinfo *ci, int argc)
33663381

33673382
#define vm_ci_simple(ci) (vm_ci_flag(ci) & VM_CALL_ARGS_SIMPLE)
33683383

3384+
static VALUE
3385+
iseq_reg_compile(rb_iseq_t *iseq, VALUE str, int options, const char *sourcefile, int sourceline)
3386+
{
3387+
VALUE errinfo = rb_errinfo();
3388+
VALUE re = rb_reg_compile(str, options, sourcefile, sourceline);
3389+
if (NIL_P(re)) {
3390+
VALUE message = rb_attr_get(rb_errinfo(), idMesg);
3391+
rb_set_errinfo(errinfo);
3392+
COMPILE_ERROR(iseq, sourceline, "%" PRIsVALUE, message);
3393+
}
3394+
else {
3395+
RB_OBJ_SET_SHAREABLE(re);
3396+
}
3397+
return re;
3398+
}
3399+
33693400
static int
33703401
iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcallopt)
33713402
{
@@ -3937,16 +3968,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
39373968
int opt = (int)FIX2LONG(OPERAND_AT(next, 0));
39383969
VALUE path = rb_iseq_path(iseq);
39393970
int line = iobj->insn_info.line_no;
3940-
VALUE errinfo = rb_errinfo();
3941-
VALUE re = rb_reg_compile(src, opt, RSTRING_PTR(path), line);
3942-
if (NIL_P(re)) {
3943-
VALUE message = rb_attr_get(rb_errinfo(), idMesg);
3944-
rb_set_errinfo(errinfo);
3945-
COMPILE_ERROR(iseq, line, "%" PRIsVALUE, message);
3946-
}
3947-
else {
3948-
RB_OBJ_SET_SHAREABLE(re);
3949-
}
3971+
VALUE re = iseq_reg_compile(iseq, src, opt, RSTRING_PTR(path), line);
39503972
/* The folded operand is a Regexp, so the instruction must be
39513973
* putobject: dupstring/dupchilledstring would resurrect the
39523974
* Regexp as a String at run time (e.g. for a /o regexp whose
@@ -4784,8 +4806,7 @@ compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, i
47844806
if (!RNODE_DREGX(node)->nd_next) {
47854807
if (!popped) {
47864808
VALUE src = rb_node_dregx_string_val(node);
4787-
VALUE match = rb_reg_compile(src, cflag, NULL, 0);
4788-
RB_OBJ_SET_SHAREABLE(match);
4809+
VALUE match = iseq_reg_compile(iseq, src, cflag, NULL, 0);
47894810
ADD_INSN1(ret, node, putobject, match);
47904811
RB_OBJ_WRITTEN(iseq, Qundef, match);
47914812
}

complex.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ static VALUE RFLOAT_0;
4040
VALUE rb_cComplex;
4141

4242
static ID id_abs, id_arg,
43-
id_denominator, id_numerator,
4443
id_real_p, id_i_real, id_i_imag,
4544
id_finite_p, id_infinite_p, id_rationalize,
4645
id_PI;
@@ -2696,8 +2695,6 @@ Init_Complex(void)
26962695
VALUE compat;
26972696
id_abs = rb_intern_const("abs");
26982697
id_arg = rb_intern_const("arg");
2699-
id_denominator = rb_intern_const("denominator");
2700-
id_numerator = rb_intern_const("numerator");
27012698
id_real_p = rb_intern_const("real?");
27022699
id_i_real = rb_intern_const("@real");
27032700
id_i_imag = rb_intern_const("@image"); /* @image, not @imag */

depend

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7354,6 +7354,7 @@ io_buffer.$(OBJEXT): $(top_srcdir)/internal/fixnum.h
73547354
io_buffer.$(OBJEXT): $(top_srcdir)/internal/gc.h
73557355
io_buffer.$(OBJEXT): $(top_srcdir)/internal/imemo.h
73567356
io_buffer.$(OBJEXT): $(top_srcdir)/internal/io.h
7357+
io_buffer.$(OBJEXT): $(top_srcdir)/internal/io_buffer.h
73577358
io_buffer.$(OBJEXT): $(top_srcdir)/internal/numeric.h
73587359
io_buffer.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h
73597360
io_buffer.$(OBJEXT): $(top_srcdir)/internal/serial.h
@@ -17718,6 +17719,7 @@ string.$(OBJEXT): {$(VPATH)}backward/2/limits.h
1771817719
string.$(OBJEXT): {$(VPATH)}backward/2/long_long.h
1771917720
string.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
1772017721
string.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
17722+
string.$(OBJEXT): {$(VPATH)}builtin.h
1772117723
string.$(OBJEXT): {$(VPATH)}config.h
1772217724
string.$(OBJEXT): {$(VPATH)}constant.h
1772317725
string.$(OBJEXT): {$(VPATH)}debug_counter.h
@@ -17896,6 +17898,7 @@ string.$(OBJEXT): {$(VPATH)}rubyparser.h
1789617898
string.$(OBJEXT): {$(VPATH)}shape.h
1789717899
string.$(OBJEXT): {$(VPATH)}st.h
1789817900
string.$(OBJEXT): {$(VPATH)}string.c
17901+
string.$(OBJEXT): {$(VPATH)}string.rbinc
1789917902
string.$(OBJEXT): {$(VPATH)}subst.h
1790017903
string.$(OBJEXT): {$(VPATH)}thread.h
1790117904
string.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h

doc/syntax/refinements.rdoc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,10 @@ invokes that method since +foo+ does not exist on Integer.
246246

247247
When +super+ is invoked, method lookup starts:
248248

249-
* If the method is in a refinement, at the refined class or module
249+
* If the method is in a refinement:
250+
* At the next active refinement in scope at the +super+ call site,
251+
excluding the current refinement, if such a refinement exists
252+
* Otherwise, at the refined class or module
250253
* Otherwise, at the next ancestor
251254

252255
Method lookup then proceeds as described in the Method Lookup section

ext/-test-/io_buffer/extconf.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# frozen_string_literal: false
2+
require_relative "../auto_ext.rb"
3+
auto_ext(inc: true)

ext/-test-/io_buffer/io_buffer.c

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include "ruby.h"
2+
#include "internal/io_buffer.h"
3+
4+
static VALUE
5+
io_buffer_get_string(VALUE buffer, VALUE argument)
6+
{
7+
(void)argument;
8+
return rb_funcall(buffer, rb_intern("get_string"), 0);
9+
}
10+
11+
static VALUE
12+
io_buffer_readonly_p(VALUE buffer, VALUE argument)
13+
{
14+
(void)argument;
15+
return rb_funcall(buffer, rb_intern("readonly?"), 0);
16+
}
17+
18+
static VALUE
19+
io_buffer_object_id(VALUE buffer, VALUE argument)
20+
{
21+
(void)argument;
22+
return rb_obj_id(buffer);
23+
}
24+
25+
static VALUE
26+
io_buffer_set_string(VALUE buffer, VALUE string)
27+
{
28+
return rb_funcall(buffer, rb_intern("set_string"), 1, string);
29+
}
30+
31+
static VALUE
32+
io_buffer_modify_string(VALUE buffer, VALUE string)
33+
{
34+
(void)buffer;
35+
rb_str_cat(string, "!", 1);
36+
return Qnil;
37+
}
38+
39+
static VALUE
40+
io_buffer_raise(VALUE buffer, VALUE argument)
41+
{
42+
(void)buffer;
43+
(void)argument;
44+
rb_raise(rb_eRuntimeError, "interrupted");
45+
}
46+
47+
static VALUE
48+
io_buffer_for_reading_get_string(VALUE self, VALUE object)
49+
{
50+
return rb_io_buffer_for_reading(object, io_buffer_get_string, Qnil);
51+
}
52+
53+
static VALUE
54+
io_buffer_for_reading_readonly_p(VALUE self, VALUE object)
55+
{
56+
return rb_io_buffer_for_reading(object, io_buffer_readonly_p, Qnil);
57+
}
58+
59+
static VALUE
60+
io_buffer_for_reading_object_id(VALUE self, VALUE object)
61+
{
62+
return rb_io_buffer_for_reading(object, io_buffer_object_id, Qnil);
63+
}
64+
65+
static VALUE
66+
io_buffer_for_reading_raise(VALUE self, VALUE string)
67+
{
68+
StringValue(string);
69+
return rb_io_buffer_for_reading(string, io_buffer_raise, Qnil);
70+
}
71+
72+
static VALUE
73+
io_buffer_for_writing_set_string(VALUE self, VALUE object, VALUE string)
74+
{
75+
StringValue(string);
76+
return rb_io_buffer_for_writing(object, io_buffer_set_string, string);
77+
}
78+
79+
static VALUE
80+
io_buffer_for_writing_readonly_p(VALUE self, VALUE object)
81+
{
82+
return rb_io_buffer_for_writing(object, io_buffer_readonly_p, Qnil);
83+
}
84+
85+
static VALUE
86+
io_buffer_for_writing_modify_string(VALUE self, VALUE string)
87+
{
88+
StringValue(string);
89+
return rb_io_buffer_for_writing(string, io_buffer_modify_string, string);
90+
}
91+
92+
void
93+
Init_io_buffer(void)
94+
{
95+
VALUE mBug = rb_define_module("Bug");
96+
VALUE mIOBuffer = rb_define_module_under(mBug, "IOBuffer");
97+
98+
rb_define_singleton_method(mIOBuffer, "for_reading_get_string", io_buffer_for_reading_get_string, 1);
99+
rb_define_singleton_method(mIOBuffer, "for_reading_readonly?", io_buffer_for_reading_readonly_p, 1);
100+
rb_define_singleton_method(mIOBuffer, "for_reading_object_id", io_buffer_for_reading_object_id, 1);
101+
rb_define_singleton_method(mIOBuffer, "for_reading_raise", io_buffer_for_reading_raise, 1);
102+
rb_define_singleton_method(mIOBuffer, "for_writing_set_string", io_buffer_for_writing_set_string, 2);
103+
rb_define_singleton_method(mIOBuffer, "for_writing_readonly?", io_buffer_for_writing_readonly_p, 1);
104+
rb_define_singleton_method(mIOBuffer, "for_writing_modify_string", io_buffer_for_writing_modify_string, 1);
105+
}

0 commit comments

Comments
 (0)