From d06512b093ebbbedb9affad263f4fd2e369166d0 Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 21 Dec 2012 15:09:40 +0800 Subject: [PATCH] add mrb_mod_cvar_set --- src/class.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/class.c b/src/class.c index 19a697bc8a..8d14319f25 100644 --- a/src/class.c +++ b/src/class.c @@ -1483,6 +1483,38 @@ mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod) return mrb_cv_get(mrb, mod, id); } +/* 15.2.2.4.18 */ +/* + * call-seq: + * obj.class_variable_set(symbol, obj) -> obj + * + * Sets the class variable names by symbol to + * object. + * + * class Fred + * @@foo = 99 + * def foo + * @@foo + * end + * end + * Fred.class_variable_set(:@@foo, 101) #=> 101 + * Fred.new.foo #=> 101 + */ + +static mrb_value +mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod) +{ + mrb_value sym, value; + mrb_sym id; + mrb_get_args(mrb, "oo", &sym, &value); + + id = mrb_sym_value(mrb,sym); + + check_cv_name(mrb, id); + mrb_cv_set(mrb, mod, id, value); + return value; +} + static void check_const_name(mrb_state *mrb, mrb_sym id) { @@ -1585,6 +1617,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, ARGS_REQ(1)); /* 15.2.2.4.17 */ + mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, ARGS_REQ(2)); /* 15.2.2.4.18 */ mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */ mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */ mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */