From 4122cee9e44d6f206d935065eb68cea8b9dacffe Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 13 Feb 2025 19:06:06 +0900 Subject: [PATCH] class.c: implement attr_accessor in C --- mrblib/00class.rb | 11 ----------- src/class.c | 10 +++++++++- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/mrblib/00class.rb b/mrblib/00class.rb index 5bef3f126..d98947258 100644 --- a/mrblib/00class.rb +++ b/mrblib/00class.rb @@ -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! diff --git a/src/class.c b/src/class.c index 86854e981..45e6b4957 100644 --- a/src/class.c +++ b/src/class.c @@ -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());