From 1cc44cfd78e00879e983ffa320e16a2d99558067 Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 9 Nov 2012 23:00:24 +0800 Subject: add Module#class_variables --- src/variable.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index b3b3b3d87..19853685c 100644 --- a/src/variable.c +++ b/src/variable.c @@ -615,6 +615,50 @@ mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) return ary; } +static int +cv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p) +{ + mrb_value ary; + const char* s; + int len; + + ary = *(mrb_value*)p; + s = mrb_sym2name_len(mrb, sym, &len); + if (len > 2 && s[0] == '@' && s[1] == '@') { + mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); + } + return 0; +} + +/* 15.2.2.4.19 */ +/* + * call-seq: + * mod.class_variables -> array + * + * Returns an array of the names of class variables in mod. + * + * class One + * @@var1 = 1 + * end + * class Two < One + * @@var2 = 2 + * end + * One.class_variables #=> [:@@var1] + * Two.class_variables #=> [:@@var2] + */ +mrb_value +mrb_mod_class_variables(mrb_state *mrb, mrb_value mod) +{ + mrb_value ary; + + ary = mrb_ary_new(mrb); + if (obj_iv_p(mod) && mrb_obj_ptr(mod)->iv) { + iv_foreach(mrb, mrb_obj_ptr(mod)->iv, cv_i, &ary); + } + return ary; +} + + mrb_value mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) { -- cgit v1.2.3 From 1993f934f2c2fd7baa88ca45dc9a0c74743a3920 Mon Sep 17 00:00:00 2001 From: Yukihiro Matz Matsumoto Date: Wed, 14 Nov 2012 17:17:37 +0900 Subject: out of bound access in iv seglist --- src/variable.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index 19853685c..7d583da40 100644 --- a/src/variable.c +++ b/src/variable.c @@ -71,13 +71,13 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) t->size++; return; } - if (key == 0 && !matched_seg) { + if (!matched_seg && key == 0) { matched_seg = seg; matched_idx = i; } else if (key == sym) { - seg->val[i] = val; - return; + seg->val[i] = val; + return; } } prev = seg; @@ -223,10 +223,10 @@ iv_copy(mrb_state *mrb, iv_tbl *t) mrb_sym key = seg->key[i]; mrb_value val = seg->val[i]; - iv_put(mrb, t2, key, val); if ((seg->next == NULL) && (i >= t->last_len)) { return t2; } + iv_put(mrb, t2, key, val); } seg = seg->next; } -- cgit v1.2.3