mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
fix #1519
the 128th element in an array literal would trigger a corner case on splat mode checking, in which mruby will splat an that value into its parent array. the issue was masked by the fact of ary_concat() also accept non-array value: 1.9.3p286 :002> a = 1 1.9.3p286 :003> [*a] => [1] the expected behaviour should be OP_ARYPUSH the 128th element, instead of splat it by OP_ARYCAT.
This commit is contained in:
+9
-2
@@ -684,16 +684,23 @@ static int
|
||||
gen_values(codegen_scope *s, node *t, int val)
|
||||
{
|
||||
int n = 0;
|
||||
int is_splat;
|
||||
|
||||
while (t) {
|
||||
if (n >= 127 || (intptr_t)t->car->car == NODE_SPLAT) { // splat mode
|
||||
is_splat = (intptr_t)t->car->car == NODE_SPLAT; // splat mode
|
||||
if (n >= 127 || is_splat) {
|
||||
if (val) {
|
||||
pop_n(n);
|
||||
genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
|
||||
push();
|
||||
codegen(s, t->car, VAL);
|
||||
pop(); pop();
|
||||
genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
|
||||
if (is_splat) {
|
||||
genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
|
||||
}
|
||||
else {
|
||||
genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
|
||||
}
|
||||
t = t->cdr;
|
||||
while (t) {
|
||||
push();
|
||||
|
||||
Reference in New Issue
Block a user