From f0a64329b1cb8156e0d525d003e5d6ff03b7832f Mon Sep 17 00:00:00 2001 From: dearblue Date: Thu, 22 Oct 2020 22:55:35 +0900 Subject: Prohibit array changes by "a"/"*" specifier of `mrb_get_args()` The "a"/"*" specifier of the `mrb_get_args()` function will now return `const mrb_value *`. This is because it is difficult for the caller to check if it is an array object and write-barrier if necessary. And it requires calling `mrb_ary_modify()` on the unmodified array object, which is also difficult (this is similar to #5087). --- mrbgems/mruby-method/src/method.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'mrbgems/mruby-method/src') diff --git a/mrbgems/mruby-method/src/method.c b/mrbgems/mruby-method/src/method.c index c6de6a7bd..0a2897847 100644 --- a/mrbgems/mruby-method/src/method.c +++ b/mrbgems/mruby-method/src/method.c @@ -109,7 +109,7 @@ method_eql(mrb_state *mrb, mrb_value self) static mrb_value mcall(mrb_state *mrb, mrb_value recv, mrb_value proc, mrb_value name, struct RClass *owner, - mrb_int argc, mrb_value *argv, mrb_value block) + mrb_int argc, const mrb_value *argv, mrb_value block) { mrb_value ret; mrb_sym orig_mid = mrb->c->ci->mid; @@ -142,7 +142,8 @@ method_call(mrb_state *mrb, mrb_value self) mrb_value recv = mrb_iv_get(mrb, self, MRB_SYM(_recv)); struct RClass *owner = mrb_class_ptr(mrb_iv_get(mrb, self, MRB_SYM(_owner))); mrb_int argc; - mrb_value *argv, block; + const mrb_value *argv; + mrb_value block; mrb_get_args(mrb, "*&", &argv, &argc, &block); return mcall(mrb, recv, proc, name, owner, argc, argv, block); @@ -156,7 +157,8 @@ method_bcall(mrb_state *mrb, mrb_value self) mrb_value recv = mrb_iv_get(mrb, self, MRB_SYM(_recv)); mrb_value owner = mrb_iv_get(mrb, self, MRB_SYM(_owner)); mrb_int argc; - mrb_value *argv, block; + const mrb_value *argv; + mrb_value block; mrb_get_args(mrb, "o*&", &recv, &argv, &argc, &block); bind_check(mrb, recv, owner); -- cgit v1.2.3