aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--internal.h1
-rw-r--r--string.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/internal.h b/internal.h
index 6409da3d1a..1546b219e8 100644
--- a/internal.h
+++ b/internal.h
@@ -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);
diff --git a/string.c b/string.c
index 80190548be..b802d9d09b 100644
--- a/string.c
+++ b/string.c
@@ -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)
{