/* * call-seq: * remove_class_variable(sym) => obj * * Removes the definition of the <i>sym</i>, returning that * constant's value. * * class Dummy * @@var = 99 * puts @@var * remove_class_variable(:@@var) * puts(defined? @@var) * end * * <em>produces:</em> * * 99 * nil */ VALUE rb_mod_remove_cvar(mod, name) VALUE mod, name; { ID id = rb_to_id(name); VALUE val; if (!rb_is_class_id(id)) { rb_name_error(id, "wrong class variable name %s", rb_id2name(id)); } if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't remove class variable"); if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, (st_data_t*)&id, &val)) { return val; } if (rb_cvar_defined(mod, id)) { rb_name_error(id, "cannot remove %s for %s", rb_id2name(id), rb_class2name(mod)); } rb_name_error(id, "class variable %s not defined for %s", rb_id2name(id), rb_class2name(mod)); return Qnil; /* not reached */ }