mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
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:
parent
01604974e3
commit
e4843ece76
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 ();
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;");
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user