diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-09 16:42:54 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2016-12-09 16:42:54 +0900 |
| commit | c85feaec56b942ad4049079ed6f2df46f20a577d (patch) | |
| tree | f4aa9c676f8707fff0ff96867d42f4e2ef5d8328 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | db6b6ff4420b6e9a68e90e497131560d1e57c06f (diff) | |
| parent | c8da3c4df4f8cb6f6d00c70e75606c59f9888509 (diff) | |
| download | mruby-c85feaec56b942ad4049079ed6f2df46f20a577d.tar.gz mruby-c85feaec56b942ad4049079ed6f2df46f20a577d.zip | |
Merge pull request #3337 from bouk/undef-127
Fix segfault when undef is called with more than 126 arguments
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index b2cd12225..3cfd99d41 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2560,13 +2560,31 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_A(OP_TCLASS, cursp())); push(); while (t) { - int symbol = new_msym(s, sym(t->car)); + int symbol; + if (num >= CALL_MAXARGS - 1) { + pop_n(num); + genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), num)); + while (t) { + symbol = new_msym(s, sym(t->car)); + push(); + genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol)); + pop(); + genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1)); + t = t->cdr; + } + num = CALL_MAXARGS; + break; + } + symbol = new_msym(s, sym(t->car)); genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol)); push(); t = t->cdr; num++; } - pop_n(num + 1); + pop(); + if (num < CALL_MAXARGS) { + pop_n(num); + } genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num)); if (val) { push(); |
