Support up to 65535 items in object / array literals.
Related issue: #276 JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
@@ -316,13 +316,15 @@ create_op_meta_for_vlt (varg_list_type vlt, operand *res, operand *obj)
|
||||
case VARG_ARRAY_DECL:
|
||||
{
|
||||
JERRY_ASSERT (obj == NULL);
|
||||
ret = create_op_meta_for_obj (getop_array_decl, res);
|
||||
operand empty = empty_operand ();
|
||||
ret = create_op_meta_for_res_and_obj (getop_array_decl, res, &empty);
|
||||
break;
|
||||
}
|
||||
case VARG_OBJ_DECL:
|
||||
{
|
||||
JERRY_ASSERT (obj == NULL);
|
||||
ret = create_op_meta_for_obj (getop_obj_decl, res);
|
||||
operand empty = empty_operand ();
|
||||
ret = create_op_meta_for_res_and_obj (getop_obj_decl, res, &empty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1045,8 +1047,16 @@ dump_varg_header_for_rewrite (varg_list_type vlt, operand obj)
|
||||
}
|
||||
|
||||
operand
|
||||
rewrite_varg_header_set_args_count (uint8_t args_count)
|
||||
rewrite_varg_header_set_args_count (size_t args_count)
|
||||
{
|
||||
/*
|
||||
* FIXME:
|
||||
* Remove formal parameters / arguments number from instruction,
|
||||
* after ecma-values collection would become extendable (issue #310).
|
||||
* In the case, each 'varg' instruction would just append corresponding
|
||||
* argument / formal parameter name to values collection.
|
||||
*/
|
||||
|
||||
op_meta om = serializer_get_op_meta (STACK_TOP (varg_headers));
|
||||
switch (om.op.op_idx)
|
||||
{
|
||||
@@ -1055,7 +1065,13 @@ rewrite_varg_header_set_args_count (uint8_t args_count)
|
||||
case VM_OP_CALL_N:
|
||||
{
|
||||
const operand res = tmp_operand ();
|
||||
om.op.data.func_expr_n.arg_list = args_count;
|
||||
if (args_count > 255)
|
||||
{
|
||||
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
|
||||
"No more than 255 formal parameters / arguments are currently supported",
|
||||
LIT_ITERATOR_POS_ZERO);
|
||||
}
|
||||
om.op.data.func_expr_n.arg_list = (idx_t) args_count;
|
||||
om.op.data.func_expr_n.lhs = res.data.uid;
|
||||
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
|
||||
STACK_DROP (varg_headers, 1);
|
||||
@@ -1063,7 +1079,13 @@ rewrite_varg_header_set_args_count (uint8_t args_count)
|
||||
}
|
||||
case VM_OP_FUNC_DECL_N:
|
||||
{
|
||||
om.op.data.func_decl_n.arg_list = args_count;
|
||||
if (args_count > 255)
|
||||
{
|
||||
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
|
||||
"No more than 255 formal parameters are currently supported",
|
||||
LIT_ITERATOR_POS_ZERO);
|
||||
}
|
||||
om.op.data.func_decl_n.arg_list = (idx_t) args_count;
|
||||
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
|
||||
STACK_DROP (varg_headers, 1);
|
||||
return empty_operand ();
|
||||
@@ -1071,8 +1093,15 @@ rewrite_varg_header_set_args_count (uint8_t args_count)
|
||||
case VM_OP_ARRAY_DECL:
|
||||
case VM_OP_OBJ_DECL:
|
||||
{
|
||||
if (args_count > 65535)
|
||||
{
|
||||
PARSE_ERROR (JSP_EARLY_ERROR_SYNTAX,
|
||||
"No more than 65535 formal parameters are currently supported",
|
||||
LIT_ITERATOR_POS_ZERO);
|
||||
}
|
||||
const operand res = tmp_operand ();
|
||||
om.op.data.obj_decl.list = args_count;
|
||||
om.op.data.obj_decl.list_1 = (idx_t) (args_count >> 8);
|
||||
om.op.data.obj_decl.list_2 = (idx_t) (args_count & 0xffu);
|
||||
om.op.data.obj_decl.lhs = res.data.uid;
|
||||
serializer_rewrite_op_meta (STACK_TOP (varg_headers), om);
|
||||
STACK_DROP (varg_headers, 1);
|
||||
|
||||
@@ -81,7 +81,7 @@ void dump_variable_assignment (operand, operand);
|
||||
operand dump_variable_assignment_res (operand);
|
||||
|
||||
void dump_varg_header_for_rewrite (varg_list_type, operand);
|
||||
operand rewrite_varg_header_set_args_count (uint8_t);
|
||||
operand rewrite_varg_header_set_args_count (size_t);
|
||||
void dump_call_additional_info (opcode_call_flags_t, operand);
|
||||
void dump_varg (operand);
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ static operand parse_expression (bool, jsp_eval_ret_store_t);
|
||||
static void parse_statement (jsp_label_t *outermost_stmt_label_p);
|
||||
static operand parse_assignment_expression (bool);
|
||||
static void parse_source_element_list (bool);
|
||||
static operand parse_argument_list (varg_list_type, operand, uint8_t *, operand *);
|
||||
static operand parse_argument_list (varg_list_type, operand, operand *);
|
||||
|
||||
static bool
|
||||
token_is (token_type tt)
|
||||
@@ -385,7 +385,7 @@ parse_property_assignment (void)
|
||||
jsp_early_error_add_prop_name (name, is_setter ? PROP_SET : PROP_GET);
|
||||
|
||||
skip_newlines ();
|
||||
const operand func = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL, NULL);
|
||||
const operand func = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL);
|
||||
|
||||
dump_function_end_for_rewrite ();
|
||||
|
||||
@@ -430,10 +430,10 @@ parse_property_assignment (void)
|
||||
For each ALT dumps appropriate bytecode. Uses OBJ during dump if neccesary.
|
||||
Result tmp. */
|
||||
static operand
|
||||
parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, operand *this_arg_p)
|
||||
parse_argument_list (varg_list_type vlt, operand obj, operand *this_arg_p)
|
||||
{
|
||||
token_type close_tt = TOK_CLOSE_PAREN;
|
||||
uint8_t args_num = 0;
|
||||
size_t args_num = 0;
|
||||
|
||||
JERRY_ASSERT (!(vlt != VARG_CALL_EXPR && this_arg_p != NULL));
|
||||
|
||||
@@ -594,11 +594,6 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera
|
||||
dumper_finish_varg_code_sequence ();
|
||||
}
|
||||
|
||||
if (args_count != NULL)
|
||||
{
|
||||
*args_count = args_num;
|
||||
}
|
||||
|
||||
operand res;
|
||||
switch (vlt)
|
||||
{
|
||||
@@ -654,7 +649,7 @@ parse_function_declaration (void)
|
||||
lexer_set_strict_mode (scopes_tree_strict_mode (STACK_TOP (scopes)));
|
||||
|
||||
jsp_early_error_start_checking_of_vargs ();
|
||||
parse_argument_list (VARG_FUNC_DECL, name, NULL, NULL);
|
||||
parse_argument_list (VARG_FUNC_DECL, name, NULL);
|
||||
|
||||
dump_function_end_for_rewrite ();
|
||||
|
||||
@@ -705,13 +700,13 @@ parse_function_expression (void)
|
||||
jsp_early_error_check_for_eval_and_arguments_in_strict_mode (name, is_outer_scope_strict, tok.loc);
|
||||
|
||||
skip_newlines ();
|
||||
res = parse_argument_list (VARG_FUNC_EXPR, name, NULL, NULL);
|
||||
res = parse_argument_list (VARG_FUNC_EXPR, name, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
lexer_save_token (tok);
|
||||
skip_newlines ();
|
||||
res = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL, NULL);
|
||||
res = parse_argument_list (VARG_FUNC_EXPR, empty_operand (), NULL);
|
||||
}
|
||||
|
||||
dump_function_end_for_rewrite ();
|
||||
@@ -750,7 +745,7 @@ parse_function_expression (void)
|
||||
static operand
|
||||
parse_array_literal (void)
|
||||
{
|
||||
return parse_argument_list (VARG_ARRAY_DECL, empty_operand (), NULL, NULL);
|
||||
return parse_argument_list (VARG_ARRAY_DECL, empty_operand (), NULL);
|
||||
}
|
||||
|
||||
/* object_literal
|
||||
@@ -759,7 +754,7 @@ parse_array_literal (void)
|
||||
static operand
|
||||
parse_object_literal (void)
|
||||
{
|
||||
return parse_argument_list (VARG_OBJ_DECL, empty_operand (), NULL, NULL);
|
||||
return parse_argument_list (VARG_OBJ_DECL, empty_operand (), NULL);
|
||||
}
|
||||
|
||||
/* literal
|
||||
@@ -871,7 +866,7 @@ parse_member_expression (operand *this_arg, operand *prop_gl)
|
||||
skip_newlines ();
|
||||
if (token_is (TOK_OPEN_PAREN))
|
||||
{
|
||||
expr = parse_argument_list (VARG_CONSTRUCT_EXPR, expr, NULL, NULL);
|
||||
expr = parse_argument_list (VARG_CONSTRUCT_EXPR, expr, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -976,7 +971,7 @@ parse_call_expression (operand *this_arg_gl, operand *prop_gl)
|
||||
return expr;
|
||||
}
|
||||
|
||||
expr = parse_argument_list (VARG_CALL_EXPR, expr, NULL, &this_arg);
|
||||
expr = parse_argument_list (VARG_CALL_EXPR, expr, &this_arg);
|
||||
this_arg = empty_operand ();
|
||||
|
||||
skip_newlines ();
|
||||
@@ -985,7 +980,7 @@ parse_call_expression (operand *this_arg_gl, operand *prop_gl)
|
||||
{
|
||||
if (tok.type == TOK_OPEN_PAREN)
|
||||
{
|
||||
expr = parse_argument_list (VARG_CALL_EXPR, expr, NULL, &this_arg);
|
||||
expr = parse_argument_list (VARG_CALL_EXPR, expr, &this_arg);
|
||||
skip_newlines ();
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user