summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-05-31 16:14:46 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-05-31 16:14:46 -0700
commit024f211f10ebb22024f430f7a794fc6ea14d3aec (patch)
treed60c9da1ae4911b511a699a7ad6298e2153324f9
parentfae483ff2a91e806e714cb7d118c7bfb8aadbeb2 (diff)
parentb174e9c3ea5f572939cbd2f85be569af626db654 (diff)
downloadmruby-024f211f10ebb22024f430f7a794fc6ea14d3aec.tar.gz
mruby-024f211f10ebb22024f430f7a794fc6ea14d3aec.zip
Merge pull request #210 from MobiRuby/module_const
Add Module.const_defined? && _get && _set methods
-rw-r--r--src/class.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/class.c b/src/class.c
index f96922f4b..d56f61532 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1140,6 +1140,48 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod)
return mrb_nil_value();
}
+static mrb_sym
+mrb_sym_value(mrb_state *mrb, mrb_value val)
+{
+ if(val.tt == MRB_TT_STRING) {
+ return mrb_intern(mrb, RSTRING_PTR(val));
+ }
+ else if(val.tt != MRB_TT_SYMBOL) {
+ mrb_value obj = mrb_funcall(mrb, val, "inspect", 0);
+ mrb_raise(mrb, E_TYPE_ERROR, "%s is not a symbol",
+ mrb_string_value_ptr(mrb, obj));
+ }
+ return mrb_symbol(val);
+}
+
+mrb_value
+mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value sym;
+ mrb_get_args(mrb, "o", &sym);
+ if(mrb_const_defined(mrb, mod, mrb_sym_value(mrb, sym))) {
+ return mrb_true_value();
+ }
+ return mrb_false_value();
+}
+
+mrb_value
+mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value sym;
+ mrb_get_args(mrb, "o", &sym);
+ return mrb_const_get(mrb, mod, mrb_sym_value(mrb, sym));
+}
+
+mrb_value
+mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value sym, value;
+ mrb_get_args(mrb, "oo", &sym, &value);
+ mrb_const_set(mrb, mod, mrb_sym_value(mrb, sym), value);
+ return value;
+}
+
static mrb_value
mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
@@ -1197,6 +1239,9 @@ mrb_init_class(mrb_state *mrb)
mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE());
mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY());
mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY());
+ mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1));
+ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1));
+ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2));
mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1));
}