diff --git a/string.c b/string.c index 5e1769a792..bc625008ef 100644 --- a/string.c +++ b/string.c @@ -800,7 +800,7 @@ rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc) } static VALUE -str_new_static(VALUE klass, const char *ptr, long len, int encindex) +str_new_with_buf(VALUE klass, const char *ptr, long len, int encindex) { VALUE str; @@ -819,12 +819,23 @@ str_new_static(VALUE klass, const char *ptr, long len, int encindex) RSTRING(str)->as.heap.ptr = (char *)ptr; RSTRING(str)->as.heap.aux.capa = len; STR_SET_NOEMBED(str); - RBASIC(str)->flags |= STR_NOFREE; } rb_enc_associate_index(str, encindex); return str; } +static VALUE +str_new_static(VALUE klass, const char *ptr, long len, int encindex) +{ + VALUE str = str_new_with_buf(klass, ptr, len, encindex); + + if (ptr) { + RBASIC(str)->flags |= STR_NOFREE; + } + + return str; +} + VALUE rb_str_new_static(const char *ptr, long len) { @@ -850,6 +861,30 @@ rb_enc_str_new_static(const char *ptr, long len, rb_encoding *enc) } VALUE +rb_str_new_with_buf(const char *ptr, long len) +{ + return str_new_with_buf(rb_cString, ptr, len, 0); +} + +VALUE +rb_usascii_str_new_with_buf(const char *ptr, long len) +{ + return str_new_with_buf(rb_cString, ptr, len, ENCINDEX_US_ASCII); +} + +VALUE +rb_utf8_str_new_with_buf(const char *ptr, long len) +{ + return str_new_with_buf(rb_cString, ptr, len, ENCINDEX_UTF_8); +} + +VALUE +rb_enc_str_new_with_buf(const char *ptr, long len, rb_encoding *enc) +{ + return str_new_with_buf(rb_cString, ptr, len, rb_enc_to_index(enc)); +} + +VALUE rb_tainted_str_new(const char *ptr, long len) { VALUE str = rb_str_new(ptr, len);