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 | |
| parent | 000a3119ca152db12c6e36501b65e27a8be9a53e (diff) | |
| download | mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.tar.gz mruby-5c1c002ac2983fef8ef3254e2d2f3e016918c3cd.zip | |
Fix segv when primitive value
Fix #3352
| -rw-r--r-- | src/kernel.c | 18 | ||||
| -rw-r--r-- | test/t/kernel.rb | 3 |
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 - |
