summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
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 /src/kernel.c
parent000a3119ca152db12c6e36501b65e27a8be9a53e (diff)
downloadmruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.tar.gz
mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.zip
Fix segv when primitive value
Fix #3352
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c18
1 files changed, 16 insertions, 2 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;
}