diff options
| author | ksss <[email protected]> | 2016-12-24 22:54:52 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2016-12-25 16:52:10 +0900 |
| commit | 5c1c002ac2983fef8ef3254e2d2f3e016918c3cd (patch) | |
| tree | 12b5d11aa44107886a21071e4d45a543410cf758 /src/kernel.c | |
| parent | 000a3119ca152db12c6e36501b65e27a8be9a53e (diff) | |
| download | mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.tar.gz mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.zip | |
Fix segv when primitive value
Fix #3352
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 18 |
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; } |
