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:
Ruben Ayrapetyan
2015-07-30 17:28:17 +03:00
parent b5923ccd9d
commit c41f76aba2
8 changed files with 277 additions and 69 deletions
+35 -6
View File
@@ -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);
+1 -1
View File
@@ -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);
+12 -17
View File
@@ -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