Skip to content

Commit c41f76a

Browse files
Support up to 65535 items in object / array literals.
Related issue: #276 JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan [email protected]
1 parent b5923cc commit c41f76a

File tree

8 files changed

+277
-69
lines changed

8 files changed

+277
-69
lines changed

jerry-core/parser/js/opcodes-dumper.cpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,13 +316,15 @@ create_op_meta_for_vlt (varg_list_type vlt, operand *res, operand *obj)
316316
case VARG_ARRAY_DECL:
317317
{
318318
JERRY_ASSERT (obj == NULL);
319-
ret = create_op_meta_for_obj (getop_array_decl, res);
319+
operand empty = empty_operand ();
320+
ret = create_op_meta_for_res_and_obj (getop_array_decl, res, &empty);
320321
break;
321322
}
322323
case VARG_OBJ_DECL:
323324
{
324325
JERRY_ASSERT (obj == NULL);
325-
ret = create_op_meta_for_obj (getop_obj_decl, res);
326+
operand empty = empty_operand ();
327+
ret = create_op_meta_for_res_and_obj (getop_obj_decl, res, &empty);
326328
break;
327329
}
328330
}
@@ -1045,8 +1047,16 @@ dump_varg_header_for_rewrite (varg_list_type vlt, operand obj)
10451047
}
10461048

10471049
operand
1048-
rewrite_varg_header_set_args_count (uint8_t args_count)
1050+
rewrite_varg_header_set_args_count (size_t args_count)
10491051
{
1052+
/*
1053+
* FIXME:
1054+
* Remove formal parameters / arguments number from instruction,
1055+
* after ecma-values collection would become extendable (issue #310).
1056+
* In the case, each 'varg' instruction would just append corresponding
1057+
* argument / formal parameter name to values collection.
1058+
*/
1059+
10501060
op_meta om = serializer_get_op_meta (STACK_TOP (varg_headers));
10511061
switch (om.op.op_idx)
10521062
{
@@ -1055,24 +1065,43 @@ rewrite_varg_header_set_args_count (uint8_t args_count)
10551065
case VM_OP_CALL_N:
10561066
{
10571067
const operand res = tmp_operand ();
1058-
om.op.data.func_expr_n.arg_list = args_count;
1068+
if (args_count > 255)
1069+
{
1070+
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
1071+
"No more than 255 formal parameters / arguments are currently supported",
1072+
LIT_ITERATOR_POS_ZERO);
1073+
}
1074+
om.op.data.func_expr_n.arg_list = (idx_t) args_count;
10591075
om.op.data.func_expr_n.lhs = res.data.uid;
10601076
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
10611077
STACK_DROP (varg_headers, 1);
10621078
return res;
10631079
}
10641080
case VM_OP_FUNC_DECL_N:
10651081
{
1066-
om.op.data.func_decl_n.arg_list = args_count;
1082+
if (args_count > 255)
1083+
{
1084+
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
1085+
"No more than 255 formal parameters are currently supported",
1086+
LIT_ITERATOR_POS_ZERO);
1087+
}
1088+
om.op.data.func_decl_n.arg_list = (idx_t) args_count;
10671089
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
10681090
STACK_DROP (varg_headers, 1);
10691091
return empty_operand ();
10701092
}
10711093
case VM_OP_ARRAY_DECL:
10721094
case VM_OP_OBJ_DECL:
10731095
{
1096+
if (args_count > 65535)
1097+
{
1098+
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
1099+
"No more than 65535 formal parameters are currently supported",
1100+
LIT_ITERATOR_POS_ZERO);
1101+
}
10741102
const operand res = tmp_operand ();
1075-
om.op.data.obj_decl.list = args_count;
1103+
om.op.data.obj_decl.list_1 = (idx_t) (args_count >> 8);
1104+
om.op.data.obj_decl.list_2 = (idx_t) (args_count & 0xffu);
10761105
om.op.data.obj_decl.lhs = res.data.uid;
10771106
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
10781107
STACK_DROP (varg_headers, 1);

jerry-core/parser/js/opcodes-dumper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void dump_variable_assignment (operand, operand);
8181
operand dump_variable_assignment_res (operand);
8282

8383
void dump_varg_header_for_rewrite (varg_list_type, operand);
84-
operand rewrite_varg_header_set_args_count (uint8_t);
84+
operand rewrite_varg_header_set_args_count (size_t);
8585
void dump_call_additional_info (opcode_call_flags_t, operand);
8686
void dump_varg (operand);
8787

jerry-core/parser/js/parser.cpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static operand parse_expression (bool, jsp_eval_ret_store_t);
6464
static void parse_statement (jsp_label_t *outermost_stmt_label_p);
6565
static operand parse_assignment_expression (bool);
6666
static void parse_source_element_list (bool);
67-
static operand parse_argument_list (varg_list_type, operand, uint8_t *, operand *);
67+
static operand parse_argument_list (varg_list_type, operand, operand *);
6868

6969
static bool
7070
token_is (token_type tt)
@@ -385,7 +385,7 @@ parse_property_assignment (void)
385385
jsp_early_error_add_prop_name (name, is_setter ? PROP_SET : PROP_GET);
386386

387387
skip_newlines ();
388-
const operand func = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL, NULL);
388+
const operand func = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL);
389389

390390
dump_function_end_for_rewrite ();
391391

@@ -430,10 +430,10 @@ parse_property_assignment (void)
430430
For each ALT dumps appropriate bytecode. Uses OBJ during dump if neccesary.
431431
Result tmp. */
432432
static operand
433-
parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, operand *this_arg_p)
433+
parse_argument_list (varg_list_type vlt, operand obj, operand *this_arg_p)
434434
{
435435
token_type close_tt = TOK_CLOSE_PAREN;
436-
uint8_t args_num = 0;
436+
size_t args_num = 0;
437437

438438
JERRY_ASSERT (!(vlt != VARG_CALL_EXPR && this_arg_p != NULL));
439439

@@ -594,11 +594,6 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera
594594
dumper_finish_varg_code_sequence ();
595595
}
596596

597-
if (args_count != NULL)
598-
{
599-
*args_count = args_num;
600-
}
601-
602597
operand res;
603598
switch (vlt)
604599
{
@@ -654,7 +649,7 @@ parse_function_declaration (void)
654649
lexer_set_strict_mode (scopes_tree_strict_mode (STACK_TOP (scopes)));
655650

656651
jsp_early_error_start_checking_of_vargs ();
657-
parse_argument_list (VARG_FUNC_DECL, name, NULL, NULL);
652+
parse_argument_list (VARG_FUNC_DECL, name, NULL);
658653

659654
dump_function_end_for_rewrite ();
660655

@@ -705,13 +700,13 @@ parse_function_expression (void)
705700
jsp_early_error_check_for_eval_and_arguments_in_strict_mode (name, is_outer_scope_strict, tok.loc);
706701

707702
skip_newlines ();
708-
res = parse_argument_list (VARG_FUNC_EXPR, name, NULL, NULL);
703+
res = parse_argument_list (VARG_FUNC_EXPR, name, NULL);
709704
}
710705
else
711706
{
712707
lexer_save_token (tok);
713708
skip_newlines ();
714-
res = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL, NULL);
709+
res = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL);
715710
}
716711

717712
dump_function_end_for_rewrite ();
@@ -750,7 +745,7 @@ parse_function_expression (void)
750745
static operand
751746
parse_array_literal (void)
752747
{
753-
return parse_argument_list (VARG_ARRAY_DECL, empty_operand (), NULL, NULL);
748+
return parse_argument_list (VARG_ARRAY_DECL, empty_operand (), NULL);
754749
}
755750

756751
/* object_literal
@@ -759,7 +754,7 @@ parse_array_literal (void)
759754
static operand
760755
parse_object_literal (void)
761756
{
762-
return parse_argument_list (VARG_OBJ_DECL, empty_operand (), NULL, NULL);
757+
return parse_argument_list (VARG_OBJ_DECL, empty_operand (), NULL);
763758
}
764759

765760
/* literal
@@ -871,7 +866,7 @@ parse_member_expression (operand *this_arg, operand *prop_gl)
871866
skip_newlines ();
872867
if (token_is (TOK_OPEN_PAREN))
873868
{
874-
expr = parse_argument_list (VARG_CONSTRUCT_EXPR, expr, NULL, NULL);
869+
expr = parse_argument_list (VARG_CONSTRUCT_EXPR, expr, NULL);
875870
}
876871
else
877872
{
@@ -976,7 +971,7 @@ parse_call_expression (operand *this_arg_gl, operand *prop_gl)
976971
return expr;
977972
}
978973

979-
expr = parse_argument_list (VARG_CALL_EXPR, expr, NULL, &this_arg);
974+
expr = parse_argument_list (VARG_CALL_EXPR, expr, &this_arg);
980975
this_arg = empty_operand ();
981976

982977
skip_newlines ();
@@ -985,7 +980,7 @@ parse_call_expression (operand *this_arg_gl, operand *prop_gl)
985980
{
986981
if (tok.type == TOK_OPEN_PAREN)
987982
{
988-
expr = parse_argument_list (VARG_CALL_EXPR, expr, NULL, &this_arg);
983+
expr = parse_argument_list (VARG_CALL_EXPR, expr, &this_arg);
989984
skip_newlines ();
990985
}
991986
else

jerry-core/vm/opcodes.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -976,11 +976,15 @@ opfunc_array_decl (vm_instr_t instr, /**< instruction */
976976
vm_frame_ctx_t *frame_ctx_p) /**< interpreter context */
977977
{
978978
const idx_t lhs_var_idx = instr.data.array_decl.lhs;
979-
const idx_t args_number = instr.data.array_decl.list;
979+
const idx_t args_number_high_byte = instr.data.array_decl.list_1;
980+
const idx_t args_number_low_byte = instr.data.array_decl.list_2;
980981
const vm_instr_counter_t lit_oc = frame_ctx_p->pos;
981982

982983
frame_ctx_p->pos++;
983984

985+
ecma_length_t args_number = (((ecma_length_t) args_number_high_byte << JERRY_BITSINBYTE)
986+
+ (ecma_length_t) args_number_low_byte);
987+
984988
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
985989

986990
MEM_DEFINE_LOCAL_ARRAY (arg_values, args_number, ecma_value_t);
@@ -1039,11 +1043,15 @@ opfunc_obj_decl (vm_instr_t instr, /**< instruction */
10391043
vm_frame_ctx_t *frame_ctx_p) /**< interpreter context */
10401044
{
10411045
const idx_t lhs_var_idx = instr.data.obj_decl.lhs;
1042-
const idx_t args_number = instr.data.obj_decl.list;
1046+
const idx_t args_number_high_byte = instr.data.obj_decl.list_1;
1047+
const idx_t args_number_low_byte = instr.data.obj_decl.list_2;
10431048
const vm_instr_counter_t obj_lit_oc = frame_ctx_p->pos;
10441049

10451050
frame_ctx_p->pos++;
10461051

1052+
ecma_length_t args_number = (((ecma_length_t) args_number_high_byte << JERRY_BITSINBYTE)
1053+
+ (ecma_length_t) args_number_low_byte);
1054+
10471055
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
10481056

10491057
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();

jerry-core/vm/pretty-printer.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,26 +326,30 @@ pp_op_meta (const vm_instr_t *instrs_p,
326326
}
327327
case VM_OP_ARRAY_DECL:
328328
{
329-
if (opm.op.data.array_decl.list == 0)
329+
if (opm.op.data.array_decl.list_1 == 0
330+
&& opm.op.data.array_decl.list_2 == 0)
330331
{
331332
printf ("%s = [];", VAR (1));
332333
}
333334
else
334335
{
335-
vargs_num = opm.op.data.array_decl.list;
336+
vargs_num = (((int) opm.op.data.array_decl.list_1 << JERRY_BITSINBYTE)
337+
+ (int) opm.op.data.array_decl.list_2);
336338
seen_vargs = 0;
337339
}
338340
break;
339341
}
340342
case VM_OP_OBJ_DECL:
341343
{
342-
if (opm.op.data.obj_decl.list == 0)
344+
if (opm.op.data.obj_decl.list_1 == 0
345+
&& opm.op.data.obj_decl.list_2 == 0)
343346
{
344347
printf ("%s = {};", VAR (1));
345348
}
346349
else
347350
{
348-
vargs_num = opm.op.data.obj_decl.list;
351+
vargs_num = (((int) opm.op.data.obj_decl.list_1 << JERRY_BITSINBYTE)
352+
+ (int) opm.op.data.obj_decl.list_2);
349353
seen_vargs = 0;
350354
}
351355
break;

jerry-core/vm/vm-opcodes.inc.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ VM_OP_1 (retval, RETVAL,
5858

5959
VM_OP_0 (ret, RET)
6060

61-
VM_OP_2 (array_decl, ARRAY_DECL,
61+
VM_OP_3 (array_decl, ARRAY_DECL,
6262
lhs, VM_OP_ARG_TYPE_VARIABLE,
63-
list, VM_OP_ARG_TYPE_INTEGER_CONST)
63+
list_1, VM_OP_ARG_TYPE_INTEGER_CONST,
64+
list_2, VM_OP_ARG_TYPE_INTEGER_CONST)
6465

65-
VM_OP_2 (obj_decl, OBJ_DECL,
66+
VM_OP_3 (obj_decl, OBJ_DECL,
6667
lhs, VM_OP_ARG_TYPE_VARIABLE,
67-
list, VM_OP_ARG_TYPE_INTEGER_CONST)
68+
list_1, VM_OP_ARG_TYPE_INTEGER_CONST,
69+
list_2, VM_OP_ARG_TYPE_INTEGER_CONST)
6870

6971
VM_OP_3 (prop_getter, PROP_GETTER,
7072
lhs, VM_OP_ARG_TYPE_VARIABLE,

tests/jerry/array.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,74 @@ assert (c[3] === '3');
8181
b[0] = 1;
8282
c[0] += b[0];
8383
assert (c[0] == 1);
84+
85+
var arr = [
86+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
87+
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
88+
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
89+
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
90+
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
91+
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
92+
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
93+
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
94+
129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
95+
145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
96+
161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
97+
177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
98+
193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
99+
209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
100+
225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
101+
241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
102+
257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272,
103+
273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
104+
289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
105+
305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320,
106+
321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336,
107+
337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
108+
353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
109+
369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384,
110+
385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400,
111+
401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
112+
417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
113+
433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448,
114+
449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464,
115+
465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
116+
481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496,
117+
497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
118+
513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528,
119+
529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
120+
545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560,
121+
561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576,
122+
577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592,
123+
593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608,
124+
609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624,
125+
625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640,
126+
641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656,
127+
657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672,
128+
673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688,
129+
689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704,
130+
705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720,
131+
721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736,
132+
737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752,
133+
753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768,
134+
769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784,
135+
785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800,
136+
801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816,
137+
817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832,
138+
833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848,
139+
849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864,
140+
865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880,
141+
881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896,
142+
897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912,
143+
913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928,
144+
929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944,
145+
945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960,
146+
961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976,
147+
977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992,
148+
993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008,
149+
1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024 ];
150+
151+
for (i = 0; i < 1024; i++)
152+
{
153+
assert (arr[i] === i + 1);
154+
}

0 commit comments

Comments
 (0)