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,
but are stored directly in the array's property list
(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_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_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.
*

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_boolean (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_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++)
{
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_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;
} /* 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
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);
operand dump_array_hole_assignment_res (void);
void dump_boolean_assignment (operand, bool);
operand dump_boolean_assignment_res (bool);
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))
{
op = dump_undefined_assignment_res ();
op = dump_array_hole_assignment_res ();
dump_varg (op);
}
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_TRUE: printf ("true"); break;
case ECMA_SIMPLE_VALUE_UNDEFINED: printf ("undefined"); break;
case ECMA_SIMPLE_VALUE_ARRAY_HOLE: printf ("hole"); break;
default: JERRY_UNREACHABLE ();
}
printf (": SIMPLE;");

View File

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