summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorskandhas <[email protected]>2012-12-23 15:25:24 +0800
committerskandhas <[email protected]>2012-12-23 15:25:24 +0800
commit9599381ae334ac474d40dc617407d2b05f17a328 (patch)
treeda31ab5cab545d66711ae13367e6f779cb79b17d
parentb42d17adb3d4a8481b3399b5e2ce2a8b783f9aea (diff)
downloadmruby-9599381ae334ac474d40dc617407d2b05f17a328.tar.gz
mruby-9599381ae334ac474d40dc617407d2b05f17a328.zip
add mrb_mod_cv_defined and mrb_cv_defined
-rw-r--r--include/mruby/variable.h2
-rw-r--r--src/variable.c20
2 files changed, 22 insertions, 0 deletions
diff --git a/include/mruby/variable.h b/include/mruby/variable.h
index 9f4a62317..f2f22e65a 100644
--- a/include/mruby/variable.h
+++ b/include/mruby/variable.h
@@ -59,6 +59,8 @@ mrb_value mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym);
mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym);
void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v);
void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v);
+int mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym);
+int mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym);
/* GC functions */
void mrb_gc_mark_gv(mrb_state*);
diff --git a/src/variable.c b/src/variable.c
index 71187af5f..5d46ffc60 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -730,6 +730,26 @@ mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
mrb_mod_cv_set(mrb, mrb_class_ptr(mod), sym, v);
}
+int
+mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym)
+{
+ while (c) {
+ if (c->iv) {
+ iv_tbl *t = c->iv;
+ if (iv_get(mrb, t, sym, NULL)) return TRUE;
+ }
+ c = c->super;
+ }
+
+ return FALSE;
+}
+
+int
+mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+ return mrb_mod_cv_defined(mrb, mrb_class_ptr(mod), sym);
+}
+
mrb_value
mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym)
{