Fix processing of elision in array literal.

JerryScript-DCO-1.0-Signed-off-by: Andrey Shitov a.shitov@samsung.com
This commit is contained in:
Andrey Shitov 2015-08-24 13:37:14 +03:00
parent 01604974e3
commit e4843ece76
9 changed files with 45 additions and 1 deletions

View File

@ -82,6 +82,7 @@ typedef enum
ECMA_SIMPLE_VALUE_ARRAY_REDIRECT, /**< implementation defined value for an array's elements that exist, ECMA_SIMPLE_VALUE_ARRAY_REDIRECT, /**< implementation defined value for an array's elements that exist,
but are stored directly in the array's property list but are stored directly in the array's property list
(used for array elements with non-default attribute values) */ (used for array elements with non-default attribute values) */
ECMA_SIMPLE_VALUE_ARRAY_HOLE, /**< array hole, used for initialization of an array literal */
ECMA_SIMPLE_VALUE__COUNT /** count of simple ecma-values */ ECMA_SIMPLE_VALUE__COUNT /** count of simple ecma-values */
} ecma_simple_value_t; } ecma_simple_value_t;

View File

@ -155,6 +155,19 @@ ecma_is_value_true (ecma_value_t value) /**< ecma-value */
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_TRUE); && ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_TRUE);
} /* ecma_is_value_true */ } /* ecma_is_value_true */
/**
* Check if the value is array hole.
*
* @return true - if the value contains ecma-array-hole simple value,
* false - otherwise.
*/
bool __attr_pure___ __attr_always_inline___
ecma_is_value_array_hole (ecma_value_t value) /**< ecma-value */
{
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_ARRAY_HOLE);
} /* ecma_is_value_array_hole */
/** /**
* Check if the value is ecma-number. * Check if the value is ecma-number.
* *

View File

@ -58,6 +58,7 @@ extern bool ecma_is_value_undefined (ecma_value_t value);
extern bool ecma_is_value_null (ecma_value_t value); extern bool ecma_is_value_null (ecma_value_t value);
extern bool ecma_is_value_boolean (ecma_value_t value); extern bool ecma_is_value_boolean (ecma_value_t value);
extern bool ecma_is_value_true (ecma_value_t value); extern bool ecma_is_value_true (ecma_value_t value);
extern bool ecma_is_value_array_hole (ecma_value_t value);
extern bool ecma_is_value_number (ecma_value_t value); extern bool ecma_is_value_number (ecma_value_t value);
extern bool ecma_is_value_string (ecma_value_t value); extern bool ecma_is_value_string (ecma_value_t value);

View File

@ -131,6 +131,11 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
index < array_items_count; index < array_items_count;
index++) index++)
{ {
if (ecma_is_value_array_hole (array_items_p[index]))
{
continue;
}
ecma_string_t* item_name_string_p = ecma_new_ecma_string_from_uint32 (index); ecma_string_t* item_name_string_p = ecma_new_ecma_string_from_uint32 (index);
ecma_property_descriptor_t item_prop_desc = ecma_make_empty_property_descriptor (); ecma_property_descriptor_t item_prop_desc = ecma_make_empty_property_descriptor ();

View File

@ -747,6 +747,25 @@ dumper_is_eval_literal (operand obj) /**< byte-code operand */
return is_eval_lit; return is_eval_lit;
} /* dumper_is_eval_literal */ } /* dumper_is_eval_literal */
/**
* Dump assignment of an array-hole simple value to a register
*
* @return register number, to which the value vas assigned
*/
operand
dump_array_hole_assignment_res (void)
{
operand op = tmp_operand ();
const vm_instr_t instr = getop_assignment (op.data.uid,
OPCODE_ARG_TYPE_SIMPLE,
ECMA_SIMPLE_VALUE_ARRAY_HOLE);
const op_meta om = create_op_meta_000 (instr);
serializer_dump_op_meta (om);
return op;
} /* dump_array_hole_assignment_res */
void void
dump_boolean_assignment (operand op, bool is_true) dump_boolean_assignment (operand op, bool is_true)
{ {

View File

@ -63,6 +63,7 @@ void dumper_finish_varg_code_sequence (void);
extern bool dumper_is_eval_literal (operand); extern bool dumper_is_eval_literal (operand);
operand dump_array_hole_assignment_res (void);
void dump_boolean_assignment (operand, bool); void dump_boolean_assignment (operand, bool);
operand dump_boolean_assignment_res (bool); operand dump_boolean_assignment_res (bool);
void dump_string_assignment (operand, lit_cpointer_t); void dump_string_assignment (operand, lit_cpointer_t);

View File

@ -581,7 +581,7 @@ parse_argument_list (varg_list_type vlt, operand obj, operand *this_arg_p)
{ {
if (token_is (TOK_COMMA)) if (token_is (TOK_COMMA))
{ {
op = dump_undefined_assignment_res (); op = dump_array_hole_assignment_res ();
dump_varg (op); dump_varg (op);
} }
else else

View File

@ -263,6 +263,7 @@ pp_op_meta (const vm_instr_t *instrs_p,
case ECMA_SIMPLE_VALUE_FALSE: printf ("false"); break; case ECMA_SIMPLE_VALUE_FALSE: printf ("false"); break;
case ECMA_SIMPLE_VALUE_TRUE: printf ("true"); break; case ECMA_SIMPLE_VALUE_TRUE: printf ("true"); break;
case ECMA_SIMPLE_VALUE_UNDEFINED: printf ("undefined"); break; case ECMA_SIMPLE_VALUE_UNDEFINED: printf ("undefined"); break;
case ECMA_SIMPLE_VALUE_ARRAY_HOLE: printf ("hole"); break;
default: JERRY_UNREACHABLE (); default: JERRY_UNREACHABLE ();
} }
printf (": SIMPLE;"); printf (": SIMPLE;");

View File

@ -152,3 +152,6 @@ for (i = 0; i < 1024; i++)
{ {
assert (arr[i] === i + 1); assert (arr[i] === i + 1);
} }
var elision = [0,,2 ,3];
assert (elision.hasOwnProperty(1) == false);