Object* Module::cvar_set(STATE, Symbol* name, Object* value) { if(!name->is_cvar_p(state)->true_p()) return Primitives::failure(); if(CBOOL(frozen_p(state))) { Exception::type_error(state, "unable to change frozen object"); } Module* mod = this; Module* mod_to_query; while(!mod->nil_p()) { mod_to_query = get_module_to_query(mod); if(mod_to_query->table_ivar_defined(state, name)->true_p()) { mod_to_query->set_table_ivar(state, name, value); return value; } mod = mod->superclass(); } mod = this; mod_to_query = get_module_to_query(mod); mod_to_query->set_ivar(state, name, value); return value; }
Object* Module::cvar_set(STATE, Symbol* name, Object* value) { if(!name->is_cvar_p(state)->true_p()) return Primitives::failure(); if(RTEST(frozen_p(state))) { Exception::type_error(state, "unable to change frozen object"); } Module* mod = this; Module* mod_to_query; while(!mod->nil_p()) { if(MetaClass* mc = try_as<MetaClass>(mod)) { mod_to_query = as<Module>(mc->attached_instance()); } else if(IncludedModule* im = try_as<IncludedModule>(mod)) { mod_to_query = im->module(); } else { mod_to_query = mod; } if(mod_to_query->table_ivar_defined(state, name)->true_p()) { mod_to_query->set_table_ivar(state, name, value); return value; } mod = mod->superclass(); } mod = this; if(MetaClass* mc = try_as<MetaClass>(mod)) { mod_to_query = as<Module>(mc->attached_instance()); } else if(IncludedModule* im = try_as<IncludedModule>(mod)) { mod_to_query = im->module(); } else { mod_to_query = mod; } mod_to_query->set_ivar(state, name, value); return value; }