diff --git "a/C:\\Users\\LAZARI~1\\AppData\\Local\\Temp\\str187F.c" "b/C:\\Users\\LAZARI~1\\AppData\\Local\\Temp\\str186F.c" index 711918b..a00dac7 100644 --- "a/C:\\Users\\LAZARI~1\\AppData\\Local\\Temp\\str187F.c" +++ "b/C:\\Users\\LAZARI~1\\AppData\\Local\\Temp\\str186F.c" @@ -406,10 +406,38 @@ str_new(VALUE klass, const char *ptr, long len) return str; } +#define FL_CALL_INIT FL_USER18 + +VALUE +rb_str_call_initialize_get(VALUE self) +{ + if (FL_TEST(rb_cString, FL_CALL_INIT)) return Qtrue; + return Qfalse; +} + +VALUE +rb_str_call_initialize_set(VALUE self, VALUE val) +{ + FL_UNSET(rb_cString, FL_CALL_INIT); + if (val == Qtrue) FL_SET(rb_cString, FL_CALL_INIT); + + return self; +} + VALUE rb_str_new(const char *ptr, long len) { - return str_new(rb_cString, ptr, len); + VALUE str; + VALUE argv[1]; + + str = str_new(rb_cString, ptr, len); + + if (FL_TEST(rb_cString, FL_CALL_INIT)) { + argv[0] = (VALUE)str; + rb_obj_call_init((VALUE)str, 1, argv); + } + + return str; } VALUE @@ -5117,9 +5145,6 @@ tr_trans(VALUE str, VALUE src, VALUE repl, int sflag) CHECK_IF_ASCII(c); t += tlen; } - if (!STR_EMBED_P(str)) { - xfree(RSTRING(str)->as.heap.ptr); - } *t = '\0'; RSTRING(str)->as.heap.ptr = buf; RSTRING(str)->as.heap.len = t - buf; @@ -7724,6 +7749,10 @@ Init_String(void) rb_cString = rb_define_class("String", rb_cObject); rb_include_module(rb_cString, rb_mComparable); rb_define_alloc_func(rb_cString, str_alloc); + + rb_define_singleton_method(rb_cString, "call_initialize", rb_str_call_initialize_get, 0); + rb_define_singleton_method(rb_cString, "call_initialize=", rb_str_call_initialize_set, 1); + rb_define_singleton_method(rb_cString, "try_convert", rb_str_s_try_convert, 1); rb_define_method(rb_cString, "initialize", rb_str_init, -1); rb_define_method(rb_cString, "initialize_copy", rb_str_replace, 1);