summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-01-05 17:49:21 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-01-05 17:49:21 +0900
commit36f5b44578791a12619c189808dbc3cb4758e32a (patch)
treee5e1191de50cae879aa5df0edec415a417d7866d /src/kernel.c
parenta10f85f855a3a20e71be21daef19a673c1791fd3 (diff)
downloadmruby-36f5b44578791a12619c189808dbc3cb4758e32a.tar.gz
mruby-36f5b44578791a12619c189808dbc3cb4758e32a.zip
Add new method Kernel#frozen?; ref #3370
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 5e44d73b4..677c0d519 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -473,6 +473,29 @@ mrb_obj_freeze(mrb_state *mrb, mrb_value self)
return self;
}
+static mrb_value
+mrb_obj_frozen(mrb_state *mrb, mrb_value 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 mrb_true_value();
+ default:
+ break;
+ }
+
+ b = mrb_basic_ptr(self);
+ if (!MRB_FROZEN_P(b)) {
+ return mrb_false_value();
+ }
+ return mrb_true_value();
+}
+
/* 15.3.1.3.15 */
/*
* call-seq:
@@ -1148,6 +1171,7 @@ mrb_init_kernel(mrb_state *mrb)
mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */
mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, MRB_ARGS_ANY()); /* 15.3.1.3.13 */
mrb_define_method(mrb, krn, "freeze", mrb_obj_freeze, MRB_ARGS_NONE());
+ mrb_define_method(mrb, krn, "frozen?", mrb_obj_frozen, MRB_ARGS_NONE());
mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */
mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */
mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */