summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-21 11:04:36 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-21 11:04:36 +0900
commit396397bce17a0f03eab8ed6512651e665aa89c8a (patch)
treed45f8e9ea6bcff1146740aa23db410cfc16a708c /src/variable.c
parent8b8151a60e53e3182382acca8b128c6d1d7f0b4f (diff)
downloadmruby-396397bce17a0f03eab8ed6512651e665aa89c8a.tar.gz
mruby-396397bce17a0f03eab8ed6512651e665aa89c8a.zip
move KHASH_DECLARE to header files
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/variable.c b/src/variable.c
index d89e9d6bb..051c971d6 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -94,10 +94,28 @@ mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
return ivget(mrb, obj->iv, sym);
}
+static int
+obj_iv_p(mrb_value obj)
+{
+ switch (mrb_type(obj)) {
+ case MRB_TT_OBJECT:
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_HASH:
+ case MRB_TT_DATA:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
mrb_value
mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym)
{
- return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym);
+ if (obj_iv_p(obj)) {
+ return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym);
+ }
+ return mrb_nil_value();
}
static void
@@ -127,7 +145,30 @@ mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
void
mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v) /* mrb_ivar_set */
{
- mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v);
+ if (obj_iv_p(obj)) {
+ mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v);
+ }
+}
+
+mrb_value
+mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+ mrb_value val;
+
+ if (obj_iv_p(obj)) {
+ khash_t(iv) *h = mrb_obj_ptr(obj)->iv;
+ khiter_t k;
+
+ if (h) {
+ k = kh_get(iv, h, sym);
+ if (k != kh_end(h)) {
+ val = kh_value(h, k);
+ kh_del(iv, h, k);
+ return val;
+ }
+ }
+ }
+ return mrb_undef_value();
}
mrb_value
@@ -366,7 +407,7 @@ mrb_st_lookup(struct kh_iv *table, mrb_sym id, khiter_t *value)
}
}
-int
+static int
kiv_lookup(khash_t(iv)* table, mrb_sym key, mrb_value *value)
{
khash_t(iv) *h=table;