summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-10-04 16:02:50 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-10-04 16:02:50 +0900
commit1f5a7f2f4970144164232a2bc45f561de5d65c33 (patch)
tree4741dd494776ba84926d982d16a4322684fa0368 /src
parent08eafe21d305e17c41b0221cae22dc1e90bee9cf (diff)
downloadmruby-1f5a7f2f4970144164232a2bc45f561de5d65c33.tar.gz
mruby-1f5a7f2f4970144164232a2bc45f561de5d65c33.zip
Freeze strings from `nil.to_s`, `true.to_s`, `false.to_s`.
This is an experimental changes in Ruby 2.7.
Diffstat (limited to 'src')
-rw-r--r--src/kernel.c2
-rw-r--r--src/object.c8
-rw-r--r--src/string.c7
3 files changed, 12 insertions, 5 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 4287b6cf2..c88a457f0 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -431,7 +431,7 @@ mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
return mrb_obj_extend(mrb, argc, argv, self);
}
-static mrb_value
+MRB_API mrb_value
mrb_obj_freeze(mrb_state *mrb, mrb_value self)
{
if (!mrb_immediate_p(self)) {
diff --git a/src/object.c b/src/object.c
index 0b83c97a3..4e2ba7154 100644
--- a/src/object.c
+++ b/src/object.c
@@ -83,13 +83,13 @@ mrb_true(mrb_state *mrb, mrb_value obj)
static mrb_value
nil_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new(mrb, 0, 0);
+ return mrb_str_new_frozen(mrb, 0, 0);
}
static mrb_value
nil_inspect(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit(mrb, "nil");
+ return mrb_str_new_lit_frozen(mrb, "nil");
}
/***********************************************************************
@@ -150,7 +150,7 @@ true_xor(mrb_state *mrb, mrb_value obj)
static mrb_value
true_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit(mrb, "true");
+ return mrb_str_new_lit_frozen(mrb, "true");
}
/* 15.2.5.3.4 */
@@ -257,7 +257,7 @@ false_or(mrb_state *mrb, mrb_value obj)
static mrb_value
false_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit(mrb, "false");
+ return mrb_str_new_lit_frozen(mrb, "false");
}
void
diff --git a/src/string.c b/src/string.c
index 1428ea780..328366e10 100644
--- a/src/string.c
+++ b/src/string.c
@@ -235,6 +235,13 @@ mrb_str_new_static(mrb_state *mrb, const char *p, size_t len)
return mrb_obj_value(s);
}
+MRB_API mrb_value
+mrb_str_freeze(mrb_state *mrb, const char *p, size_t len)
+{
+ struct RString *s = str_new_static(mrb, p, len);
+ return mrb_obj_value(s);
+}
+
static void
str_decref(mrb_state *mrb, mrb_shared_string *shared)
{