class.c: implement attr_accessor in C

This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-02-13 19:06:06 +09:00
parent 27828de749
commit 4122cee9e4
2 changed files with 9 additions and 12 deletions
-11
View File
@@ -9,17 +9,6 @@ class BasicObject
end
class Module
# 15.2.2.4.12
def attr_accessor(*names)
attr_reader(*names)
attr_writer(*names)
end
# 15.2.2.4.11
alias attr attr_reader
#def attr(name)
# attr_reader(name)
#end
# 15.2.2.4.27
def include(*args)
args.reverse!
+9 -1
View File
@@ -1918,7 +1918,7 @@ prepare_writer_name(mrb_state *mrb, mrb_sym sym)
}
static mrb_value
mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state *, mrb_value), mrb_sym (*access_name)(mrb_state *, mrb_sym))
mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state*, mrb_value), mrb_sym (*access_name)(mrb_state*, mrb_sym))
{
struct RClass *c = mrb_class_ptr(mod);
const mrb_value *argv;
@@ -1976,6 +1976,13 @@ mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
return mod_attr_define(mrb, mod, attr_writer, prepare_writer_name);
}
static mrb_value
mrb_mod_attr_accessor(mrb_state *mrb, mrb_value mod)
{
mrb_mod_attr_reader(mrb, mod);
return mrb_mod_attr_writer(mrb, mod);
}
static mrb_value
mrb_instance_alloc(mrb_state *mrb, mrb_value cv)
{
@@ -3094,6 +3101,7 @@ mrb_init_class(mrb_state *mrb)
mrb_define_private_method_id(mrb, mod, MRB_SYM(private), mrb_mod_private, MRB_ARGS_ANY()); /* 15.2.2.4.36 */
mrb_define_private_method_id(mrb, mod, MRB_SYM(protected), mrb_mod_protected, MRB_ARGS_ANY()); /* 15.2.2.4.37 */
mrb_define_private_method_id(mrb, mod, MRB_SYM(public), mrb_mod_public, MRB_ARGS_ANY()); /* 15.2.2.4.38 */
mrb_define_method_id(mrb, mod, MRB_SYM(attr_accessor), mrb_mod_attr_accessor, MRB_ARGS_ANY()); /* 15.2.2.4.12 */
mrb_define_method_id(mrb, mod, MRB_SYM(attr_reader), mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */
mrb_define_method_id(mrb, mod, MRB_SYM(attr_writer), mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */
mrb_define_method_id(mrb, mod, MRB_SYM(to_s), mrb_mod_to_s, MRB_ARGS_NONE());