summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorksss <[email protected]>2016-12-24 22:54:52 +0900
committerksss <[email protected]>2016-12-25 16:52:10 +0900
commit5c1c002ac2983fef8ef3254e2d2f3e016918c3cd (patch)
tree12b5d11aa44107886a21071e4d45a543410cf758
parent000a3119ca152db12c6e36501b65e27a8be9a53e (diff)
downloadmruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.tar.gz
mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.zip
Fix segv when primitive value
Fix #3352
-rw-r--r--src/kernel.c18
-rw-r--r--test/t/kernel.rb3
2 files changed, 18 insertions, 3 deletions
diff --git a/src/kernel.c b/src/kernel.c
index a5166deb2..5e44d73b4 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -453,9 +453,23 @@ mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_obj_freeze(mrb_state *mrb, mrb_value self)
{
- struct RBasic *b = mrb_basic_ptr(self);
+ struct RBasic *b;
+
+ switch (mrb_type(self)) {
+ case MRB_TT_FALSE:
+ case MRB_TT_TRUE:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_SYMBOL:
+ case MRB_TT_FLOAT:
+ return self;
+ default:
+ break;
+ }
- MRB_SET_FROZEN_FLAG(b);
+ b = mrb_basic_ptr(self);
+ if (!MRB_FROZEN_P(b)) {
+ MRB_SET_FROZEN_FLAG(b);
+ }
return self;
}
diff --git a/test/t/kernel.rb b/test/t/kernel.rb
index 42abed9df..ca4b73907 100644
--- a/test/t/kernel.rb
+++ b/test/t/kernel.rb
@@ -260,6 +260,8 @@ end
assert('Kernel#freeze') do
obj = Object.new
assert_equal obj, obj.freeze
+ assert_equal 0, 0.freeze
+ assert_equal :a, :a.freeze
end
assert('Kernel#global_variables', '15.3.1.3.14') do
@@ -620,4 +622,3 @@ assert('stack extend') do
assert_equal 6, recurse(0, 5)
end
-