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). --- include/mruby.h | 4 ++-- mrbgems/mruby-array-ext/src/array.c | 2 +- mrbgems/mruby-eval/src/eval.c | 2 +- mrbgems/mruby-fiber/src/fiber.c | 6 +++--- mrbgems/mruby-hash-ext/src/hash-ext.c | 6 ++++-- mrbgems/mruby-io/src/file.c | 4 ++-- mrbgems/mruby-io/src/io.c | 2 +- mrbgems/mruby-metaprog/src/metaprog.c | 2 +- mrbgems/mruby-method/src/method.c | 8 +++++--- mrbgems/mruby-print/src/print.c | 4 ++-- mrbgems/mruby-proc-ext/test/proc.c | 2 +- mrbgems/mruby-sprintf/src/sprintf.c | 2 +- mrbgems/mruby-string-ext/src/string.c | 6 ++++-- mrbgems/mruby-struct/src/struct.c | 10 +++++----- mrbgems/mruby-test/driver.c | 2 +- src/array.c | 9 +++++---- src/class.c | 20 ++++++++++---------- src/kernel.c | 6 +++--- src/vm.c | 3 ++- 19 files changed, 54 insertions(+), 46 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 52bcd58bf..8ea59477b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -889,7 +889,7 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass * | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` | * | `s` | {String} | const char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` | * | `z` | {String} | const char * | `NULL` terminated string; `z!` gives `NULL` for `nil` | - * | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` | + * | `a` | {Array} | const {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` | * | `f` | {Integer}/{Float} | {mrb_float} | | * | `i` | {Integer}/{Float} | {mrb_int} | | * | `b` | boolean | {mrb_bool} | | @@ -897,7 +897,7 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass * | `d` | data | void *, {mrb_data_type} const | 2nd argument will be used to check data type so it won't be modified; when `!` follows, the value may be `nil` | * | `I` | inline struct | void * | | * | `&` | block | {mrb_value} | &! raises exception if no block given. | - * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. | + * | `*` | rest arguments | const {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. | * | \| | optional | | After this spec following specs would be optional. | * | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. | * | `:` | keyword args | {mrb_kwargs} const | Get keyword arguments. @see mrb_kwargs | diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index 9d7f1b28a..f6695f6b6 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -97,7 +97,7 @@ static mrb_value mrb_ary_values_at(mrb_state *mrb, mrb_value self) { mrb_int argc; - mrb_value *argv; + const mrb_value *argv; mrb_get_args(mrb, "*", &argv, &argc); diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 34a438060..61b33f6e1 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -149,7 +149,7 @@ static mrb_value f_instance_eval(mrb_state *mrb, mrb_value self) { mrb_value b; - mrb_int argc; mrb_value *argv; + mrb_int argc; const mrb_value *argv; mrb_get_args(mrb, "*!&", &argv, &argc, &b); diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index 00ee7c223..41fda9eed 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -255,7 +255,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr static mrb_value fiber_resume(mrb_state *mrb, mrb_value self) { - mrb_value *a; + const mrb_value *a; mrb_int len; mrb_bool vmexec = FALSE; @@ -315,7 +315,7 @@ static mrb_value fiber_transfer(mrb_state *mrb, mrb_value self) { struct mrb_context *c = fiber_check(mrb, self); - mrb_value* a; + const mrb_value* a; mrb_int len; fiber_check_cfunc(mrb, mrb->c); @@ -374,7 +374,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a) static mrb_value fiber_yield(mrb_state *mrb, mrb_value self) { - mrb_value *a; + const mrb_value *a; mrb_int len; mrb_get_args(mrb, "*!", &a, &len); diff --git a/mrbgems/mruby-hash-ext/src/hash-ext.c b/mrbgems/mruby-hash-ext/src/hash-ext.c index 75ebd412b..16e066c73 100644 --- a/mrbgems/mruby-hash-ext/src/hash-ext.c +++ b/mrbgems/mruby-hash-ext/src/hash-ext.c @@ -22,7 +22,8 @@ static mrb_value hash_values_at(mrb_state *mrb, mrb_value hash) { - mrb_value *argv, result; + const mrb_value *argv; + mrb_value result; mrb_int argc, i; int ai; @@ -49,7 +50,8 @@ hash_values_at(mrb_state *mrb, mrb_value hash) static mrb_value hash_slice(mrb_state *mrb, mrb_value hash) { - mrb_value *argv, result; + const mrb_value *argv; + mrb_value result; mrb_int argc, i; mrb_get_args(mrb, "*", &argv, &argc); diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index d272cab7d..ab325195c 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -115,7 +115,7 @@ mrb_file_s_umask(mrb_state *mrb, mrb_value klass) static mrb_value mrb_file_s_unlink(mrb_state *mrb, mrb_value obj) { - mrb_value *argv; + const mrb_value *argv; mrb_value pathv; mrb_int argc, i; char *path; @@ -533,7 +533,7 @@ static mrb_value mrb_file_s_chmod(mrb_state *mrb, mrb_value klass) { mrb_int mode; mrb_int argc, i; - mrb_value *filenames; + const mrb_value *filenames; int ai = mrb_gc_arena_save(mrb); mrb_get_args(mrb, "i*", &mode, &filenames, &argc); diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 0fa0f34b1..d4505e4f7 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1154,7 +1154,7 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass) static mrb_value mrb_io_s_select(mrb_state *mrb, mrb_value klass) { - mrb_value *argv; + const mrb_value *argv; mrb_int argc; mrb_value read, read_io, write, except, timeout, list; struct timeval *tp, timerec; diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index b421226f9..f9c01ea1c 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -642,7 +642,7 @@ static mrb_value mrb_mod_remove_method(mrb_state *mrb, mrb_value mod) { mrb_int argc; - mrb_value *argv; + const mrb_value *argv; struct RClass *c = mrb_class_ptr(mod); mrb_get_args(mrb, "*", &argv, &argc); 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); diff --git a/mrbgems/mruby-print/src/print.c b/mrbgems/mruby-print/src/print.c index 6e91e1941..30b2930b5 100644 --- a/mrbgems/mruby-print/src/print.c +++ b/mrbgems/mruby-print/src/print.c @@ -53,7 +53,7 @@ static mrb_value mrb_print(mrb_state *mrb, mrb_value self) { mrb_int argc, i; - mrb_value *argv; + const mrb_value *argv; mrb_get_args(mrb, "*", &argv, &argc); for (i=0; i i) { *pl = argc-i; @@ -1754,7 +1754,7 @@ 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)) { struct RClass *c = mrb_class_ptr(mod); - mrb_value *argv; + const mrb_value *argv; mrb_int argc, i; int ai; @@ -1843,7 +1843,7 @@ mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv) { mrb_value obj, blk; - mrb_value *argv; + const mrb_value *argv; mrb_int argc; mrb_sym init; @@ -2248,7 +2248,7 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod) { struct RClass *c = mrb_class_ptr(mod); mrb_int argc; - mrb_value *argv; + const mrb_value *argv; mrb_get_args(mrb, "*", &argv, &argc); while (argc--) { @@ -2468,7 +2468,7 @@ mrb_mod_dup(mrb_state *mrb, mrb_value self) static mrb_value mrb_mod_module_function(mrb_state *mrb, mrb_value mod) { - mrb_value *argv; + const mrb_value *argv; mrb_int argc, i; mrb_sym mid; mrb_method_t m; diff --git a/src/kernel.c b/src/kernel.c index c34d0bb6e..e29c33874 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -219,7 +219,7 @@ mrb_obj_class_m(mrb_state *mrb, mrb_value self) } static mrb_value -mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj) +mrb_obj_extend(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value obj) { mrb_int i; @@ -264,7 +264,7 @@ mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj) static mrb_value mrb_obj_extend_m(mrb_state *mrb, mrb_value self) { - mrb_value *argv; + const mrb_value *argv; mrb_int argc; mrb_get_args(mrb, "*", &argv, &argc); @@ -524,7 +524,7 @@ static mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod) { mrb_sym name; - mrb_value *a; + const mrb_value *a; mrb_int alen; mrb_get_args(mrb, "n*!", &name, &a, &alen); diff --git a/src/vm.c b/src/vm.c index d1f4660be..bcb78c0c9 100644 --- a/src/vm.c +++ b/src/vm.c @@ -552,7 +552,8 @@ mrb_value mrb_f_send(mrb_state *mrb, mrb_value self) { mrb_sym name; - mrb_value block, *argv, *regs; + mrb_value block, *regs; + const mrb_value *argv; mrb_int argc, i, len; mrb_method_t m; struct RClass *c; -- cgit v1.2.3