From 824bacbee4beea7755e815a4aa733cb05f95268b Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 21 Dec 2012 14:22:35 +0800 Subject: add mrb_mod_cv_set, mrb_cv_set --- include/mruby/variable.h | 2 ++ src/variable.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 8754e8a90..9f4a62317 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -57,6 +57,8 @@ mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer); mrb_value mrb_mod_class_variables(mrb_state*, mrb_value); 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); /* GC functions */ void mrb_gc_mark_gv(mrb_state*); diff --git a/src/variable.c b/src/variable.c index 147373bd4..57a193109 100644 --- a/src/variable.c +++ b/src/variable.c @@ -695,6 +695,34 @@ mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym) return mrb_mod_cv_get(mrb, mrb_class_ptr(mod), sym); } +void +mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v) +{ + while (c) { + if (c->iv) { + iv_tbl *t = c->iv; + + if (iv_get(mrb, t, sym, NULL)) { + iv_put(mrb, t, sym, v); + return; + } + } + c = c->super; + } + + if (!c->iv) { + c->iv = iv_new(mrb); + } + + iv_put(mrb, c->iv, sym, v); +} + +void +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); +} + mrb_value mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) { -- cgit v1.2.3