summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordearblue <[email protected]>2020-10-22 23:22:29 +0900
committerdearblue <[email protected]>2020-10-22 23:22:29 +0900
commitedc49f9d2624fa39780ae917053e2bc12fdf1875 (patch)
tree5c6a382477e85a2e6010f5aafc80802d88ae9693
parent27492e53a0440aee7c411d5e72b6f092cf85d6a1 (diff)
downloadmruby-edc49f9d2624fa39780ae917053e2bc12fdf1875.tar.gz
mruby-edc49f9d2624fa39780ae917053e2bc12fdf1875.zip
Prohibit array changes by `mrb_get_argv()`
The `mrb_get_argv()` function will now return `const mrb_value *`. This is because it is difficult for the caller to check if it is a splat argument (array object) and to write-barrier if necessary.
-rw-r--r--include/mruby.h2
-rw-r--r--src/array.c4
-rw-r--r--src/class.c2
3 files changed, 4 insertions, 4 deletions
diff --git a/include/mruby.h b/include/mruby.h
index 52bcd58bf..c463a47db 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -991,7 +991,7 @@ MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
*
* Correctly handles *splat arguments.
*/
-MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
+MRB_API const mrb_value *mrb_get_argv(mrb_state *mrb);
/**
* Retrieve the first and only argument from mrb_state.
diff --git a/src/array.c b/src/array.c
index c4bc554ef..e1e97a1d8 100644
--- a/src/array.c
+++ b/src/array.c
@@ -509,7 +509,7 @@ static mrb_value
mrb_ary_push_m(mrb_state *mrb, mrb_value self)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int len, len2;
struct RArray *a;
@@ -947,7 +947,7 @@ mrb_ary_aset(mrb_state *mrb, mrb_value self)
ary_modify(mrb, mrb_ary_ptr(self));
if (mrb_get_argc(mrb) == 2) {
- mrb_value *vs = mrb_get_argv(mrb);
+ const mrb_value *vs = mrb_get_argv(mrb);
v1 = vs[0]; v2 = vs[1];
/* a[n..m] = v */
diff --git a/src/class.c b/src/class.c
index bbf64e8ea..eb472900c 100644
--- a/src/class.c
+++ b/src/class.c
@@ -806,7 +806,7 @@ mrb_get_argc(mrb_state *mrb)
return argc;
}
-MRB_API mrb_value*
+MRB_API const mrb_value*
mrb_get_argv(mrb_state *mrb)
{
mrb_int argc = mrb->c->ci->argc;