diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-01 14:09:26 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-01 14:11:15 +0900 |
| commit | dcbfe7162586eb46e583cb140f4f6cde7ae2b87a (patch) | |
| tree | b41f687a8be0bd2ea8a96eaf66c1f3d37c68a25e /mrbgems/mruby-compiler | |
| parent | e22f37a1669a6c14ce8fe99c868d553917fbfa19 (diff) | |
| download | mruby-dcbfe7162586eb46e583cb140f4f6cde7ae2b87a.tar.gz mruby-dcbfe7162586eb46e583cb140f4f6cde7ae2b87a.zip | |
NODE_ASGN arguments may be 127 (CALL_MAXARGS) accidentally; fix #3559
Diffstat (limited to 'mrbgems/mruby-compiler')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 282ed62ec..234a3a1ec 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -792,7 +792,7 @@ attrsym(codegen_scope *s, mrb_sym a) #define CALL_MAXARGS 127 static int -gen_values(codegen_scope *s, node *t, int val) +gen_values(codegen_scope *s, node *t, int val, int extra) { int n = 0; int is_splat; @@ -800,7 +800,7 @@ gen_values(codegen_scope *s, node *t, int val) while (t) { is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */ if ( - n >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */ + n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */ || is_splat) { if (val) { if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) { @@ -872,7 +872,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe) idx = new_msym(s, sym); tree = tree->cdr->cdr->car; if (tree) { - n = gen_values(s, tree->car, VAL); + n = gen_values(s, tree->car, VAL, sp?1:0); if (n < 0) { n = noop = sendv = 1; push(); @@ -1632,7 +1632,7 @@ codegen(codegen_scope *s, node *tree, int val) { int n; - n = gen_values(s, tree, val); + n = gen_values(s, tree, val, 0); if (n >= 0) { if (val) { pop_n(n); @@ -1806,7 +1806,7 @@ codegen(codegen_scope *s, node *tree, int val) idx = new_msym(s, sym(n->cdr->car)); if (n->cdr->cdr->car) { int base = cursp()-1; - int nargs = gen_values(s, n->cdr->cdr->car->car, VAL); + int nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1); /* copy receiver and arguments */ if (nargs >= 0) { @@ -1943,7 +1943,7 @@ codegen(codegen_scope *s, node *tree, int val) if (tree) { node *args = tree->car; if (args) { - n = gen_values(s, args, VAL); + n = gen_values(s, args, VAL, 0); if (n < 0) { n = noop = sendv = 1; push(); @@ -2020,7 +2020,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf))); push(); if (tree) { - n = gen_values(s, tree, VAL); + n = gen_values(s, tree, VAL, 0); if (n < 0) { n = sendv = 1; push(); |
