string.c: rb_fstring_new

* string.c (rb_fstring_new): create fstring from pointer and
  length.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46626 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-06-30 14:59:44 +00:00
parent b105cbc809
commit 58bd5facb2
2 changed files with 22 additions and 0 deletions

View File

@ -899,6 +899,7 @@ size_t rb_strftime(char *s, size_t maxsize, const char *format, rb_encoding *enc
/* string.c */
VALUE rb_fstring(VALUE);
VALUE rb_fstring_new(const char *ptr, long len);
int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
int rb_str_symname_p(VALUE);
VALUE rb_str_quote_unprintable(VALUE);

View File

@ -225,6 +225,27 @@ rb_fstring(VALUE str)
return fstr;
}
static VALUE
setup_fake_str(struct RString *fake_str, const char *name, long len)
{
fake_str->basic.flags = T_STRING|RSTRING_NOEMBED|ELTS_SHARED;
/* SHARED to be allocated by the callback */
RBASIC_SET_CLASS((VALUE)fake_str, rb_cString);
fake_str->as.heap.len = len;
fake_str->as.heap.ptr = (char *)name;
fake_str->as.heap.aux.capa = len;
return (VALUE)fake_str;
}
VALUE
rb_fstring_new(const char *ptr, long len)
{
struct RString fake_str;
return rb_fstring(setup_fake_str(&fake_str, ptr, len));
}
static int
fstring_set_class_i(st_data_t key, st_data_t val, st_data_t arg)
{