Converting ecma_completion_value_t to class derived from ecma_value_t with additional field with for completion type and related operations.

Completion value are now returned through ecma_completion_value_t &ret_value argument.
This commit is contained in:
Ruben Ayrapetyan
2015-01-30 23:14:22 +03:00
parent a1f95048ae
commit f37a5085f6
69 changed files with 2214 additions and 2304 deletions
+75 -51
View File
@@ -37,16 +37,17 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
static ecma_completion_value_t
ecma_reject (bool is_throw) /**< Throw flag */
static void
ecma_reject (ecma_completion_value_t &ret_value, /**< out: completion value */
bool is_throw) /**< Throw flag */
{
if (is_throw)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
}
} /* ecma_reject */
@@ -59,8 +60,9 @@ ecma_reject (bool is_throw) /**< Throw flag */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of arguments that
void
ecma_op_create_array_object (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t *arguments_list_p, /**< list of arguments that
are passed to Array constructor */
ecma_length_t arguments_list_len, /**< length of the arguments' list */
bool is_treat_single_arg_as_length) /**< if the value is true,
@@ -85,7 +87,8 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
uint32_t num_uint32 = ecma_number_to_uint32 (*num_p);
if (*num_p != ecma_uint32_to_number (num_uint32))
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_RANGE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_RANGE));
return;
}
else
{
@@ -145,15 +148,18 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
item_prop_desc.is_configurable = true;
}
ecma_op_object_define_own_property (obj_p,
ecma_op_object_define_own_property (ret_value,
obj_p,
item_name_string_p,
&item_prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (ret_value)
|| ecma_is_completion_value_normal_false (ret_value));
ecma_deref_ecma_string (item_name_string_p);
}
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
} /* ecma_op_create_array_object */
/**
@@ -166,8 +172,9 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array object */
void
ecma_op_array_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the array object */
ecma_string_t *property_name_p, /**< property name */
const ecma_property_descriptor_t* property_desc_p, /**< property descriptor */
bool is_throw) /**< flag that controls failure handling */
@@ -199,16 +206,19 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
if (!property_desc_p->is_value_defined)
{
// i.
return ecma_op_general_object_define_own_property (obj_p, property_name_p, property_desc_p, is_throw);
ecma_op_general_object_define_own_property (ret_value, obj_p, property_name_p, property_desc_p, is_throw);
return;
}
ecma_number_t new_len_num;
// c.
ecma_completion_value_t prop_val_to_num_completion = ecma_op_to_number (ecma_value_t (property_desc_p->value));
ecma_completion_value_t prop_val_to_num_completion;
ecma_op_to_number (prop_val_to_num_completion, ecma_value_t (property_desc_p->value));
if (ecma_is_completion_value_throw (prop_val_to_num_completion))
{
return prop_val_to_num_completion;
ret_value = prop_val_to_num_completion;
return;
}
JERRY_ASSERT (ecma_is_completion_value_normal (prop_val_to_num_completion));
@@ -225,7 +235,8 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// d.
if (ecma_uint32_to_number (new_len_uint32) != new_len_num)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_RANGE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_RANGE));
return;
}
else
{
@@ -236,17 +247,16 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
ecma_property_descriptor_t new_len_property_desc = *property_desc_p;
new_len_property_desc.value = (ecma_value_packed_t) ecma_value_t (new_len_num_p);
ecma_completion_value_t ret_value;
// f.
if (new_len_uint32 >= old_len_uint32)
{
// i.
magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ret_value = ecma_op_general_object_define_own_property (obj_p,
magic_string_length_p,
&new_len_property_desc,
is_throw);
ecma_op_general_object_define_own_property (ret_value,
obj_p,
magic_string_length_p,
&new_len_property_desc,
is_throw);
ecma_deref_ecma_string (magic_string_length_p);
}
else
@@ -254,7 +264,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// g.
if (!ecma_is_property_writable (len_prop_p))
{
ret_value = ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
}
else
{
@@ -277,10 +287,12 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// j.
magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ecma_completion_value_t succeeded = ecma_op_general_object_define_own_property (obj_p,
magic_string_length_p,
&new_len_property_desc,
is_throw);
ecma_completion_value_t succeeded;
ecma_op_general_object_define_own_property (succeeded,
obj_p,
magic_string_length_p,
&new_len_property_desc,
is_throw);
ecma_deref_ecma_string (magic_string_length_p);
/* Handling normal false and throw values */
@@ -306,9 +318,11 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// ii
ecma_string_t *old_length_string_p = ecma_new_ecma_string_from_uint32 (old_len_uint32);
ecma_completion_value_t delete_succeeded = ecma_op_object_delete (obj_p,
old_length_string_p,
false);
ecma_completion_value_t delete_succeeded;
ecma_op_object_delete (delete_succeeded,
obj_p,
old_length_string_p,
false);
ecma_deref_ecma_string (old_length_string_p);
// iii
@@ -331,10 +345,12 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// 3.
ecma_string_t *magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ecma_completion_value_t completion = ecma_op_general_object_define_own_property (obj_p,
magic_string_length_p,
&new_len_property_desc,
false);
ecma_completion_value_t completion;
ecma_op_general_object_define_own_property (completion,
obj_p,
magic_string_length_p,
&new_len_property_desc,
false);
ecma_deref_ecma_string (magic_string_length_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
@@ -348,7 +364,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
if (!reduce_succeeded)
{
ret_value = ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
}
else
{
@@ -362,15 +378,16 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
ecma_completion_value_t completion_set_not_writable;
magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
completion_set_not_writable = ecma_op_general_object_define_own_property (obj_p,
magic_string_length_p,
&prop_desc_not_writable,
false);
ecma_op_general_object_define_own_property (completion_set_not_writable,
obj_p,
magic_string_length_p,
&prop_desc_not_writable,
false);
ecma_deref_ecma_string (magic_string_length_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion_set_not_writable));
}
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
}
}
@@ -378,7 +395,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
ecma_dealloc_number (new_len_num_p);
return ret_value;
return;
}
JERRY_UNREACHABLE();
@@ -412,10 +429,12 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
if (!is_index)
{
// 5.
return ecma_op_general_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
false);
ecma_op_general_object_define_own_property (ret_value,
obj_p,
property_name_p,
property_desc_p,
false);
return;
}
// 4.
@@ -424,21 +443,25 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
if (index >= old_len_uint32
&& !ecma_is_property_writable (len_prop_p))
{
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
// c.
ecma_completion_value_t succeeded = ecma_op_general_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
false);
ecma_completion_value_t succeeded;
ecma_op_general_object_define_own_property (succeeded,
obj_p,
property_name_p,
property_desc_p,
false);
// d.
JERRY_ASSERT (ecma_is_completion_value_normal_true (succeeded)
|| ecma_is_completion_value_normal_false (succeeded));
if (ecma_is_completion_value_normal_false (succeeded))
{
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
// e.
@@ -454,7 +477,8 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
}
// f.
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
return;
}
JERRY_UNREACHABLE();
+6 -4
View File
@@ -26,13 +26,15 @@
* @{
*/
extern ecma_completion_value_t
ecma_op_create_array_object (const ecma_value_t *arguments_list_p,
extern void
ecma_op_create_array_object (ecma_completion_value_t &ret_value,
const ecma_value_t *arguments_list_p,
ecma_length_t arguments_list_len,
bool is_treat_single_arg_as_length);
extern ecma_completion_value_t
ecma_op_array_object_define_own_property (ecma_object_t *obj_p,
extern void
ecma_op_array_object_define_own_property (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_property_descriptor_t* property_desc_p,
bool is_throw);
+8 -5
View File
@@ -38,14 +38,17 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to the Boolean constructor */
void
ecma_op_create_boolean_object (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& arg) /**< argument passed to the Boolean constructor */
{
ecma_completion_value_t conv_to_boolean_completion = ecma_op_to_boolean (arg);
ecma_completion_value_t conv_to_boolean_completion;
ecma_op_to_boolean (conv_to_boolean_completion, arg);
if (!ecma_is_completion_value_normal (conv_to_boolean_completion))
{
return conv_to_boolean_completion;
ret_value = conv_to_boolean_completion;
return;
}
ecma_simple_value_t bool_value = (ecma_is_completion_value_normal_true (conv_to_boolean_completion) ?
@@ -69,5 +72,5 @@ ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to
ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE);
prim_value_prop_p->u.internal_property.value = bool_value;
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
} /* ecma_op_create_boolean_object */
+3 -1
View File
@@ -26,7 +26,9 @@
* @{
*/
extern ecma_completion_value_t ecma_op_create_boolean_object (const ecma_value_t& arg);
extern void
ecma_op_create_boolean_object (ecma_completion_value_t &ret_value,
const ecma_value_t& arg);
/**
* @}
+35 -55
View File
@@ -34,8 +34,9 @@
* @return true - if values are equal,
* false - otherwise.
*/
ecma_completion_value_t
ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
void
ecma_op_abstract_equality_compare (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& x, /**< first operand */
const ecma_value_t& y) /**< second operand */
{
const bool is_x_undefined = ecma_is_value_undefined (x);
@@ -59,8 +60,6 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
|| (is_x_string && is_y_string)
|| (is_x_object && is_y_object));
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
if (is_types_equal)
{
// 1.
@@ -69,7 +68,7 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
|| is_x_null)
{
// a., b.
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
else if (is_x_number)
{ // c.
@@ -100,8 +99,8 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
JERRY_ASSERT (is_x_equal_to_y == is_x_equal_to_y_check);
#endif /* !JERRY_NDEBUG */
ret_value = ecma_make_simple_completion_value (is_x_equal_to_y ?
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value,
is_x_equal_to_y ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else if (is_x_string)
{ // d.
@@ -110,13 +109,13 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
bool is_equal = ecma_compare_ecma_strings (x_str_p, y_str_p);
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else if (is_x_boolean)
{ // e.
bool is_equal = (ecma_is_value_true (x) == ecma_is_value_true (y));
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else
{ // f.
@@ -124,55 +123,47 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
bool is_equal = (ecma_get_object_from_value (x) == ecma_get_object_from_value (y));
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
}
else if ((is_x_null && is_y_undefined)
|| (is_x_undefined && is_y_null))
{ // 2., 3.
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
else if (is_x_number && is_y_string)
{
// 4.
ECMA_TRY_CATCH (y_num_value,
ecma_op_to_number (y),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_number, y_num_value, y);
ret_value = ecma_op_abstract_equality_compare (x, y_num_value);
ecma_op_abstract_equality_compare (ret_value, x, y_num_value);
ECMA_FINALIZE (y_num_value);
}
else if (is_x_string && is_y_number)
{
// 5.
ECMA_TRY_CATCH (x_num_value,
ecma_op_to_number (x),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_number, x_num_value, x);
ret_value = ecma_op_abstract_equality_compare (x_num_value, y);
ecma_op_abstract_equality_compare (ret_value, x_num_value, y);
ECMA_FINALIZE (x_num_value);
}
else if (is_x_boolean)
{
// 6.
ECMA_TRY_CATCH (x_num_value,
ecma_op_to_number (x),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_number, x_num_value, x);
ret_value = ecma_op_abstract_equality_compare (x_num_value, y);
ecma_op_abstract_equality_compare (ret_value, x_num_value, y);
ECMA_FINALIZE (x_num_value);
}
else if (is_y_boolean)
{
// 7.
ECMA_TRY_CATCH (y_num_value,
ecma_op_to_number (y),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_number, y_num_value, y);
ret_value = ecma_op_abstract_equality_compare (x, y_num_value);
ecma_op_abstract_equality_compare (ret_value, x, y_num_value);
ECMA_FINALIZE (y_num_value);
}
@@ -180,11 +171,9 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
&& (is_x_number || is_x_string))
{
// 8.
ECMA_TRY_CATCH (y_prim_value,
ecma_op_to_primitive (y, ECMA_PREFERRED_TYPE_NO),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_primitive, y_prim_value, y, ECMA_PREFERRED_TYPE_NO);
ret_value = ecma_op_abstract_equality_compare (x, y_prim_value);
ecma_op_abstract_equality_compare (ret_value, x, y_prim_value);
ECMA_FINALIZE (y_prim_value);
}
@@ -192,20 +181,16 @@ ecma_op_abstract_equality_compare (const ecma_value_t& x, /**< first operand */
&& (is_y_number || is_y_string))
{
// 9.
ECMA_TRY_CATCH (x_prim_value,
ecma_op_to_primitive (x, ECMA_PREFERRED_TYPE_NO),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_primitive, x_prim_value, x, ECMA_PREFERRED_TYPE_NO);
ret_value = ecma_op_abstract_equality_compare (x_prim_value, y);
ecma_op_abstract_equality_compare (ret_value, x_prim_value, y);
ECMA_FINALIZE (x_prim_value);
}
else
{
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
}
return ret_value;
} /* ecma_op_abstract_equality_compare */
/**
@@ -328,23 +313,20 @@ ecma_op_strict_equality_compare (const ecma_value_t& x, /**< first operand */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_abstract_relational_compare (const ecma_value_t& x, /**< first operand */
void
ecma_op_abstract_relational_compare (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& x, /**< first operand */
const ecma_value_t& y, /**< second operand */
bool left_first) /**< 'LeftFirst' flag */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
const ecma_value_t& first_converted_value = left_first ? x : y;
const ecma_value_t& second_converted_value = left_first ? y : x;
// 1., 2.
ECMA_TRY_CATCH(prim_first_converted_value,
ecma_op_to_primitive (first_converted_value, ECMA_PREFERRED_TYPE_NUMBER),
ret_value);
ECMA_TRY_CATCH(prim_second_converted_value,
ecma_op_to_primitive (second_converted_value, ECMA_PREFERRED_TYPE_NUMBER),
ret_value);
ECMA_TRY_CATCH(ret_value,
ecma_op_to_primitive, prim_first_converted_value, first_converted_value, ECMA_PREFERRED_TYPE_NUMBER);
ECMA_TRY_CATCH(ret_value,
ecma_op_to_primitive, prim_second_converted_value, second_converted_value, ECMA_PREFERRED_TYPE_NUMBER);
const ecma_value_t &px = left_first ? prim_first_converted_value : prim_second_converted_value;
const ecma_value_t &py = left_first ? prim_second_converted_value : prim_first_converted_value;
@@ -365,7 +347,7 @@ ecma_op_abstract_relational_compare (const ecma_value_t& x, /**< first operand *
|| ecma_number_is_nan (ny))
{
// c., d.
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
@@ -428,8 +410,8 @@ ecma_op_abstract_relational_compare (const ecma_value_t& x, /**< first operand *
JERRY_ASSERT (is_x_less_than_y_check == is_x_less_than_y);
#endif /* !JERRY_NDEBUG */
ret_value = ecma_make_simple_completion_value (is_x_less_than_y ?
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value,
is_x_less_than_y ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
ECMA_OP_TO_NUMBER_FINALIZE (ny);
@@ -444,14 +426,12 @@ ecma_op_abstract_relational_compare (const ecma_value_t& x, /**< first operand *
bool is_px_less = ecma_compare_ecma_strings_relational (str_x_p, str_y_p);
ret_value = ecma_make_simple_completion_value (is_px_less ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value,
is_px_less ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
ECMA_FINALIZE(prim_second_converted_value);
ECMA_FINALIZE(prim_first_converted_value);
return ret_value;
} /* ecma_op_abstract_relational_compare */
/**
+12 -7
View File
@@ -27,13 +27,18 @@
* @{
*/
extern ecma_completion_value_t ecma_op_abstract_equality_compare (const ecma_value_t& x,
const ecma_value_t& y);
extern bool ecma_op_strict_equality_compare (const ecma_value_t& x,
const ecma_value_t& y);
extern ecma_completion_value_t ecma_op_abstract_relational_compare (const ecma_value_t& x,
const ecma_value_t& y,
bool left_first);
extern void
ecma_op_abstract_equality_compare (ecma_completion_value_t &ret_value,
const ecma_value_t& x,
const ecma_value_t& y);
extern bool
ecma_op_strict_equality_compare (const ecma_value_t& x,
const ecma_value_t& y);
extern void
ecma_op_abstract_relational_compare (ecma_completion_value_t &ret_value,
const ecma_value_t& x,
const ecma_value_t& y,
bool left_first);
/**
* @}
+92 -109
View File
@@ -48,19 +48,20 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_check_object_coercible (const ecma_value_t& value) /**< ecma-value */
void
ecma_op_check_object_coercible (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< ecma-value */
{
ecma_check_value_type_is_spec_defined (value);
if (ecma_is_value_undefined (value)
|| ecma_is_value_null (value))
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
}
} /* ecma_op_check_object_coercible */
@@ -156,8 +157,9 @@ ecma_op_same_value (const ecma_value_t& x, /**< ecma-value */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_to_primitive (const ecma_value_t& value, /**< ecma-value */
void
ecma_op_to_primitive (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value, /**< ecma-value */
ecma_preferred_type_hint_t preferred_type) /**< preferred type hint */
{
ecma_check_value_type_is_spec_defined (value);
@@ -166,14 +168,14 @@ ecma_op_to_primitive (const ecma_value_t& value, /**< ecma-value */
{
ecma_object_t *obj_p = ecma_get_object_from_value (value);
return ecma_op_object_default_value (obj_p, preferred_type);
ecma_op_object_default_value (ret_value, obj_p, preferred_type);
}
else
{
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
ecma_make_normal_completion_value (ret_value, value_copy);
}
} /* ecma_op_to_primitive */
@@ -187,22 +189,23 @@ ecma_op_to_primitive (const ecma_value_t& value, /**< ecma-value */
* Returned value is simple and so need not be freed.
* However, ecma_free_completion_value may be called for it, but it is a no-op.
*/
ecma_completion_value_t
ecma_op_to_boolean (const ecma_value_t& value) /**< ecma-value */
void
ecma_op_to_boolean (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< ecma-value */
{
ecma_check_value_type_is_spec_defined (value);
ecma_simple_value_t ret_value;
ecma_simple_value_t boolean;
if (ecma_is_value_boolean (value))
{
ret_value = (ecma_is_value_true (value) ?
boolean = (ecma_is_value_true (value) ?
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else if (ecma_is_value_undefined (value)
|| ecma_is_value_null (value))
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
boolean = ECMA_SIMPLE_VALUE_FALSE;
}
else if (ecma_is_value_number (value))
{
@@ -211,11 +214,11 @@ ecma_op_to_boolean (const ecma_value_t& value) /**< ecma-value */
if (ecma_number_is_nan (*num_p)
|| ecma_number_is_zero (*num_p))
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
boolean = ECMA_SIMPLE_VALUE_FALSE;
}
else
{
ret_value = ECMA_SIMPLE_VALUE_TRUE;
boolean = ECMA_SIMPLE_VALUE_TRUE;
}
}
else if (ecma_is_value_string (value))
@@ -224,21 +227,21 @@ ecma_op_to_boolean (const ecma_value_t& value) /**< ecma-value */
if (ecma_string_get_length (str_p) == 0)
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
boolean = ECMA_SIMPLE_VALUE_FALSE;
}
else
{
ret_value = ECMA_SIMPLE_VALUE_TRUE;
boolean = ECMA_SIMPLE_VALUE_TRUE;
}
}
else
{
JERRY_ASSERT (ecma_is_value_object (value));
ret_value = ECMA_SIMPLE_VALUE_TRUE;
boolean = ECMA_SIMPLE_VALUE_TRUE;
}
return ecma_make_simple_completion_value (ret_value);
ecma_make_simple_completion_value (ret_value, boolean);
} /* ecma_op_to_boolean */
/**
@@ -250,8 +253,9 @@ ecma_op_to_boolean (const ecma_value_t& value) /**< ecma-value */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
void
ecma_op_to_number (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< ecma-value */
{
ecma_check_value_type_is_spec_defined (value);
@@ -260,7 +264,7 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
ecma_make_normal_completion_value (ret_value, value_copy);
}
else if (ecma_is_value_string (value))
{
@@ -269,21 +273,15 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ecma_string_to_number (str_p);
return ecma_make_normal_completion_value (ecma_value_t (num_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (num_p));
}
else if (ecma_is_value_object (value))
{
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (ret_value, ecma_op_to_primitive, primitive_value, value, ECMA_PREFERRED_TYPE_NUMBER);
ECMA_TRY_CATCH (primitive_value,
ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER),
ret_value);
ret_value = ecma_op_to_number (primitive_value);
ecma_op_to_number (ret_value, primitive_value);
ECMA_FINALIZE (primitive_value);
return ret_value;
}
else
{
@@ -311,7 +309,7 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
}
}
return ecma_make_normal_completion_value (ecma_value_t (num_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (num_p));
}
} /* ecma_op_to_number */
@@ -324,24 +322,21 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_to_string (const ecma_value_t& value) /**< ecma-value */
void
ecma_op_to_string (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< ecma-value */
{
ecma_check_value_type_is_spec_defined (value);
if (unlikely (ecma_is_value_object (value)))
{
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (ret_value, ecma_op_to_primitive, prim_value, value, ECMA_PREFERRED_TYPE_STRING);
ECMA_TRY_CATCH (prim_value,
ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_STRING),
ret_value);
ret_value = ecma_op_to_string (prim_value);
ecma_op_to_string (ret_value, prim_value);
ECMA_FINALIZE (prim_value);
return ret_value;
return;
}
else
{
@@ -379,7 +374,7 @@ ecma_op_to_string (const ecma_value_t& value) /**< ecma-value */
}
}
return ecma_make_normal_completion_value (ecma_value_t (res_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (res_p));
}
} /* ecma_op_to_string */
@@ -392,38 +387,39 @@ ecma_op_to_string (const ecma_value_t& value) /**< ecma-value */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_to_object (const ecma_value_t& value) /**< ecma-value */
void
ecma_op_to_object (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< ecma-value */
{
ecma_check_value_type_is_spec_defined (value);
if (ecma_is_value_number (value))
{
return ecma_op_create_number_object (value);
ecma_op_create_number_object (ret_value, value);
}
else if (ecma_is_value_string (value))
{
return ecma_op_create_string_object (&value, 1);
ecma_op_create_string_object (ret_value, &value, 1);
}
else if (ecma_is_value_object (value))
{
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
ecma_make_normal_completion_value (ret_value, value_copy);
}
else
{
if (ecma_is_value_undefined (value)
|| ecma_is_value_null (value))
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (value));
return ecma_op_create_boolean_object (value);
ecma_op_create_boolean_object (ret_value, value);
}
}
} /* ecma_op_to_object */
@@ -467,10 +463,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
prop_desc.value = src_prop_desc_p->value;
ecma_string_t *value_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_VALUE);
completion = ecma_op_object_define_own_property (obj_p,
value_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
value_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (value_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
@@ -480,10 +477,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *writable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_WRITABLE);
completion = ecma_op_object_define_own_property (obj_p,
writable_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
writable_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (writable_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
}
@@ -503,10 +501,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
}
ecma_string_t *get_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_GET);
completion = ecma_op_object_define_own_property (obj_p,
get_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
get_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (get_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
@@ -521,10 +520,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
}
ecma_string_t *set_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_SET);
completion = ecma_op_object_define_own_property (obj_p,
set_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
set_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (set_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
}
@@ -534,10 +534,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *enumerable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ENUMERABLE);
completion = ecma_op_object_define_own_property (obj_p,
enumerable_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
enumerable_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (enumerable_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
@@ -546,10 +547,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *configurable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CONFIGURABLE);
completion = ecma_op_object_define_own_property (obj_p,
configurable_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
configurable_magic_string_p,
&prop_desc,
false);
ecma_deref_ecma_string (configurable_magic_string_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
@@ -565,18 +567,19 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value */
void
ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& obj_value, /**< object value */
ecma_property_descriptor_t *out_prop_desc_p) /**< out: filled property descriptor
if return value is normal
empty completion value */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
// 1.
if (!ecma_is_value_object (obj_value))
{
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
@@ -590,12 +593,8 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, enumerable_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (enumerable_prop_value,
ecma_op_object_get (obj_p, enumerable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_enumerable_prop_value,
ecma_op_to_boolean (enumerable_prop_value),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, enumerable_prop_value, obj_p, enumerable_magic_string_p);
ECMA_TRY_CATCH (ret_value, ecma_op_to_boolean, boolean_enumerable_prop_value, enumerable_prop_value);
prop_desc.is_enumerable_defined = true;
if (ecma_is_value_true (boolean_enumerable_prop_value))
@@ -624,12 +623,8 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, configurable_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (configurable_prop_value,
ecma_op_object_get (obj_p, configurable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_configurable_prop_value,
ecma_op_to_boolean (configurable_prop_value),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, configurable_prop_value, obj_p, configurable_magic_string_p);
ECMA_TRY_CATCH (ret_value, ecma_op_to_boolean, boolean_configurable_prop_value, configurable_prop_value);
prop_desc.is_configurable_defined = true;
if (ecma_is_value_true (boolean_configurable_prop_value))
@@ -659,9 +654,7 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, value_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (value_prop_value,
ecma_op_object_get (obj_p, value_magic_string_p),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, value_prop_value, obj_p, value_magic_string_p);
ecma_value_t value_copy;
ecma_copy_value (value_copy, value_prop_value, true);
@@ -684,12 +677,8 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, writable_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (writable_prop_value,
ecma_op_object_get (obj_p, writable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_writable_prop_value,
ecma_op_to_boolean (writable_prop_value),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, writable_prop_value, obj_p, writable_magic_string_p);
ECMA_TRY_CATCH (ret_value, ecma_op_to_boolean, boolean_writable_prop_value, writable_prop_value);
prop_desc.is_writable_defined = true;
if (ecma_is_value_true (boolean_writable_prop_value))
@@ -719,14 +708,12 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, get_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (get_prop_value,
ecma_op_object_get (obj_p, get_magic_string_p),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, get_prop_value, obj_p, get_magic_string_p);
if (!ecma_op_is_callable (get_prop_value)
&& !ecma_is_value_undefined (get_prop_value))
{
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
@@ -763,14 +750,12 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (ecma_op_object_get_property (obj_p, set_magic_string_p) != NULL)
{
ECMA_TRY_CATCH (set_prop_value,
ecma_op_object_get (obj_p, set_magic_string_p),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, set_prop_value, obj_p, set_magic_string_p);
if (!ecma_op_is_callable (set_prop_value)
&& !ecma_is_value_undefined (set_prop_value))
{
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
@@ -808,7 +793,7 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
if (prop_desc.is_value_defined
|| prop_desc.is_writable_defined)
{
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
}
}
@@ -824,8 +809,6 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
*out_prop_desc_p = prop_desc;
}
return ret_value;
} /* ecma_op_to_property_descriptor */
/**
+25 -10
View File
@@ -38,19 +38,34 @@ typedef enum
ECMA_PREFERRED_TYPE_STRING /**< String */
} ecma_preferred_type_hint_t;
extern ecma_completion_value_t ecma_op_check_object_coercible (const ecma_value_t& value);
extern void
ecma_op_check_object_coercible (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern bool ecma_op_same_value (const ecma_value_t& x,
const ecma_value_t& y);
extern ecma_completion_value_t ecma_op_to_primitive (const ecma_value_t& value,
ecma_preferred_type_hint_t preferred_type);
extern ecma_completion_value_t ecma_op_to_boolean (const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_to_number (const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_to_string (const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_to_object (const ecma_value_t& value);
extern void
ecma_op_to_primitive (ecma_completion_value_t &ret_value,
const ecma_value_t& value,
ecma_preferred_type_hint_t preferred_type);
extern void
ecma_op_to_boolean (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern void
ecma_op_to_number (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern void
ecma_op_to_string (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern void
ecma_op_to_object (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern ecma_object_t* ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_desc_p);
extern ecma_completion_value_t ecma_op_to_property_descriptor (const ecma_value_t& obj_value,
ecma_property_descriptor_t *out_prop_desc_p);
extern ecma_object_t*
ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_desc_p);
extern void
ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value,
const ecma_value_t& obj_value,
ecma_property_descriptor_t *out_prop_desc_p);
/**
* @}
+107 -96
View File
@@ -193,10 +193,12 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
length_prop_desc.value = (ecma_value_packed_t) ecma_value_t (len_p);
ecma_string_t* magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ecma_completion_value_t completion = ecma_op_object_define_own_property (f,
magic_string_length_p,
&length_prop_desc,
false);
ecma_completion_value_t completion;
ecma_op_object_define_own_property (completion,
f,
magic_string_length_p,
&length_prop_desc,
false);
ecma_deref_ecma_string (magic_string_length_p);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
@@ -225,20 +227,28 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
}
ecma_string_t *magic_string_constructor_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CONSTRUCTOR);
ecma_op_object_define_own_property (proto_p,
ecma_op_object_define_own_property (completion,
proto_p,
magic_string_constructor_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
ecma_deref_ecma_string (magic_string_constructor_p);
// 18.
prop_desc.value = (ecma_value_packed_t) ecma_value_t (proto_p);
prop_desc.is_configurable = false;
ecma_string_t *magic_string_prototype_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE);
ecma_op_object_define_own_property (f,
ecma_op_object_define_own_property (completion,
f,
magic_string_prototype_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
ecma_deref_ecma_string (magic_string_prototype_p);
ecma_deref_object (proto_p);
@@ -264,17 +274,25 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
}
ecma_string_t *magic_string_caller_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CALLER);
ecma_op_object_define_own_property (f,
ecma_op_object_define_own_property (completion,
f,
magic_string_caller_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
ecma_deref_ecma_string (magic_string_caller_p);
ecma_string_t *magic_string_arguments_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS);
ecma_op_object_define_own_property (f,
ecma_op_object_define_own_property (completion,
f,
magic_string_arguments_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
ecma_deref_ecma_string (magic_string_arguments_p);
ecma_deref_object (thrower_p);
@@ -292,8 +310,9 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
static ecma_completion_value_t
ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Function object */
static void
ecma_function_call_setup_args_variables (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *func_obj_p, /**< Function object */
ecma_object_t *env_p, /**< lexical environment */
const ecma_value_t *arguments_list_p, /**< arguments list */
ecma_length_t arguments_list_len, /**< length of argument list */
@@ -307,7 +326,8 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
if (formal_parameters_p == NULL)
{
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
return;
}
ecma_length_t formal_parameters_count = formal_parameters_p->unit_number;
@@ -334,31 +354,37 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
bool arg_already_declared = ecma_op_has_binding (env_p, formal_parameter_name_string_p);
if (!arg_already_declared)
{
ecma_completion_value_t completion = ecma_op_create_mutable_binding (env_p,
formal_parameter_name_string_p,
false);
ecma_completion_value_t completion;
ecma_op_create_mutable_binding (completion,
env_p,
formal_parameter_name_string_p,
false);
if (ecma_is_completion_value_throw (completion))
{
return completion;
ret_value = completion;
return;
}
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
completion = ecma_op_set_mutable_binding (env_p,
formal_parameter_name_string_p,
v,
is_strict);
ecma_op_set_mutable_binding (completion,
env_p,
formal_parameter_name_string_p,
v,
is_strict);
if (ecma_is_completion_value_throw (completion))
{
return completion;
ret_value = completion;
return;
}
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
}
}
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
return;
} /* ecma_function_call_setup_args_variables */
/**
@@ -371,8 +397,9 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object */
void
ecma_op_function_has_instance (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *func_obj_p, /**< Function object */
const ecma_value_t& value) /**< argument 'V' */
{
JERRY_ASSERT(func_obj_p != NULL
@@ -382,22 +409,20 @@ ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object *
{
if (!ecma_is_value_object (value))
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
return;
}
ecma_object_t* v_obj_p = ecma_get_object_from_value (value);
ecma_string_t *prototype_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE);
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (prototype_obj_value,
ecma_op_object_get (func_obj_p, prototype_magic_string_p),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_object_get, prototype_obj_value, func_obj_p, prototype_magic_string_p);
if (!ecma_is_value_object (prototype_obj_value))
{
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
return;
}
else
{
@@ -410,13 +435,13 @@ ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object *
if (v_obj_p == NULL)
{
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
break;
}
else if (v_obj_p == prototype_obj_p)
{
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
break;
}
@@ -426,12 +451,10 @@ ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object *
ECMA_FINALIZE (prototype_obj_value);
ecma_deref_ecma_string (prototype_magic_string_p);
return ret_value;
}
else if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
@@ -451,8 +474,9 @@ ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object *
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
void
ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *func_obj_p, /**< Function object */
const ecma_value_t& this_arg_value, /**< 'this' argument's value */
const ecma_value_t* arguments_list_p, /**< arguments list */
ecma_length_t arguments_list_len) /**< length of arguments list */
@@ -466,11 +490,10 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
{
if (unlikely (ecma_get_object_is_builtin (func_obj_p)))
{
return ecma_builtin_dispatch_call (func_obj_p, this_arg_value, arguments_list_p, arguments_list_len);
ecma_builtin_dispatch_call (ret_value, func_obj_p, this_arg_value, arguments_list_p, arguments_list_len);
return;
}
ecma_completion_value_t ret_value;
/* Entering Function Code (ECMA-262 v5, 10.4.3) */
ecma_property_t *scope_prop_p = ecma_get_internal_property (func_obj_p, ECMA_INTERNAL_PROPERTY_SCOPE);
@@ -499,7 +522,8 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
else
{
// 3., 4.
ecma_completion_value_t to_obj_completion = ecma_op_to_object (this_arg_value);
ecma_completion_value_t to_obj_completion;
ecma_op_to_object (to_obj_completion, this_arg_value);
JERRY_ASSERT (ecma_is_completion_value_normal (to_obj_completion));
ecma_get_completion_value_value (this_binding, to_obj_completion);
@@ -509,25 +533,22 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
ecma_object_t *local_env_p = ecma_create_decl_lex_env (scope_p);
// 9.
ECMA_TRY_CATCH (args_var_declaration_ret,
ecma_function_call_setup_args_variables (func_obj_p,
local_env_p,
arguments_list_p,
arguments_list_len,
is_strict),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_function_call_setup_args_variables, args_var_declaration_ret,
func_obj_p, local_env_p, arguments_list_p, arguments_list_len, is_strict);
ecma_completion_value_t run_completion = run_int_from_pos (code_first_opcode_idx,
this_binding,
local_env_p,
is_strict,
false);
ecma_completion_value_t run_completion;
run_int_from_pos (run_completion,
code_first_opcode_idx,
this_binding,
local_env_p,
is_strict,
false);
if (ecma_is_completion_value_return (run_completion))
{
ecma_value_t value_to_ret;
ecma_get_completion_value_value (value_to_ret, run_completion);
ret_value = ecma_make_normal_completion_value (value_to_ret);
ecma_make_normal_completion_value (ret_value, value_to_ret);
}
else
{
@@ -538,12 +559,10 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
ecma_deref_object (local_env_p);
ecma_free_value (this_binding, true);
return ret_value;
}
else if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
{
return ecma_builtin_dispatch_call (func_obj_p, this_arg_value, arguments_list_p, arguments_list_len);
ecma_builtin_dispatch_call (ret_value, func_obj_p, this_arg_value, arguments_list_p, arguments_list_len);
}
else
{
@@ -561,8 +580,9 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
void
ecma_op_function_construct (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *func_obj_p, /**< Function object */
const ecma_value_t* arguments_list_p, /**< arguments list */
ecma_length_t arguments_list_len) /**< length of arguments list */
{
@@ -575,18 +595,15 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
{
if (unlikely (ecma_get_object_is_builtin (func_obj_p)))
{
return ecma_builtin_dispatch_construct (func_obj_p, arguments_list_p, arguments_list_len);
ecma_builtin_dispatch_construct (ret_value, func_obj_p, arguments_list_p, arguments_list_len);
return;
}
ecma_completion_value_t ret_value;
ecma_string_t *prototype_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE);
// 5.
ECMA_TRY_CATCH (func_obj_prototype_prop_value,
ecma_op_object_get (func_obj_p,
prototype_magic_string_p),
ret_value);
ECMA_TRY_CATCH (ret_value,
ecma_op_object_get, func_obj_prototype_prop_value, func_obj_p, prototype_magic_string_p);
// 6.
ecma_object_t *prototype_p;
@@ -611,12 +628,9 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
ecma_deref_object (prototype_p);
// 8.
ECMA_TRY_CATCH (call_completion,
ecma_op_function_call (func_obj_p,
ecma_value_t (obj_p),
arguments_list_p,
arguments_list_len),
ret_value);
ECMA_TRY_CATCH (ret_value,
ecma_op_function_call, call_completion,
func_obj_p, ecma_value_t (obj_p), arguments_list_p, arguments_list_len);
ecma_value_t obj_value;
@@ -633,14 +647,12 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
obj_value = obj_p;
}
ret_value = ecma_make_normal_completion_value (obj_value);
ecma_make_normal_completion_value (ret_value, obj_value);
ECMA_FINALIZE (call_completion);
ECMA_FINALIZE (func_obj_prototype_prop_value);
ecma_deref_ecma_string (prototype_magic_string_p);
return ret_value;
}
else
{
@@ -657,8 +669,9 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
* @return completion value
* returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *function_name_p, /**< function name */
opcode_counter_t function_code_opcode_idx, /**< index of first opcode of function code */
ecma_string_t* formal_parameter_list_p[], /**< formal parameters list */
@@ -678,14 +691,14 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
bool func_already_declared = ecma_op_has_binding (lex_env_p, function_name_p);
// d.
ecma_completion_value_t completion = ecma_make_empty_completion_value ();
ecma_completion_value_t completion;
if (!func_already_declared)
{
completion = ecma_op_create_mutable_binding (lex_env_p,
function_name_p,
is_configurable_bindings);
ecma_op_create_mutable_binding (completion,
lex_env_p,
function_name_p,
is_configurable_bindings);
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
}
else if (ecma_is_lexical_environment_global (lex_env_p))
@@ -712,14 +725,15 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
property_desc.is_configurable = is_configurable_bindings;
}
completion = ecma_op_object_define_own_property (glob_obj_p,
function_name_p,
&property_desc,
true);
ecma_op_object_define_own_property (completion,
glob_obj_p,
function_name_p,
&property_desc,
true);
}
else if (existing_prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR)
{
completion = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (completion, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
@@ -728,15 +742,13 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
if (!ecma_is_property_writable (existing_prop_p)
|| !ecma_is_property_enumerable (existing_prop_p))
{
completion = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (completion, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
}
ecma_deref_object (glob_obj_p);
}
ecma_completion_value_t ret_value;
if (ecma_is_completion_value_throw (completion))
{
ret_value = completion;
@@ -746,15 +758,14 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
// f.
ret_value = ecma_op_set_mutable_binding (lex_env_p,
function_name_p,
ecma_value_t (func_obj_p),
is_strict);
ecma_op_set_mutable_binding (ret_value,
lex_env_p,
function_name_p,
ecma_value_t (func_obj_p),
is_strict);
}
ecma_deref_object (func_obj_p);
return ret_value;
} /* ecma_op_function_declaration */
/**
+12 -8
View File
@@ -37,23 +37,27 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[],
bool is_strict,
opcode_counter_t first_opcode_idx);
extern ecma_completion_value_t
ecma_op_function_call (ecma_object_t *func_obj_p,
extern void
ecma_op_function_call (ecma_completion_value_t &ret_value,
ecma_object_t *func_obj_p,
const ecma_value_t& this_arg_value,
const ecma_value_t* arguments_list_p,
ecma_length_t arguments_list_len);
extern ecma_completion_value_t
ecma_op_function_construct (ecma_object_t *func_obj_p,
extern void
ecma_op_function_construct (ecma_completion_value_t &ret_value,
ecma_object_t *func_obj_p,
const ecma_value_t* arguments_list_p,
ecma_length_t arguments_list_len);
extern ecma_completion_value_t
ecma_op_function_has_instance (ecma_object_t *func_obj_p,
extern void
ecma_op_function_has_instance (ecma_completion_value_t &ret_value,
ecma_object_t *func_obj_p,
const ecma_value_t& value);
extern ecma_completion_value_t
ecma_op_function_declaration (ecma_object_t *lex_env_p,
extern void
ecma_op_function_declaration (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p,
ecma_string_t *function_name_p,
opcode_counter_t function_code_opcode_idx,
ecma_string_t* formal_parameter_list_p[],
+53 -57
View File
@@ -43,8 +43,9 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< reference's base (lexical environment) */
void
ecma_op_get_value_lex_env_base (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *ref_base_lex_env_p, /**< reference's base (lexical environment) */
ecma_string_t *var_name_string_p, /**< variable name */
bool is_strict) /**< flag indicating strict mode */
{
@@ -53,7 +54,8 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
// 3.
if (unlikely (is_unresolvable_reference))
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
return;
}
// 5.
@@ -61,9 +63,10 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
&& ecma_is_lexical_environment (ref_base_lex_env_p));
// 5.a
return ecma_op_get_binding_value (ref_base_lex_env_p,
var_name_string_p,
is_strict);
ecma_op_get_binding_value (ret_value,
ref_base_lex_env_p,
var_name_string_p,
is_strict);
} /* ecma_op_get_value_lex_env_base */
/**
@@ -74,8 +77,9 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_get_value_object_base (const ecma_reference_t& ref) /**< ECMA-reference */
void
ecma_op_get_value_object_base (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_reference_t& ref) /**< ECMA-reference */
{
const ecma_value_t& base = ref.base;
const bool is_unresolvable_reference = ecma_is_value_undefined (base);
@@ -98,26 +102,22 @@ ecma_op_get_value_object_base (const ecma_reference_t& ref) /**< ECMA-reference
JERRY_ASSERT(obj_p != NULL
&& !ecma_is_lexical_environment (obj_p));
return ecma_op_object_get (obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp));
ecma_op_object_get (ret_value, obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp));
}
else
{
// 4.b case 2
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (obj_base, ecma_op_to_object (base), ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_object, obj_base, base);
ecma_object_t *obj_p = ecma_get_object_from_value (obj_base);
JERRY_ASSERT (obj_p != NULL
&& !ecma_is_lexical_environment (obj_p));
ret_value = ecma_op_object_get (obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp));
ecma_op_object_get (ret_value, obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp));
ECMA_FINALIZE (obj_base);
return ret_value;
}
} /* ecma_op_get_value_object_base */
@@ -129,8 +129,9 @@ ecma_op_get_value_object_base (const ecma_reference_t& ref) /**< ECMA-reference
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< reference's base (lexical environment) */
void
ecma_op_put_value_lex_env_base (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *ref_base_lex_env_p, /**< reference's base (lexical environment) */
ecma_string_t *var_name_string_p, /**< variable name */
bool is_strict, /**< flag indicating strict mode */
const ecma_value_t& value) /**< ECMA-value */
@@ -143,24 +144,28 @@ ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
// 3.a.
if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
return;
}
else
{
// 3.b.
ecma_object_t *global_object_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
ecma_completion_value_t completion = ecma_op_object_put (global_object_p,
var_name_string_p,
value,
false);
ecma_completion_value_t completion;
ecma_op_object_put (completion,
global_object_p,
var_name_string_p,
value,
false);
ecma_deref_object (global_object_p);
JERRY_ASSERT(ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
return;
}
}
@@ -169,10 +174,11 @@ ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
&& ecma_is_lexical_environment (ref_base_lex_env_p));
// 5.a
return ecma_op_set_mutable_binding (ref_base_lex_env_p,
var_name_string_p,
value,
is_strict);
ecma_op_set_mutable_binding (ret_value,
ref_base_lex_env_p,
var_name_string_p,
value,
is_strict);
} /* ecma_op_put_value_lex_env_base */
/**
@@ -181,16 +187,17 @@ ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
static ecma_completion_value_t
ecma_reject_put (bool is_throw) /**< Throw flag */
static void
ecma_reject_put (ecma_completion_value_t &ret_value, /**< out: completion value */
bool is_throw) /**< Throw flag */
{
if (is_throw)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_EMPTY);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_EMPTY);
}
} /* ecma_reject_put */
@@ -202,8 +209,9 @@ ecma_reject_put (bool is_throw) /**< Throw flag */
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference */
void
ecma_op_put_value_object_base (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_reference_t& ref, /**< ECMA-reference */
const ecma_value_t& value) /**< ECMA-value */
{
const ecma_value_t& base = ref.base;
@@ -227,29 +235,21 @@ ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference
JERRY_ASSERT (obj_p != NULL
&& !ecma_is_lexical_environment (obj_p));
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (ret_value, ecma_op_object_put, put_ret_value, obj_p,
ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp),
value, ref.is_strict);
ECMA_TRY_CATCH (put_ret_value,
ecma_op_object_put (obj_p,
ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ref.referenced_name_cp),
value,
ref.is_strict),
ret_value);
ret_value = ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
ECMA_FINALIZE (put_ret_value);
return ret_value;
}
else
{
// 4.b case 2
ecma_completion_value_t ret_value;
// sub_1.
ECMA_TRY_CATCH (obj_base, ecma_op_to_object (base), ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_to_object, obj_base, base);
ecma_object_t *obj_p = ecma_get_object_from_value (obj_base);
JERRY_ASSERT (obj_p != NULL
@@ -261,7 +261,7 @@ ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference
// sub_2.
if (!ecma_op_object_can_put (obj_p, referenced_name_p))
{
ret_value = ecma_reject_put (ref.is_strict);
ecma_reject_put (ret_value, ref.is_strict);
}
else
{
@@ -277,7 +277,7 @@ ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference
|| (prop_p == NULL)
|| (prop_p->type != ECMA_PROPERTY_NAMEDACCESSOR))
{
ret_value = ecma_reject_put (ref.is_strict);
ecma_reject_put (ret_value, ref.is_strict);
}
else
{
@@ -288,19 +288,15 @@ ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference
prop_p->u.named_accessor_property.set_p);
JERRY_ASSERT (setter_p != NULL);
ECMA_TRY_CATCH (call_ret,
ecma_op_function_call (setter_p, base, &value, 1),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_function_call, call_ret, setter_p, base, &value, 1);
ret_value = ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
ECMA_FINALIZE (call_ret);
}
}
ECMA_FINALIZE (obj_base);
return ret_value;
}
} /* ecma_op_put_value_object_base */
+54 -36
View File
@@ -69,8 +69,9 @@ ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_create_mutable_binding (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *name_p, /**< argument N */
bool is_deletable) /**< argument D */
{
@@ -105,14 +106,17 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
prop_desc.is_configurable = is_deletable;
}
ecma_completion_value_t completion = ecma_op_object_define_own_property (binding_obj_p,
name_p,
&prop_desc,
true);
ecma_completion_value_t completion;
ecma_op_object_define_own_property (completion,
binding_obj_p,
name_p,
&prop_desc,
true);
if (ecma_is_completion_value_throw (completion))
{
return completion;
ret_value = completion;
return;
}
else
{
@@ -121,7 +125,7 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
}
}
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
} /* ecma_op_create_mutable_binding */
/**
@@ -132,8 +136,9 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *name_p, /**< argument N */
const ecma_value_t& value, /**< argument V */
bool is_strict) /**< argument S */
@@ -159,7 +164,8 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
if (is_equal)
{
return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
ecma_make_throw_obj_completion_value (ret_value, ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
return;
}
# endif /* CONFIG_ECMA_COMPACT_PROFILE */
#endif /* !JERRY_NDEBUG */
@@ -172,7 +178,8 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
}
else if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
return;
}
}
else
@@ -181,14 +188,17 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
ecma_completion_value_t completion = ecma_op_object_put (binding_obj_p,
name_p,
value,
is_strict);
ecma_completion_value_t completion;
ecma_op_object_put (completion,
binding_obj_p,
name_p,
value,
is_strict);
if (ecma_is_completion_value_throw (completion))
{
return completion;
ret_value = completion;
return;
}
else
{
@@ -197,7 +207,7 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
}
}
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
} /* ecma_op_set_mutable_binding */
/**
@@ -208,8 +218,9 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *name_p, /**< argument N */
bool is_strict) /**< argument S */
{
@@ -234,7 +245,8 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
if (is_equal)
{
return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
ecma_make_throw_obj_completion_value (ret_value, ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
return;
}
# endif /* CONFIG_ECMA_COMPACT_PROFILE */
#endif /* !JERRY_NDEBUG */
@@ -251,18 +263,20 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
/* unitialized immutable binding */
if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
return;
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
return;
}
}
ecma_value_t prop_value_copy;
ecma_copy_value (prop_value_copy, prop_value, true);
return ecma_make_normal_completion_value (prop_value_copy);
ecma_make_normal_completion_value (ret_value, prop_value_copy);
}
else
{
@@ -274,15 +288,17 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
{
if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
return;
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
return;
}
}
return ecma_op_object_get (binding_obj_p, name_p);
ecma_op_object_get (ret_value, binding_obj_p, name_p);
}
} /* ecma_op_get_binding_value */
@@ -295,8 +311,9 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
* Return value is simple and so need not be freed.
* However, ecma_free_completion_value may be called for it, but it is a no-op.
*/
ecma_completion_value_t
ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_delete_binding (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *name_p) /**< argument N */
{
JERRY_ASSERT(lex_env_p != NULL
@@ -329,7 +346,7 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
}
}
return ecma_make_simple_completion_value (ret_val);
ecma_make_simple_completion_value (ret_value, ret_val);
}
else
{
@@ -337,7 +354,7 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
return ecma_op_object_delete (binding_obj_p, name_p, false);
ecma_op_object_delete (ret_value, binding_obj_p, name_p, false);
}
} /* ecma_op_delete_binding */
@@ -349,15 +366,16 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment */
void
ecma_op_implicit_this_value (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *lex_env_p) /**< lexical environment */
{
JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p));
if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
@@ -368,11 +386,11 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
ecma_ref_object (binding_obj_p);
return ecma_make_normal_completion_value (ecma_value_t (binding_obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (binding_obj_p));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
}
}
} /* ecma_op_implicit_this_value */
+41 -23
View File
@@ -31,33 +31,51 @@
*/
/* ECMA-262 v5, 8.7.1 and 8.7.2 */
extern ecma_completion_value_t ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict);
extern ecma_completion_value_t ecma_op_get_value_object_base (const ecma_reference_t& ref);
extern ecma_completion_value_t ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict,
const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_put_value_object_base (const ecma_reference_t& ref,
const ecma_value_t& value);
extern void
ecma_op_get_value_lex_env_base (ecma_completion_value_t &ret_value,
ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict);
extern void
ecma_op_get_value_object_base (ecma_completion_value_t &ret_value,
const ecma_reference_t& ref);
extern void
ecma_op_put_value_lex_env_base (ecma_completion_value_t &ret_value,
ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict,
const ecma_value_t& value);
extern void
ecma_op_put_value_object_base (ecma_completion_value_t &ret_value,
const ecma_reference_t& ref,
const ecma_value_t& value);
/* ECMA-262 v5, Table 17. Abstract methods of Environment Records */
extern bool ecma_op_has_binding (ecma_object_t *lex_env_p,
ecma_string_t *name_p);
extern ecma_completion_value_t ecma_op_create_mutable_binding (ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_deletable);
extern ecma_completion_value_t ecma_op_set_mutable_binding (ecma_object_t *lex_env_p,
ecma_string_t *name_p,
const ecma_value_t& value,
bool is_strict);
extern ecma_completion_value_t ecma_op_get_binding_value (ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_strict);
extern ecma_completion_value_t ecma_op_delete_binding (ecma_object_t *lex_env_p,
ecma_string_t *name_p);
extern ecma_completion_value_t ecma_op_implicit_this_value (ecma_object_t *lex_env_p);
extern void
ecma_op_create_mutable_binding (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_deletable);
extern void
ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p,
ecma_string_t *name_p,
const ecma_value_t& value,
bool is_strict);
extern void
ecma_op_get_binding_value (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_strict);
extern void
ecma_op_delete_binding (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p,
ecma_string_t *name_p);
extern void
ecma_op_implicit_this_value (ecma_completion_value_t &ret_value,
ecma_object_t *lex_env_p);
/* ECMA-262 v5, Table 18. Additional methods of Declarative Environment Records */
extern void ecma_op_create_immutable_binding (ecma_object_t *lex_env_p,
+8 -5
View File
@@ -38,14 +38,17 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to the Number constructor */
void
ecma_op_create_number_object (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& arg) /**< argument passed to the Number constructor */
{
ecma_completion_value_t to_num_completion = ecma_op_to_number (arg);
ecma_completion_value_t to_num_completion;
ecma_op_to_number (to_num_completion, arg);
if (!ecma_is_completion_value_normal (to_num_completion))
{
return to_num_completion;
ret_value = to_num_completion;
return;
}
ecma_value_t num_value;
@@ -71,5 +74,5 @@ ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to t
ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE);
ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_p);
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
} /* ecma_op_create_number_object */
+3 -1
View File
@@ -26,7 +26,9 @@
* @{
*/
extern ecma_completion_value_t ecma_op_create_number_object (const ecma_value_t& arg);
extern void
ecma_op_create_number_object (ecma_completion_value_t &ret_value,
const ecma_value_t& arg);
/**
* @}
+69 -74
View File
@@ -81,10 +81,12 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
prop_desc.is_configurable = true;
}
ecma_string_t *length_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ecma_completion_value_t completion = ecma_op_object_define_own_property (obj_p,
length_magic_string_p,
&prop_desc,
false);
ecma_completion_value_t completion;
ecma_op_object_define_own_property (completion,
obj_p,
length_magic_string_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
ecma_deref_ecma_string (length_magic_string_p);
@@ -112,10 +114,11 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
ecma_string_t *indx_string_p = ecma_new_ecma_string_from_number (ecma_uint32_to_number (indx));
completion = ecma_op_object_define_own_property (obj_p,
indx_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
indx_string_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
ecma_deref_ecma_string (indx_string_p);
@@ -176,10 +179,11 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
prop_desc.value = (ecma_value_packed_t) ecma_value_t (name_p);
}
completion = ecma_op_object_define_own_property (map_p,
indx_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
map_p,
indx_string_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
ecma_deref_ecma_string (indx_string_p);
@@ -224,10 +228,11 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
ecma_string_t *callee_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CALLEE);
completion = ecma_op_object_define_own_property (obj_p,
callee_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
callee_magic_string_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
ecma_deref_ecma_string (callee_magic_string_p);
@@ -255,10 +260,11 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
ecma_string_t *callee_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CALLEE);
ecma_string_t *caller_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CALLER);
completion = ecma_op_object_define_own_property (obj_p,
callee_magic_string_p,
&prop_desc,
false);
ecma_op_object_define_own_property (completion,
obj_p,
callee_magic_string_p,
&prop_desc,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
ecma_deref_ecma_string (callee_magic_string_p);
@@ -275,8 +281,9 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
static ecma_completion_value_t
ecma_arguments_get_mapped_arg_value (ecma_object_t *map_p, /**< [[ParametersMap]] object */
static void
ecma_arguments_get_mapped_arg_value (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *map_p, /**< [[ParametersMap]] object */
ecma_property_t *arg_name_prop_p) /**< property of [[ParametersMap]]
corresponding to index and value
equal to mapped argument's name */
@@ -292,12 +299,8 @@ ecma_arguments_get_mapped_arg_value (ecma_object_t *map_p, /**< [[ParametersMap]
ecma_string_t *arg_name_p = ecma_get_string_from_value (arg_name_prop_value);
ecma_completion_value_t completion = ecma_op_get_binding_value (lex_env_p,
arg_name_p,
true);
JERRY_ASSERT (ecma_is_completion_value_normal (completion));
return completion;
ecma_op_get_binding_value (ret_value, lex_env_p, arg_name_p, true);
JERRY_ASSERT (ecma_is_completion_value_normal (ret_value));
} /* ecma_arguments_get_mapped_arg_value */
/**
@@ -310,8 +313,9 @@ ecma_arguments_get_mapped_arg_value (ecma_object_t *map_p, /**< [[ParametersMap]
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_arguments_object_get (ecma_object_t *obj_p, /**< the object */
void
ecma_op_arguments_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p) /**< property name */
{
// 1.
@@ -328,12 +332,12 @@ ecma_op_arguments_object_get (ecma_object_t *obj_p, /**< the object */
/* We don't check for 'caller' (item 3.b) here, because the 'caller' property is defined
as non-configurable and it's get/set are set to [[ThrowTypeError]] object */
return ecma_op_general_object_get (obj_p, property_name_p);
ecma_op_general_object_get (ret_value, obj_p, property_name_p);
}
else
{
// 4.
return ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p);
ecma_arguments_get_mapped_arg_value (ret_value, map_p, mapped_prop_p);
}
} /* ecma_op_arguments_object_get */
@@ -372,7 +376,8 @@ ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object
if (mapped_prop_p != NULL)
{
// a.
ecma_completion_value_t get_mapped_arg_completion = ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p);
ecma_completion_value_t get_mapped_arg_completion;
ecma_arguments_get_mapped_arg_value (get_mapped_arg_completion, map_p, mapped_prop_p);
ecma_value_t value_to_assign;
ecma_get_completion_value_value (value_to_assign, get_mapped_arg_completion);
@@ -396,8 +401,9 @@ ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the object */
void
ecma_op_arguments_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
const ecma_property_descriptor_t* property_desc_p, /**< property
* descriptor */
@@ -412,14 +418,8 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
// 3.
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (defined,
ecma_op_general_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
is_throw),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_general_object_define_own_property, defined,
obj_p, property_name_p, property_desc_p, is_throw);
// 5.
if (mapped_prop_p != NULL)
@@ -428,26 +428,28 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
if (property_desc_p->is_get_defined
|| property_desc_p->is_set_defined)
{
ecma_completion_value_t completion = ecma_op_object_delete (map_p, property_name_p, false);
ecma_completion_value_t completion;
ecma_op_object_delete (completion, map_p, property_name_p, false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
// 6.
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
else
{
// b.
ecma_completion_value_t completion = ecma_make_empty_completion_value ();
ecma_completion_value_t completion;
// i.
if (property_desc_p->is_value_defined)
{
completion = ecma_op_object_put (map_p,
property_name_p,
ecma_value_t (property_desc_p->value),
is_throw);
ecma_op_object_put (completion,
map_p,
property_name_p,
ecma_value_t (property_desc_p->value),
is_throw);
}
if (unlikely (ecma_is_completion_value_throw (completion)))
@@ -460,26 +462,24 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
if (property_desc_p->is_writable_defined
&& !property_desc_p->is_writable)
{
completion = ecma_op_object_delete (map_p,
property_name_p,
false);
ecma_op_object_delete (completion,
map_p,
property_name_p,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
}
// 6.
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
}
}
else
{
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
ECMA_FINALIZE (defined);
return ret_value;
} /* ecma_op_arguments_object_define_own_property */
/**
@@ -492,8 +492,9 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_arguments_object_delete (ecma_object_t *obj_p, /**< the object */
void
ecma_op_arguments_object_delete (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
bool is_throw) /**< flag that controls failure handling */
{
@@ -506,36 +507,30 @@ ecma_op_arguments_object_delete (ecma_object_t *obj_p, /**< the object */
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
// 3.
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (delete_in_args_ret,
ecma_op_general_object_delete (obj_p,
property_name_p,
is_throw),
ret_value);
ECMA_TRY_CATCH (ret_value, ecma_op_general_object_delete, delete_in_args_ret, obj_p, property_name_p, is_throw);
if (ecma_is_value_true (delete_in_args_ret))
{
if (mapped_prop_p != NULL)
{
ecma_completion_value_t delete_in_map_completion = ecma_op_object_delete (map_p,
property_name_p,
false);
ecma_completion_value_t delete_in_map_completion;
ecma_op_object_delete (delete_in_map_completion,
map_p,
property_name_p,
false);
JERRY_ASSERT (ecma_is_completion_value_normal_true (delete_in_map_completion));
}
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (delete_in_args_ret));
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
}
ECMA_FINALIZE (delete_in_args_ret);
return ret_value;
} /* ecma_op_arguments_object_delete */
/**
+15 -9
View File
@@ -28,15 +28,21 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p,
ecma_length_t arguments_list_length,
bool is_strict);
extern ecma_completion_value_t ecma_op_arguments_object_get (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t *ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_completion_value_t ecma_op_arguments_object_delete (ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern ecma_completion_value_t
ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p,
extern void
ecma_op_arguments_object_get (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t*
ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern void
ecma_op_arguments_object_delete (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern void
ecma_op_arguments_object_define_own_property (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_property_descriptor_t* property_desc_p,
bool is_throw);
+89 -75
View File
@@ -36,16 +36,17 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
static ecma_completion_value_t
ecma_reject (bool is_throw) /**< Throw flag */
static void
ecma_reject (ecma_completion_value_t &ret_value, /**< out: completion value */
bool is_throw) /**< Throw flag */
{
if (is_throw)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
}
} /* ecma_reject */
@@ -79,8 +80,9 @@ ecma_op_create_object_object_noarg (void)
*
* @return pointer to newly created 'Object' object
*/
ecma_completion_value_t
ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of constructor */
void
ecma_op_create_object_object_arg (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t& value) /**< argument of constructor */
{
ecma_check_value_type_is_spec_defined (value);
@@ -90,7 +92,7 @@ ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of co
|| ecma_is_value_boolean (value))
{
// 1.b, 1.c, 1.d
return ecma_op_to_object (value);
ecma_op_to_object (ret_value, value);
}
else
{
@@ -100,7 +102,7 @@ ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of co
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
}
} /* ecma_op_create_object_object_arg */
@@ -114,8 +116,9 @@ ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of co
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
void
ecma_op_general_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p) /**< property name */
{
JERRY_ASSERT(obj_p != NULL
@@ -128,7 +131,8 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
// 2.
if (prop_p == NULL)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
return;
}
// 3.
@@ -140,7 +144,7 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
ecma_value_t prop_value_copy;
ecma_copy_value (prop_value_copy, prop_value, true);
return ecma_make_normal_completion_value (prop_value_copy);
ecma_make_normal_completion_value (ret_value, prop_value_copy);
}
else
{
@@ -151,18 +155,17 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
// 5.
if (getter_p == NULL)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
return ecma_op_function_call (getter_p,
ecma_value_t (obj_p),
NULL,
0);
ecma_op_function_call (ret_value,
getter_p,
ecma_value_t (obj_p),
NULL,
0);
}
}
JERRY_UNREACHABLE();
} /* ecma_op_general_object_get */
/**
@@ -237,8 +240,9 @@ ecma_op_general_object_get_property (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
void
ecma_op_general_object_put (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
const ecma_value_t& value, /**< ecma-value */
bool is_throw) /**< flag that controls failure handling */
@@ -253,12 +257,14 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
if (is_throw)
{
// a.
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
return;
}
else
{
// b.
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
return;
}
}
@@ -277,10 +283,12 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
}
// b., c.
return ecma_op_object_define_own_property (obj_p,
property_name_p,
&value_desc,
is_throw);
ecma_op_object_define_own_property (ret_value,
obj_p,
property_name_p,
&value_desc,
is_throw);
return;
}
// 4.
@@ -295,20 +303,11 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
desc_p->u.named_accessor_property.set_p);
JERRY_ASSERT(setter_p != NULL);
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (ret_value, ecma_op_function_call, call_ret, setter_p, ecma_value_t (obj_p), &value, 1);
ECMA_TRY_CATCH (call_ret,
ecma_op_function_call (setter_p,
ecma_value_t (obj_p),
&value,
1),
ret_value);
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
ECMA_FINALIZE (call_ret);
return ret_value;
}
else
{
@@ -331,13 +330,12 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
}
// b.
return ecma_op_object_define_own_property (obj_p,
property_name_p,
&new_desc,
is_throw);
ecma_op_object_define_own_property (ret_value,
obj_p,
property_name_p,
&new_desc,
is_throw);
}
JERRY_UNREACHABLE();
} /* ecma_op_general_object_put */
/**
@@ -452,8 +450,9 @@ ecma_op_general_object_can_put (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_general_object_delete (ecma_object_t *obj_p, /**< the object */
void
ecma_op_general_object_delete (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
bool is_throw) /**< flag that controls failure handling */
{
@@ -467,7 +466,8 @@ ecma_op_general_object_delete (ecma_object_t *obj_p, /**< the object */
// 2.
if (desc_p == NULL)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
return;
}
// 3.
@@ -477,20 +477,18 @@ ecma_op_general_object_delete (ecma_object_t *obj_p, /**< the object */
ecma_delete_property (obj_p, desc_p);
// b.
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
}
else if (is_throw)
{
// 4.
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
// 5.
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
}
JERRY_UNREACHABLE();
} /* ecma_op_general_object_delete */
/**
@@ -503,8 +501,9 @@ ecma_op_general_object_delete (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
void
ecma_op_general_object_default_value (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_preferred_type_hint_t hint) /**< hint on preferred result type */
{
JERRY_ASSERT(obj_p != NULL
@@ -542,16 +541,18 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
ecma_string_t *function_name_p = ecma_get_magic_string (function_name_magic_string_id);
ecma_completion_value_t function_value_get_completion = ecma_op_object_get (obj_p, function_name_p);
ecma_completion_value_t function_value_get_completion;
ecma_op_object_get (function_value_get_completion, obj_p, function_name_p);
ecma_deref_ecma_string (function_name_p);
if (!ecma_is_completion_value_normal (function_value_get_completion))
{
return function_value_get_completion;
ret_value = function_value_get_completion;
return;
}
ecma_completion_value_t call_completion = ecma_make_empty_completion_value ();
ecma_completion_value_t call_completion;
ecma_value_t function_value_get;
ecma_get_completion_value_value (function_value_get, function_value_get_completion);
@@ -560,16 +561,18 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
{
ecma_object_t *func_obj_p = ecma_get_object_from_value (function_value_get);
call_completion = ecma_op_function_call (func_obj_p,
ecma_value_t (obj_p),
NULL, 0);
ecma_op_function_call (call_completion,
func_obj_p,
ecma_value_t (obj_p),
NULL, 0);
}
ecma_free_completion_value (function_value_get_completion);
if (!ecma_is_completion_value_normal (call_completion))
{
return call_completion;
ret_value = call_completion;
return;
}
if (!ecma_is_completion_value_empty (call_completion))
@@ -579,14 +582,15 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
if (!ecma_is_value_object (call_ret_value))
{
return call_completion;
ret_value = call_completion;
return;
}
}
ecma_free_completion_value (call_completion);
}
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
} /* ecma_op_general_object_default_value */
/**
@@ -599,8 +603,9 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the object */
void
ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
const ecma_property_descriptor_t* property_desc_p, /**< property
* descriptor */
@@ -630,7 +635,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
// 3.
if (!extensible)
{
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
// 4.
@@ -661,7 +667,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
}
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
return;
}
// 5.
@@ -669,7 +676,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
&& !property_desc_p->is_enumerable_defined
&& !property_desc_p->is_configurable_defined)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
return;
}
// 6.
@@ -739,7 +747,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
if (is_every_field_in_desc_also_occurs_in_current_desc_with_same_value)
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
return;
}
// 7.
@@ -750,7 +759,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
&& property_desc_p->is_enumerable != ecma_is_property_enumerable (current_p)))
{
// a., b.
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
}
@@ -765,7 +775,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
if (!ecma_is_property_configurable (current_p))
{
// a.
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
ecma_delete_property (obj_p, current_p);
@@ -803,7 +814,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
// i.
if (property_desc_p->is_writable)
{
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
// ii.
@@ -814,7 +826,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
&& !ecma_op_same_value (ecma_value_t (property_desc_p->value),
prop_value))
{
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
}
}
@@ -837,7 +850,8 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
current_p->u.named_accessor_property.set_p)))
{
// i., ii.
return ecma_reject (is_throw);
ecma_reject (ret_value, is_throw);
return;
}
}
}
@@ -887,7 +901,7 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
ecma_set_property_configurable_attr (current_p, property_desc_p->is_configurable);
}
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_TRUE);
} /* ecma_op_general_object_define_own_property */
/**
+36 -21
View File
@@ -27,28 +27,43 @@
* @{
*/
extern ecma_object_t* ecma_op_create_object_object_noarg (void);
extern ecma_completion_value_t ecma_op_create_object_object_arg (const ecma_value_t& value);
extern ecma_object_t*
ecma_op_create_object_object_noarg (void);
extern void
ecma_op_create_object_object_arg (ecma_completion_value_t &ret_value,
const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_general_object_get (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t *ecma_op_general_object_get_own_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t *ecma_op_general_object_get_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_completion_value_t ecma_op_general_object_put (ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_value_t& value,
bool is_throw);
extern bool ecma_op_general_object_can_put (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_completion_value_t ecma_op_general_object_delete (ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern ecma_completion_value_t ecma_op_general_object_default_value (ecma_object_t *obj_p,
ecma_preferred_type_hint_t hint);
extern ecma_completion_value_t
ecma_op_general_object_define_own_property (ecma_object_t *obj_p,
extern void
ecma_op_general_object_get (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t*
ecma_op_general_object_get_own_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t*
ecma_op_general_object_get_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern void
ecma_op_general_object_put (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_value_t& value,
bool is_throw);
extern bool
ecma_op_general_object_can_put (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern void
ecma_op_general_object_delete (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern void
ecma_op_general_object_default_value (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_preferred_type_hint_t hint);
extern void
ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_property_descriptor_t* property_desc_p,
bool is_throw);
+59 -39
View File
@@ -40,8 +40,9 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_object_get (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p) /**< property name */
{
JERRY_ASSERT(obj_p != NULL
@@ -60,19 +61,21 @@ ecma_op_object_get (ecma_object_t *obj_p, /**< the object */
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
case ECMA_OBJECT_TYPE_STRING:
{
return ecma_op_general_object_get (obj_p, property_name_p);
ecma_op_general_object_get (ret_value, obj_p, property_name_p);
return;
}
case ECMA_OBJECT_TYPE_ARGUMENTS:
{
return ecma_op_arguments_object_get (obj_p, property_name_p);
ecma_op_arguments_object_get (ret_value, obj_p, property_name_p);
return;
}
default:
{
JERRY_ASSERT (false);
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
}
}
} /* ecma_op_object_get */
@@ -218,8 +221,9 @@ ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_object_put (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_put (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
const ecma_value_t& value, /**< ecma-value */
bool is_throw) /**< flag that controls failure handling */
@@ -247,7 +251,7 @@ ecma_op_object_put (ecma_object_t *obj_p, /**< the object */
* return put[type] (obj_p, property_name_p);
*/
return ecma_op_general_object_put (obj_p, property_name_p, value, is_throw);
ecma_op_general_object_put (ret_value, obj_p, property_name_p, value, is_throw);
} /* ecma_op_object_put */
/**
@@ -298,8 +302,9 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_delete (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
bool is_throw) /**< flag that controls failure handling */
{
@@ -319,23 +324,27 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
case ECMA_OBJECT_TYPE_STRING:
{
return ecma_op_general_object_delete (obj_p,
property_name_p,
is_throw);
ecma_op_general_object_delete (ret_value,
obj_p,
property_name_p,
is_throw);
return;
}
case ECMA_OBJECT_TYPE_ARGUMENTS:
{
return ecma_op_arguments_object_delete (obj_p,
property_name_p,
is_throw);
ecma_op_arguments_object_delete (ret_value,
obj_p,
property_name_p,
is_throw);
return;
}
default:
{
JERRY_ASSERT (false);
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
}
}
} /* ecma_op_object_delete */
@@ -349,8 +358,9 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_default_value (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_preferred_type_hint_t hint) /**< hint on preferred result type */
{
JERRY_ASSERT(obj_p != NULL
@@ -375,7 +385,7 @@ ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */
* return default_value[type] (obj_p, property_name_p);
*/
return ecma_op_general_object_default_value (obj_p, hint);
ecma_op_general_object_default_value (ret_value, obj_p, hint);
} /* ecma_op_object_default_value */
/**
@@ -387,8 +397,9 @@ ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
ecma_string_t *property_name_p, /**< property name */
const ecma_property_descriptor_t* property_desc_p, /**< property
* descriptor */
@@ -409,33 +420,39 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
case ECMA_OBJECT_TYPE_STRING:
{
return ecma_op_general_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
is_throw);
ecma_op_general_object_define_own_property (ret_value,
obj_p,
property_name_p,
property_desc_p,
is_throw);
return;
}
case ECMA_OBJECT_TYPE_ARRAY:
{
return ecma_op_array_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
is_throw);
ecma_op_array_object_define_own_property (ret_value,
obj_p,
property_name_p,
property_desc_p,
is_throw);
return;
}
case ECMA_OBJECT_TYPE_ARGUMENTS:
{
return ecma_op_arguments_object_define_own_property (obj_p,
property_name_p,
property_desc_p,
is_throw);
ecma_op_arguments_object_define_own_property (ret_value,
obj_p,
property_name_p,
property_desc_p,
is_throw);
return;
}
default:
{
JERRY_ASSERT (false);
return ecma_make_empty_completion_value ();
ecma_make_empty_completion_value (ret_value);
}
}
} /* ecma_op_object_define_own_property */
@@ -446,8 +463,9 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */
* See also:
* ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 9
*/
ecma_completion_value_t
ecma_op_object_has_instance (ecma_object_t *obj_p, /**< the object */
void
ecma_op_object_has_instance (ecma_completion_value_t &ret_value, /**< out: completion value */
ecma_object_t *obj_p, /**< the object */
const ecma_value_t& value) /**< argument 'V' */
{
JERRY_ASSERT(obj_p != NULL
@@ -462,14 +480,16 @@ ecma_op_object_has_instance (ecma_object_t *obj_p, /**< the object */
case ECMA_OBJECT_TYPE_STRING:
case ECMA_OBJECT_TYPE_ARGUMENTS:
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
return;
}
case ECMA_OBJECT_TYPE_FUNCTION:
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
{
return ecma_op_function_has_instance (obj_p, value);
ecma_op_function_has_instance (ret_value, obj_p, value);
return;
}
case ECMA_OBJECT_TYPE__COUNT:
+35 -16
View File
@@ -27,25 +27,44 @@
* @{
*/
extern ecma_completion_value_t ecma_op_object_get (ecma_object_t *obj_p, ecma_string_t *property_name_p);
extern ecma_property_t *ecma_op_object_get_own_property (ecma_object_t *obj_p, ecma_string_t *property_name_p);
extern ecma_property_t *ecma_op_object_get_property (ecma_object_t *obj_p, ecma_string_t *property_name_p);
extern ecma_completion_value_t ecma_op_object_put (ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_value_t& value,
bool is_throw);
extern bool ecma_op_object_can_put (ecma_object_t *obj_p, ecma_string_t *property_name_p);
extern ecma_completion_value_t ecma_op_object_delete (ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern ecma_completion_value_t ecma_op_object_default_value (ecma_object_t *obj_p, ecma_preferred_type_hint_t hint);
extern ecma_completion_value_t
ecma_op_object_define_own_property (ecma_object_t *obj_p,
extern void
ecma_op_object_get (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t*
ecma_op_object_get_own_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern ecma_property_t*
ecma_op_object_get_property (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern void
ecma_op_object_put (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_value_t& value,
bool is_throw);
extern bool
ecma_op_object_can_put (ecma_object_t *obj_p,
ecma_string_t *property_name_p);
extern void
ecma_op_object_delete (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
bool is_throw);
extern void
ecma_op_object_default_value (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_preferred_type_hint_t hint);
extern void
ecma_op_object_define_own_property (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
ecma_string_t *property_name_p,
const ecma_property_descriptor_t* property_desc_p,
bool is_throw);
extern ecma_completion_value_t ecma_op_object_has_instance (ecma_object_t *obj_p,
const ecma_value_t& value);
extern void
ecma_op_object_has_instance (ecma_completion_value_t &ret_value,
ecma_object_t *obj_p,
const ecma_value_t& value);
/**
* @}
* @}
+8 -5
View File
@@ -38,8 +38,9 @@
* @return completion value
* Returned value must be freed with ecma_free_completion_value
*/
ecma_completion_value_t
ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of arguments that
void
ecma_op_create_string_object (ecma_completion_value_t &ret_value, /**< out: completion value */
const ecma_value_t *arguments_list_p, /**< list of arguments that
are passed to String constructor */
ecma_length_t arguments_list_len) /**< length of the arguments' list */
{
@@ -57,11 +58,13 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of
}
else
{
ecma_completion_value_t to_str_arg_completion = ecma_op_to_string (arguments_list_p [0]);
ecma_completion_value_t to_str_arg_completion;
ecma_op_to_string (to_str_arg_completion, arguments_list_p [0]);
if (ecma_is_completion_value_throw (to_str_arg_completion))
{
return to_str_arg_completion;
ret_value = to_str_arg_completion;
return;
}
else
{
@@ -108,7 +111,7 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of
ecma_set_named_data_property_value (length_prop_p, ecma_value_t (length_prop_value_p));
ecma_deref_ecma_string (length_magic_string_p);
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
} /* ecma_op_create_string_object */
/**
+3 -2
View File
@@ -26,8 +26,9 @@
* @{
*/
extern ecma_completion_value_t
ecma_op_create_string_object (const ecma_value_t *arguments_list_p,
extern void
ecma_op_create_string_object (ecma_completion_value_t &ret_value,
const ecma_value_t *arguments_list_p,
ecma_length_t arguments_list_len);
extern ecma_property_t*
+5 -6
View File
@@ -29,8 +29,9 @@
* Each ECMA_TRY_CATCH should have it's own corresponding ECMA_FINALIZE
* statement with same argument as corresponding ECMA_TRY_CATCH's first argument.
*/
#define ECMA_TRY_CATCH(var, op, return_value) \
ecma_completion_value_t var ## _completion = op; \
#define ECMA_TRY_CATCH(return_value, op, var, ...) \
ecma_completion_value_t var ## _completion; \
op (var ## _completion, __VA_ARGS__); \
if (unlikely (ecma_is_completion_value_throw (var ## _completion))) \
{ \
return_value = var ## _completion; \
@@ -65,7 +66,7 @@
* statement with same argument as corresponding ECMA_OP_TO_NUMBER_TRY_CATCH's first argument.
*/
#define ECMA_OP_TO_NUMBER_TRY_CATCH(num_var, value, return_value) \
JERRY_ASSERT (ecma_is_completion_value_empty (return_value)); \
ecma_make_empty_completion_value (return_value); \
ecma_number_t num_var = ecma_number_make_nan (); \
if (ecma_is_value_number (value)) \
{ \
@@ -73,9 +74,7 @@
} \
else \
{ \
ECMA_TRY_CATCH (to_number_value, \
ecma_op_to_number (value), \
return_value); \
ECMA_TRY_CATCH (return_value, ecma_op_to_number, to_number_value, value); \
\
num_var = *ecma_get_number_from_value (to_number_value); \
\