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 | |
| 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
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 22 | ||||
| -rw-r--r-- | test/t/codegen.rb | 10 |
2 files changed, 30 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(); diff --git a/test/t/codegen.rb b/test/t/codegen.rb index bb0f5c306..3058a7fbc 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -63,3 +63,13 @@ assert('splat in case splat') do assert_equal [1], a end + +assert('undef with 127 or more arguments') do + assert_raise NameError do + undef + a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, + a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, + a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, + a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a + end +end |
