Moving to replacement of on-stack ecma_object_t* with managed ecma_object_ptr_t.
This commit is contained in:
@@ -43,7 +43,9 @@ ecma_reject (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
{
|
||||
if (is_throw)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -87,7 +89,9 @@ ecma_op_create_array_object (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
uint32_t num_uint32 = ecma_number_to_uint32 (*num_p);
|
||||
if (*num_p != ecma_uint32_to_number (num_uint32))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_RANGE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_RANGE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -105,12 +109,15 @@ ecma_op_create_array_object (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ARRAY_BUILTIN
|
||||
ecma_object_t *array_prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_ARRAY_PROTOTYPE);
|
||||
ecma_object_ptr_t array_prototype_obj_p;
|
||||
ecma_builtin_get (array_prototype_obj_p, ECMA_BUILTIN_ID_ARRAY_PROTOTYPE);
|
||||
#else /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ARRAY_BUILTIN */
|
||||
ecma_object_t *array_prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t array_prototype_obj_p;
|
||||
ecma_builtin_get (array_prototype_obj_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ARRAY_BUILTIN */
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (array_prototype_obj_p, true, ECMA_OBJECT_TYPE_ARRAY);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_create_object (obj_p, array_prototype_obj_p, true, ECMA_OBJECT_TYPE_ARRAY);
|
||||
ecma_deref_object (array_prototype_obj_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
@@ -174,7 +181,7 @@ ecma_op_create_array_object (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
*/
|
||||
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 */
|
||||
const ecma_object_ptr_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 */
|
||||
@@ -235,7 +242,9 @@ ecma_op_array_object_define_own_property (ecma_completion_value_t &ret_value, /*
|
||||
// d.
|
||||
if (ecma_uint32_to_number (new_len_uint32) != new_len_num)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_RANGE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_RANGE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -34,7 +34,7 @@ ecma_op_create_array_object (ecma_completion_value_t &ret_value,
|
||||
|
||||
extern void
|
||||
ecma_op_array_object_define_own_property (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *obj_p,
|
||||
const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p,
|
||||
const ecma_property_descriptor_t* property_desc_p,
|
||||
bool is_throw);
|
||||
|
||||
@@ -55,14 +55,15 @@ ecma_op_create_boolean_object (ecma_completion_value_t &ret_value, /**< out: com
|
||||
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
|
||||
|
||||
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE);
|
||||
#else /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN */
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN */
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (prototype_obj_p,
|
||||
true,
|
||||
ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_create_object (obj_p, prototype_obj_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
|
||||
@@ -121,7 +121,11 @@ ecma_op_abstract_equality_compare (ecma_completion_value_t &ret_value, /**< out:
|
||||
{ // f.
|
||||
JERRY_ASSERT(is_x_object);
|
||||
|
||||
bool is_equal = (ecma_get_object_from_value (x) == ecma_get_object_from_value (y));
|
||||
ecma_object_ptr_t x_obj_p, y_obj_p;
|
||||
ecma_get_object_from_value (x_obj_p, x);
|
||||
ecma_get_object_from_value (y_obj_p, y);
|
||||
|
||||
bool is_equal = (x_obj_p == y_obj_p);
|
||||
|
||||
ecma_make_simple_completion_value (ret_value, is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
@@ -302,7 +306,11 @@ ecma_op_strict_equality_compare (const ecma_value_t& x, /**< first operand */
|
||||
// 7. Return true if x and y refer to the same object. Otherwise, return false.
|
||||
JERRY_ASSERT (is_x_object);
|
||||
|
||||
return (ecma_get_object_from_value (x) == ecma_get_object_from_value (y));
|
||||
ecma_object_ptr_t x_obj_p, y_obj_p;
|
||||
ecma_get_object_from_value (x_obj_p, x);
|
||||
ecma_get_object_from_value (y_obj_p, y);
|
||||
|
||||
return (x_obj_p == y_obj_p);
|
||||
} /* ecma_op_strict_equality_compare */
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,7 +57,9 @@ ecma_op_check_object_coercible (ecma_completion_value_t &ret_value, /**< out: co
|
||||
if (ecma_is_value_undefined (value)
|
||||
|| ecma_is_value_null (value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -145,7 +147,11 @@ ecma_op_same_value (const ecma_value_t& x, /**< ecma-value */
|
||||
|
||||
JERRY_ASSERT(is_x_object);
|
||||
|
||||
return (ecma_get_object_from_value (x) == ecma_get_object_from_value (y));
|
||||
ecma_object_ptr_t x_obj_p, y_obj_p;
|
||||
ecma_get_object_from_value (x_obj_p, x);
|
||||
ecma_get_object_from_value (y_obj_p, y);
|
||||
|
||||
return (x_obj_p == y_obj_p);
|
||||
} /* ecma_op_same_value */
|
||||
|
||||
/**
|
||||
@@ -166,7 +172,8 @@ ecma_op_to_primitive (ecma_completion_value_t &ret_value, /**< out: completion v
|
||||
|
||||
if (ecma_is_value_object (value))
|
||||
{
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (value);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, value);
|
||||
|
||||
ecma_op_object_default_value (ret_value, obj_p, preferred_type);
|
||||
}
|
||||
@@ -413,7 +420,9 @@ ecma_op_to_object (ecma_completion_value_t &ret_value, /**< out: completion valu
|
||||
if (ecma_is_value_undefined (value)
|
||||
|| ecma_is_value_null (value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -432,11 +441,12 @@ ecma_op_to_object (ecma_completion_value_t &ret_value, /**< out: completion valu
|
||||
*
|
||||
* @return constructed object
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_desc_p) /**< property descriptor */
|
||||
void
|
||||
ecma_op_from_property_descriptor (ecma_object_ptr_t &obj_p, /**< out: object pointer */
|
||||
const ecma_property_descriptor_t* src_prop_desc_p) /**< property descriptor */
|
||||
{
|
||||
// 2.
|
||||
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
|
||||
ecma_op_create_object_object_noarg (obj_p);
|
||||
|
||||
ecma_completion_value_t completion;
|
||||
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
|
||||
@@ -554,8 +564,6 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
|
||||
false);
|
||||
ecma_deref_ecma_string (configurable_magic_string_p);
|
||||
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
|
||||
|
||||
return obj_p;
|
||||
} /* ecma_op_from_property_descriptor */
|
||||
|
||||
/**
|
||||
@@ -579,11 +587,14 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
// 1.
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (obj_value);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, obj_value);
|
||||
|
||||
// 2.
|
||||
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
|
||||
@@ -713,7 +724,9 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
if (!ecma_op_is_callable (get_prop_value)
|
||||
&& !ecma_is_value_undefined (get_prop_value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -727,10 +740,11 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_object (get_prop_value));
|
||||
|
||||
ecma_object_t *get_p = ecma_get_object_from_value (get_prop_value);
|
||||
ecma_object_ptr_t get_p;
|
||||
ecma_get_object_from_value (get_p, get_prop_value);
|
||||
ecma_ref_object (get_p);
|
||||
|
||||
prop_desc.get_p = get_p;
|
||||
prop_desc.get_p = (ecma_object_t*) get_p;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -755,7 +769,9 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
if (!ecma_op_is_callable (set_prop_value)
|
||||
&& !ecma_is_value_undefined (set_prop_value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -769,10 +785,11 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_object (set_prop_value));
|
||||
|
||||
ecma_object_t *set_p = ecma_get_object_from_value (set_prop_value);
|
||||
ecma_object_ptr_t set_p;
|
||||
ecma_get_object_from_value (set_p, set_prop_value);
|
||||
ecma_ref_object (set_p);
|
||||
|
||||
prop_desc.set_p = set_p;
|
||||
prop_desc.set_p = (ecma_object_t*) set_p;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -793,7 +810,9 @@ ecma_op_to_property_descriptor (ecma_completion_value_t &ret_value, /**< out: co
|
||||
if (prop_desc.is_value_defined
|
||||
|| prop_desc.is_writable_defined)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,8 +60,9 @@ 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 void
|
||||
ecma_op_from_property_descriptor (ecma_object_ptr_t &ret_val,
|
||||
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,
|
||||
|
||||
@@ -35,8 +35,9 @@
|
||||
* @return pointer to ecma-object representing specified error
|
||||
* with reference counter set to one.
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_new_standard_error (ecma_standard_error_t error_type) /**< native error type */
|
||||
void
|
||||
ecma_new_standard_error (ecma_object_ptr_t &new_error_obj_p, /**< out: object pointer */
|
||||
ecma_standard_error_t error_type) /**< native error type */
|
||||
{
|
||||
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS
|
||||
ecma_builtin_id_t prototype_id = ECMA_BUILTIN_ID__COUNT;
|
||||
@@ -86,23 +87,20 @@ ecma_new_standard_error (ecma_standard_error_t error_type) /**< native error typ
|
||||
}
|
||||
}
|
||||
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (prototype_id);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, prototype_id);
|
||||
|
||||
ecma_object_t *new_error_obj_p = ecma_create_object (prototype_obj_p,
|
||||
true,
|
||||
ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_create_object (new_error_obj_p, prototype_obj_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (new_error_obj_p,
|
||||
ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
class_prop_p->u.internal_property.value = ECMA_MAGIC_STRING_ERROR_UL;
|
||||
|
||||
return new_error_obj_p;
|
||||
#else /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS */
|
||||
(void) error_type;
|
||||
|
||||
return ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR);
|
||||
ecma_builtin_get (new_error_obj_p, ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR);
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS */
|
||||
} /* ecma_new_standard_error */
|
||||
|
||||
@@ -112,11 +110,12 @@ ecma_new_standard_error (ecma_standard_error_t error_type) /**< native error typ
|
||||
* @return pointer to ecma-object representing specified error
|
||||
* with reference counter set to one.
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< native error type */
|
||||
void
|
||||
ecma_new_standard_error_with_message (ecma_object_ptr_t &new_error_obj_p, /**< out: object pointer */
|
||||
ecma_standard_error_t error_type, /**< native error type */
|
||||
ecma_string_t* message_string_p) /**< message string */
|
||||
{
|
||||
ecma_object_t *new_error_obj_p = ecma_new_standard_error (error_type);
|
||||
ecma_new_standard_error (new_error_obj_p, error_type);
|
||||
|
||||
ecma_string_t *message_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_MESSAGE);
|
||||
ecma_property_t *prop_p = ecma_create_named_data_property (new_error_obj_p,
|
||||
@@ -126,8 +125,6 @@ ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< nat
|
||||
ecma_set_named_data_property_value (prop_p,
|
||||
ecma_value_t (ecma_copy_or_ref_ecma_string (message_string_p)));
|
||||
ecma_deref_ecma_string (message_magic_string_p);
|
||||
|
||||
return new_error_obj_p;
|
||||
} /* ecma_new_standard_error_with_message */
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2014 Samsung Electronics Co., Ltd.
|
||||
/* Copyright 2014-2015 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -44,9 +44,13 @@ typedef enum
|
||||
ECMA_ERROR_URI /**< URIError */
|
||||
} ecma_standard_error_t;
|
||||
|
||||
extern ecma_object_t *ecma_new_standard_error (ecma_standard_error_t error_type);
|
||||
extern ecma_object_t* ecma_new_standard_error_with_message (ecma_standard_error_t error_type,
|
||||
ecma_string_t *message_string_p);
|
||||
extern void
|
||||
ecma_new_standard_error (ecma_object_ptr_t &ret_val,
|
||||
ecma_standard_error_t error_type);
|
||||
extern void
|
||||
ecma_new_standard_error_with_message (ecma_object_ptr_t &ret_val,
|
||||
ecma_standard_error_t error_type,
|
||||
ecma_string_t *message_string_p);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
||||
@@ -94,9 +94,10 @@ ecma_op_is_callable (const ecma_value_t& value) /**< ecma-value */
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (value);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, value);
|
||||
|
||||
JERRY_ASSERT(obj_p != NULL);
|
||||
JERRY_ASSERT(obj_p.is_not_null ());
|
||||
JERRY_ASSERT(!ecma_is_lexical_environment (obj_p));
|
||||
|
||||
return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION
|
||||
@@ -118,9 +119,10 @@ ecma_is_constructor (const ecma_value_t& value) /**< ecma-value */
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (value);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, value);
|
||||
|
||||
JERRY_ASSERT(obj_p != NULL);
|
||||
JERRY_ASSERT(obj_p.is_not_null ());
|
||||
JERRY_ASSERT(!ecma_is_lexical_environment (obj_p));
|
||||
|
||||
return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION
|
||||
@@ -134,17 +136,19 @@ ecma_is_constructor (const ecma_value_t& value) /**< ecma-value */
|
||||
*
|
||||
* @return pointer to newly created Function object
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< formal parameters list */
|
||||
void
|
||||
ecma_op_create_function_object (ecma_object_ptr_t &function_obj_p, /**< out: object pointer */
|
||||
ecma_string_t* formal_parameter_list_p[], /**< formal parameters list */
|
||||
ecma_length_t formal_parameters_number, /**< formal parameters list's length */
|
||||
ecma_object_t *scope_p, /**< function's scope */
|
||||
const ecma_object_ptr_t& scope_p, /**< function's scope */
|
||||
bool is_strict, /**< 'strict' flag */
|
||||
opcode_counter_t first_opcode_idx) /**< index of first opcode of function's body */
|
||||
{
|
||||
// 1., 4., 13.
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE);
|
||||
|
||||
ecma_object_t *f = ecma_create_object (prototype_obj_p, true, ECMA_OBJECT_TYPE_FUNCTION);
|
||||
ecma_create_object (function_obj_p, prototype_obj_p, true, ECMA_OBJECT_TYPE_FUNCTION);
|
||||
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
@@ -156,16 +160,19 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
*/
|
||||
|
||||
// 3.
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (f, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (function_obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
class_prop_p->u.internal_property.value = ECMA_MAGIC_STRING_FUNCTION_UL;
|
||||
|
||||
// 9.
|
||||
ecma_property_t *scope_prop_p = ecma_create_internal_property (f, ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
ECMA_SET_POINTER(scope_prop_p->u.internal_property.value, scope_p);
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (f, scope_p);
|
||||
ecma_property_t *scope_prop_p = ecma_create_internal_property (function_obj_p, ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
{
|
||||
ecma_object_t *scope_tmp_p = (ecma_object_t*) scope_p;
|
||||
ECMA_SET_POINTER(scope_prop_p->u.internal_property.value, scope_tmp_p);
|
||||
}
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (function_obj_p, scope_p);
|
||||
|
||||
// 10., 11.
|
||||
ecma_property_t *formal_parameters_prop_p = ecma_create_internal_property (f,
|
||||
ecma_property_t *formal_parameters_prop_p = ecma_create_internal_property (function_obj_p,
|
||||
ECMA_INTERNAL_PROPERTY_FORMAL_PARAMETERS);
|
||||
if (formal_parameters_number != 0)
|
||||
{
|
||||
@@ -179,7 +186,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
}
|
||||
|
||||
// 12.
|
||||
ecma_property_t *code_prop_p = ecma_create_internal_property (f, ECMA_INTERNAL_PROPERTY_CODE);
|
||||
ecma_property_t *code_prop_p = ecma_create_internal_property (function_obj_p, ECMA_INTERNAL_PROPERTY_CODE);
|
||||
code_prop_p->u.internal_property.value = ecma_pack_code_internal_property_value (is_strict,
|
||||
first_opcode_idx);
|
||||
|
||||
@@ -195,7 +202,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
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 (completion,
|
||||
f,
|
||||
function_obj_p,
|
||||
magic_string_length_p,
|
||||
&length_prop_desc,
|
||||
false);
|
||||
@@ -208,13 +215,14 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
len_p = NULL;
|
||||
|
||||
// 16.
|
||||
ecma_object_t *proto_p = ecma_op_create_object_object_noarg ();
|
||||
ecma_object_ptr_t proto_p;
|
||||
ecma_op_create_object_object_noarg (proto_p);
|
||||
|
||||
// 17.
|
||||
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
|
||||
{
|
||||
prop_desc.is_value_defined = true;
|
||||
prop_desc.value = (ecma_value_packed_t) ecma_value_t (f);
|
||||
prop_desc.value = (ecma_value_packed_t) ecma_value_t (function_obj_p);
|
||||
|
||||
prop_desc.is_writable_defined = true;
|
||||
prop_desc.is_writable = true;
|
||||
@@ -242,7 +250,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
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 (completion,
|
||||
f,
|
||||
function_obj_p,
|
||||
magic_string_prototype_p,
|
||||
&prop_desc,
|
||||
false);
|
||||
@@ -256,7 +264,8 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
// 19.
|
||||
if (is_strict)
|
||||
{
|
||||
ecma_object_t *thrower_p = ecma_builtin_get (ECMA_BUILTIN_ID_TYPE_ERROR_THROWER);
|
||||
ecma_object_ptr_t thrower_p;
|
||||
ecma_builtin_get (thrower_p, ECMA_BUILTIN_ID_TYPE_ERROR_THROWER);
|
||||
|
||||
prop_desc = ecma_make_empty_property_descriptor ();
|
||||
{
|
||||
@@ -267,15 +276,15 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
prop_desc.is_configurable = false;
|
||||
|
||||
prop_desc.is_get_defined = true;
|
||||
prop_desc.get_p = thrower_p;
|
||||
prop_desc.get_p = (ecma_object_t*) thrower_p;
|
||||
|
||||
prop_desc.is_set_defined = true;
|
||||
prop_desc.set_p = thrower_p;
|
||||
prop_desc.set_p = (ecma_object_t*) thrower_p;
|
||||
}
|
||||
|
||||
ecma_string_t *magic_string_caller_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CALLER);
|
||||
ecma_op_object_define_own_property (completion,
|
||||
f,
|
||||
function_obj_p,
|
||||
magic_string_caller_p,
|
||||
&prop_desc,
|
||||
false);
|
||||
@@ -286,7 +295,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
|
||||
ecma_string_t *magic_string_arguments_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS);
|
||||
ecma_op_object_define_own_property (completion,
|
||||
f,
|
||||
function_obj_p,
|
||||
magic_string_arguments_p,
|
||||
&prop_desc,
|
||||
false);
|
||||
@@ -297,8 +306,6 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
|
||||
ecma_deref_object (thrower_p);
|
||||
}
|
||||
|
||||
return f;
|
||||
} /* ecma_op_create_function_object */
|
||||
|
||||
/**
|
||||
@@ -312,8 +319,8 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
|
||||
*/
|
||||
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_object_ptr_t& func_obj_p, /**< Function object */
|
||||
const ecma_object_ptr_t& env_p, /**< lexical environment */
|
||||
const ecma_value_t *arguments_list_p, /**< arguments list */
|
||||
ecma_length_t arguments_list_len, /**< length of argument list */
|
||||
bool is_strict) /**< flag indicating strict mode */
|
||||
@@ -399,10 +406,10 @@ ecma_function_call_setup_args_variables (ecma_completion_value_t &ret_value, /**
|
||||
*/
|
||||
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_object_ptr_t& func_obj_p, /**< Function object */
|
||||
const ecma_value_t& value) /**< argument 'V' */
|
||||
{
|
||||
JERRY_ASSERT(func_obj_p != NULL
|
||||
JERRY_ASSERT(func_obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (func_obj_p));
|
||||
|
||||
if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION)
|
||||
@@ -413,7 +420,8 @@ ecma_op_function_has_instance (ecma_completion_value_t &ret_value, /**< out: com
|
||||
return;
|
||||
}
|
||||
|
||||
ecma_object_t* v_obj_p = ecma_get_object_from_value (value);
|
||||
ecma_object_ptr_t v_obj_p;
|
||||
ecma_get_object_from_value (v_obj_p, value);
|
||||
|
||||
ecma_string_t *prototype_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE);
|
||||
|
||||
@@ -421,19 +429,22 @@ ecma_op_function_has_instance (ecma_completion_value_t &ret_value, /**< out: com
|
||||
|
||||
if (!ecma_is_value_object (prototype_obj_value))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_object_t *prototype_obj_p = ecma_get_object_from_value (prototype_obj_value);
|
||||
JERRY_ASSERT (prototype_obj_p != NULL);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_get_object_from_value (prototype_obj_p, prototype_obj_value);
|
||||
JERRY_ASSERT (prototype_obj_p.is_not_null ());
|
||||
|
||||
do
|
||||
{
|
||||
v_obj_p = ecma_get_object_prototype (v_obj_p);
|
||||
ecma_get_object_prototype (v_obj_p, v_obj_p);
|
||||
|
||||
if (v_obj_p == NULL)
|
||||
if (v_obj_p.is_null ())
|
||||
{
|
||||
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_FALSE);
|
||||
|
||||
@@ -454,7 +465,9 @@ ecma_op_function_has_instance (ecma_completion_value_t &ret_value, /**< out: com
|
||||
}
|
||||
else if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -476,12 +489,12 @@ ecma_op_function_has_instance (ecma_completion_value_t &ret_value, /**< out: com
|
||||
*/
|
||||
void
|
||||
ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *func_obj_p, /**< Function object */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
JERRY_ASSERT(func_obj_p != NULL
|
||||
JERRY_ASSERT(func_obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (func_obj_p));
|
||||
JERRY_ASSERT(ecma_op_is_callable (ecma_value_t (func_obj_p)));
|
||||
JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL);
|
||||
@@ -499,8 +512,8 @@ ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
ecma_property_t *scope_prop_p = ecma_get_internal_property (func_obj_p, ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
ecma_property_t *code_prop_p = ecma_get_internal_property (func_obj_p, ECMA_INTERNAL_PROPERTY_CODE);
|
||||
|
||||
ecma_object_t *scope_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
scope_prop_p->u.internal_property.value);
|
||||
ecma_object_ptr_t scope_p;
|
||||
scope_p.unpack_from (scope_prop_p->u.internal_property.value);
|
||||
uint32_t code_prop_value = code_prop_p->u.internal_property.value;
|
||||
|
||||
bool is_strict;
|
||||
@@ -517,7 +530,9 @@ ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
|| ecma_is_value_null (this_arg_value))
|
||||
{
|
||||
// 2.
|
||||
this_binding = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
|
||||
ecma_object_ptr_t global_obj_p;
|
||||
ecma_builtin_get (global_obj_p, ECMA_BUILTIN_ID_GLOBAL);
|
||||
this_binding = global_obj_p;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -530,7 +545,8 @@ ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
}
|
||||
|
||||
// 5.
|
||||
ecma_object_t *local_env_p = ecma_create_decl_lex_env (scope_p);
|
||||
ecma_object_ptr_t local_env_p;
|
||||
ecma_create_decl_lex_env (local_env_p, scope_p);
|
||||
|
||||
// 9.
|
||||
ECMA_TRY_CATCH (ret_value, ecma_function_call_setup_args_variables, args_var_declaration_ret,
|
||||
@@ -582,11 +598,11 @@ ecma_op_function_call (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
*/
|
||||
void
|
||||
ecma_op_function_construct (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *func_obj_p, /**< Function object */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
JERRY_ASSERT(func_obj_p != NULL
|
||||
JERRY_ASSERT(func_obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (func_obj_p));
|
||||
JERRY_ASSERT(ecma_is_constructor (ecma_value_t (func_obj_p)));
|
||||
JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL);
|
||||
@@ -606,20 +622,21 @@ ecma_op_function_construct (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
ecma_op_object_get, func_obj_prototype_prop_value, func_obj_p, prototype_magic_string_p);
|
||||
|
||||
// 6.
|
||||
ecma_object_t *prototype_p;
|
||||
ecma_object_ptr_t prototype_p;
|
||||
if (ecma_is_value_object (func_obj_prototype_prop_value))
|
||||
{
|
||||
prototype_p = ecma_get_object_from_value (func_obj_prototype_prop_value);
|
||||
ecma_get_object_from_value (prototype_p, func_obj_prototype_prop_value);
|
||||
ecma_ref_object (prototype_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 7.
|
||||
prototype_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_builtin_get (prototype_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
}
|
||||
|
||||
// 1., 2., 4.
|
||||
ecma_object_t *obj_p = ecma_create_object (prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_create_object (obj_p, prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
|
||||
// 3.
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
@@ -671,7 +688,7 @@ ecma_op_function_construct (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
*/
|
||||
void
|
||||
ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
const ecma_object_ptr_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 */
|
||||
@@ -681,11 +698,13 @@ ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
is declared in eval code */
|
||||
{
|
||||
// b.
|
||||
ecma_object_t *func_obj_p = ecma_op_create_function_object (formal_parameter_list_p,
|
||||
formal_parameter_list_length,
|
||||
lex_env_p,
|
||||
is_strict,
|
||||
function_code_opcode_idx);
|
||||
ecma_object_ptr_t func_obj_p;
|
||||
ecma_op_create_function_object (func_obj_p,
|
||||
formal_parameter_list_p,
|
||||
formal_parameter_list_length,
|
||||
lex_env_p,
|
||||
is_strict,
|
||||
function_code_opcode_idx);
|
||||
|
||||
// c.
|
||||
bool func_already_declared = ecma_op_has_binding (lex_env_p, function_name_p);
|
||||
@@ -704,7 +723,8 @@ ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
else if (ecma_is_lexical_environment_global (lex_env_p))
|
||||
{
|
||||
// e.
|
||||
ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
|
||||
ecma_object_ptr_t glob_obj_p;
|
||||
ecma_builtin_get (glob_obj_p, ECMA_BUILTIN_ID_GLOBAL);
|
||||
|
||||
ecma_property_t *existing_prop_p = ecma_op_object_get_property (glob_obj_p, function_name_p);
|
||||
|
||||
@@ -733,7 +753,9 @@ ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
}
|
||||
else if (existing_prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (completion, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (completion, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -742,7 +764,9 @@ ecma_op_function_declaration (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
if (!ecma_is_property_writable (existing_prop_p)
|
||||
|| !ecma_is_property_enumerable (existing_prop_p))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (completion, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (completion, exception_obj_p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,34 +30,35 @@
|
||||
extern bool ecma_op_is_callable (const ecma_value_t& value);
|
||||
extern bool ecma_is_constructor (const ecma_value_t& value);
|
||||
|
||||
extern ecma_object_t*
|
||||
ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[],
|
||||
extern void
|
||||
ecma_op_create_function_object (ecma_object_ptr_t &ret_val,
|
||||
ecma_string_t* formal_parameter_list_p[],
|
||||
ecma_length_t formal_parameters_number,
|
||||
ecma_object_t *scope_p,
|
||||
const ecma_object_ptr_t& scope_p,
|
||||
bool is_strict,
|
||||
opcode_counter_t first_opcode_idx);
|
||||
|
||||
extern void
|
||||
ecma_op_function_call (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *func_obj_p,
|
||||
const ecma_object_ptr_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 void
|
||||
ecma_op_function_construct (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *func_obj_p,
|
||||
const ecma_object_ptr_t& func_obj_p,
|
||||
const ecma_value_t* arguments_list_p,
|
||||
ecma_length_t arguments_list_len);
|
||||
|
||||
extern void
|
||||
ecma_op_function_has_instance (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *func_obj_p,
|
||||
const ecma_object_ptr_t& func_obj_p,
|
||||
const ecma_value_t& value);
|
||||
|
||||
extern void
|
||||
ecma_op_function_declaration (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *lex_env_p,
|
||||
const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *function_name_p,
|
||||
opcode_counter_t function_code_opcode_idx,
|
||||
ecma_string_t* formal_parameter_list_p[],
|
||||
|
||||
@@ -45,21 +45,24 @@
|
||||
*/
|
||||
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) */
|
||||
const ecma_object_ptr_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 bool is_unresolvable_reference = (ref_base_lex_env_p == NULL);
|
||||
const bool is_unresolvable_reference = (ref_base_lex_env_p.is_null ());
|
||||
|
||||
// 3.
|
||||
if (unlikely (is_unresolvable_reference))
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_REFERENCE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
|
||||
// 5.
|
||||
JERRY_ASSERT(ref_base_lex_env_p != NULL
|
||||
JERRY_ASSERT(ref_base_lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (ref_base_lex_env_p));
|
||||
|
||||
// 5.a
|
||||
@@ -86,8 +89,14 @@ ecma_op_get_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
const bool has_primitive_base = (ecma_is_value_boolean (base)
|
||||
|| ecma_is_value_number (base)
|
||||
|| ecma_is_value_string (base));
|
||||
const bool has_object_base = (ecma_is_value_object (base)
|
||||
&& !(ecma_is_lexical_environment (ecma_get_object_from_value (base))));
|
||||
bool has_object_base = false;
|
||||
if (ecma_is_value_object (base))
|
||||
{
|
||||
ecma_object_ptr_t base_obj_p;
|
||||
ecma_get_object_from_value (base_obj_p, base);
|
||||
|
||||
has_object_base = !ecma_is_lexical_environment (base_obj_p);
|
||||
}
|
||||
const bool is_property_reference = has_primitive_base || has_object_base;
|
||||
|
||||
JERRY_ASSERT (!is_unresolvable_reference);
|
||||
@@ -98,8 +107,9 @@ ecma_op_get_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
{
|
||||
// 4.b case 1
|
||||
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (base);
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, base);
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
ecma_op_object_get (ret_value, obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
|
||||
@@ -110,8 +120,9 @@ ecma_op_get_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
// 4.b case 2
|
||||
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_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, obj_base);
|
||||
JERRY_ASSERT (obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
ecma_op_object_get (ret_value, obj_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t,
|
||||
@@ -131,12 +142,13 @@ ecma_op_get_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
*/
|
||||
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) */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
const bool is_unresolvable_reference = (ref_base_lex_env_p == NULL);
|
||||
const bool is_unresolvable_reference = (ref_base_lex_env_p.is_null ());
|
||||
|
||||
// 3.
|
||||
if (unlikely (is_unresolvable_reference))
|
||||
@@ -144,13 +156,16 @@ ecma_op_put_value_lex_env_base (ecma_completion_value_t &ret_value, /**< out: co
|
||||
// 3.a.
|
||||
if (is_strict)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_REFERENCE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 3.b.
|
||||
ecma_object_t *global_object_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
|
||||
ecma_object_ptr_t global_object_p;
|
||||
ecma_builtin_get (global_object_p, ECMA_BUILTIN_ID_GLOBAL);
|
||||
|
||||
ecma_completion_value_t completion;
|
||||
ecma_op_object_put (completion,
|
||||
@@ -170,7 +185,7 @@ ecma_op_put_value_lex_env_base (ecma_completion_value_t &ret_value, /**< out: co
|
||||
}
|
||||
|
||||
// 5.
|
||||
JERRY_ASSERT(ref_base_lex_env_p != NULL
|
||||
JERRY_ASSERT(ref_base_lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (ref_base_lex_env_p));
|
||||
|
||||
// 5.a
|
||||
@@ -193,7 +208,9 @@ ecma_reject_put (ecma_completion_value_t &ret_value, /**< out: completion value
|
||||
{
|
||||
if (is_throw)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -219,8 +236,14 @@ ecma_op_put_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
const bool has_primitive_base = (ecma_is_value_boolean (base)
|
||||
|| ecma_is_value_number (base)
|
||||
|| ecma_is_value_string (base));
|
||||
const bool has_object_base = (ecma_is_value_object (base)
|
||||
&& !(ecma_is_lexical_environment (ecma_get_object_from_value (base))));
|
||||
bool has_object_base = false;
|
||||
if (ecma_is_value_object (base))
|
||||
{
|
||||
ecma_object_ptr_t base_obj_p;
|
||||
ecma_get_object_from_value (base_obj_p, base);
|
||||
|
||||
has_object_base = !ecma_is_lexical_environment (base_obj_p);
|
||||
}
|
||||
const bool is_property_reference = has_primitive_base || has_object_base;
|
||||
|
||||
JERRY_ASSERT (!is_unresolvable_reference);
|
||||
@@ -231,8 +254,9 @@ ecma_op_put_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
{
|
||||
// 4.b case 1
|
||||
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (base);
|
||||
JERRY_ASSERT (obj_p != NULL
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, base);
|
||||
JERRY_ASSERT (obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
ECMA_TRY_CATCH (ret_value, ecma_op_object_put, put_ret_value, obj_p,
|
||||
@@ -251,8 +275,9 @@ ecma_op_put_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
// sub_1.
|
||||
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_object_ptr_t obj_p;
|
||||
ecma_get_object_from_value (obj_p, obj_base);
|
||||
JERRY_ASSERT (obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
ecma_string_t *referenced_name_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t,
|
||||
@@ -284,9 +309,9 @@ ecma_op_put_value_object_base (ecma_completion_value_t &ret_value, /**< out: com
|
||||
// sub_6.
|
||||
JERRY_ASSERT (prop_p != NULL && prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR);
|
||||
|
||||
ecma_object_t *setter_p = ECMA_GET_NON_NULL_POINTER(ecma_object_t,
|
||||
prop_p->u.named_accessor_property.set_p);
|
||||
JERRY_ASSERT (setter_p != NULL);
|
||||
ecma_object_ptr_t setter_p;
|
||||
setter_p.unpack_from (prop_p->u.named_accessor_property.set_p);
|
||||
JERRY_ASSERT (setter_p.is_not_null ());
|
||||
|
||||
ECMA_TRY_CATCH (ret_value, ecma_op_function_call, call_ret, setter_p, base, &value, 1);
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@
|
||||
* @return true / false
|
||||
*/
|
||||
bool
|
||||
ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
ecma_op_has_binding (const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p) /**< argument N */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
|
||||
if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
|
||||
@@ -55,7 +55,8 @@ ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
|
||||
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
return (ecma_op_object_get_property (binding_obj_p, name_p) != NULL);
|
||||
}
|
||||
@@ -71,11 +72,11 @@ ecma_op_has_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 */
|
||||
const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p, /**< argument N */
|
||||
bool is_deletable) /**< argument D */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT(name_p != NULL);
|
||||
|
||||
@@ -89,7 +90,8 @@ ecma_op_create_mutable_binding (ecma_completion_value_t &ret_value, /**< out: co
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
|
||||
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
|
||||
{
|
||||
@@ -138,12 +140,12 @@ ecma_op_create_mutable_binding (ecma_completion_value_t &ret_value, /**< out: co
|
||||
*/
|
||||
void
|
||||
ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT(name_p != NULL);
|
||||
|
||||
@@ -164,7 +166,9 @@ ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
|
||||
if (is_equal)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
|
||||
ecma_object_ptr_t cp_error_obj_p;
|
||||
ecma_builtin_get (cp_error_obj_p, ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR);
|
||||
ecma_make_throw_obj_completion_value (ret_value, cp_error_obj_p);
|
||||
return;
|
||||
}
|
||||
# endif /* CONFIG_ECMA_COMPACT_PROFILE */
|
||||
@@ -178,7 +182,9 @@ ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
}
|
||||
else if (is_strict)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -186,7 +192,8 @@ ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
|
||||
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
ecma_completion_value_t completion;
|
||||
ecma_op_object_put (completion,
|
||||
@@ -220,11 +227,11 @@ ecma_op_set_mutable_binding (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
*/
|
||||
void
|
||||
ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p, /**< argument N */
|
||||
bool is_strict) /**< argument S */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT(name_p != NULL);
|
||||
|
||||
@@ -245,7 +252,9 @@ ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: complet
|
||||
|
||||
if (is_equal)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
|
||||
ecma_object_ptr_t cp_error_obj_p;
|
||||
ecma_builtin_get (cp_error_obj_p, ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR);
|
||||
ecma_make_throw_obj_completion_value (ret_value, cp_error_obj_p);
|
||||
return;
|
||||
}
|
||||
# endif /* CONFIG_ECMA_COMPACT_PROFILE */
|
||||
@@ -263,7 +272,9 @@ ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: complet
|
||||
/* unitialized immutable binding */
|
||||
if (is_strict)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_REFERENCE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -282,13 +293,16 @@ ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: complet
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
|
||||
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
if (ecma_op_object_get_property (binding_obj_p, name_p) == NULL)
|
||||
{
|
||||
if (is_strict)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_REFERENCE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_REFERENCE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -313,10 +327,10 @@ ecma_op_get_binding_value (ecma_completion_value_t &ret_value, /**< out: complet
|
||||
*/
|
||||
void
|
||||
ecma_op_delete_binding (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p) /**< argument N */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT(name_p != NULL);
|
||||
|
||||
@@ -352,7 +366,8 @@ ecma_op_delete_binding (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
|
||||
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
ecma_op_object_delete (ret_value, binding_obj_p, name_p, false);
|
||||
}
|
||||
@@ -368,9 +383,9 @@ ecma_op_delete_binding (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
*/
|
||||
void
|
||||
ecma_op_implicit_this_value (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *lex_env_p) /**< lexical environment */
|
||||
const ecma_object_ptr_t& lex_env_p) /**< lexical environment */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
|
||||
if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
|
||||
@@ -383,7 +398,8 @@ ecma_op_implicit_this_value (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
|
||||
if (ecma_get_lex_env_provide_this (lex_env_p))
|
||||
{
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
ecma_ref_object (binding_obj_p);
|
||||
|
||||
ecma_make_normal_completion_value (ret_value, ecma_value_t (binding_obj_p));
|
||||
@@ -401,10 +417,10 @@ ecma_op_implicit_this_value (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
* See also: ECMA-262 v5, 10.2.1
|
||||
*/
|
||||
void
|
||||
ecma_op_create_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
ecma_op_create_immutable_binding (const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p) /**< argument N */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE);
|
||||
|
||||
@@ -433,11 +449,11 @@ ecma_op_create_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environ
|
||||
* See also: ECMA-262 v5, 10.2.1
|
||||
*/
|
||||
void
|
||||
ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
ecma_op_initialize_immutable_binding (const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p, /**< argument N */
|
||||
const ecma_value_t& value) /**< argument V */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE);
|
||||
|
||||
@@ -460,17 +476,18 @@ ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p, /**< lexical env
|
||||
*
|
||||
* @return pointer to created lexical environment
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_op_create_global_environment (ecma_object_t *glob_obj_p) /**< the Global object */
|
||||
void
|
||||
ecma_op_create_global_environment (ecma_object_ptr_t &glob_env_p, /**< out: object pointer */
|
||||
const ecma_object_ptr_t& glob_obj_p) /**< the Global object */
|
||||
{
|
||||
ecma_object_ptr_t null_pointer;
|
||||
|
||||
#ifdef CONFIG_ECMA_GLOBAL_ENVIRONMENT_DECLARATIVE
|
||||
(void) glob_obj_p;
|
||||
ecma_object_t *glob_env_p = ecma_create_decl_lex_env (NULL);
|
||||
ecma_create_decl_lex_env (glob_env_p, null_pointer);
|
||||
#else /* !CONFIG_ECMA_GLOBAL_ENVIRONMENT_DECLARATIVE */
|
||||
ecma_object_t *glob_env_p = ecma_create_object_lex_env (NULL, glob_obj_p, false);
|
||||
ecma_create_object_lex_env (glob_env_p, null_pointer, glob_obj_p, false);
|
||||
#endif /* !CONFIG_ECMA_GLOBAL_ENVIRONMENT_DECLARATIVE */
|
||||
|
||||
return glob_env_p;
|
||||
} /* ecma_op_create_global_environment */
|
||||
|
||||
/**
|
||||
@@ -480,16 +497,17 @@ ecma_op_create_global_environment (ecma_object_t *glob_obj_p) /**< the Global ob
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool
|
||||
ecma_is_lexical_environment_global (ecma_object_t *lex_env_p) /**< lexical environment */
|
||||
ecma_is_lexical_environment_global (const ecma_object_ptr_t& lex_env_p) /**< lexical environment */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
|
||||
ecma_lexical_environment_type_t type = ecma_get_lex_env_type (lex_env_p);
|
||||
|
||||
if (type == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND)
|
||||
{
|
||||
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
|
||||
ecma_object_ptr_t binding_obj_p;
|
||||
ecma_get_lex_env_binding_object (binding_obj_p, lex_env_p);
|
||||
|
||||
return ecma_builtin_is (binding_obj_p, ECMA_BUILTIN_ID_GLOBAL);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/* ECMA-262 v5, 8.7.1 and 8.7.2 */
|
||||
extern void
|
||||
ecma_op_get_value_lex_env_base (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *ref_base_lex_env_p,
|
||||
const ecma_object_ptr_t& ref_base_lex_env_p,
|
||||
ecma_string_t *var_name_string_p,
|
||||
bool is_strict);
|
||||
extern void
|
||||
@@ -41,7 +41,7 @@ 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,
|
||||
const ecma_object_ptr_t& ref_base_lex_env_p,
|
||||
ecma_string_t *var_name_string_p,
|
||||
bool is_strict,
|
||||
const ecma_value_t& value);
|
||||
@@ -51,41 +51,41 @@ ecma_op_put_value_object_base (ecma_completion_value_t &ret_value,
|
||||
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,
|
||||
extern bool ecma_op_has_binding (const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *name_p);
|
||||
extern void
|
||||
ecma_op_create_mutable_binding (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *lex_env_p,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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);
|
||||
const ecma_object_ptr_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,
|
||||
extern void ecma_op_create_immutable_binding (const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *name_p);
|
||||
extern void ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p,
|
||||
extern void ecma_op_initialize_immutable_binding (const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *name_p,
|
||||
const ecma_value_t& value);
|
||||
|
||||
extern ecma_object_t* ecma_op_create_global_environment (ecma_object_t *glob_obj_p);
|
||||
extern bool ecma_is_lexical_environment_global (ecma_object_t *lex_env_p);
|
||||
extern void ecma_op_create_global_environment (ecma_object_ptr_t &ret_val, const ecma_object_ptr_t& glob_obj_p);
|
||||
extern bool ecma_is_lexical_environment_global (const ecma_object_ptr_t& lex_env_p);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
||||
@@ -57,14 +57,15 @@ ecma_op_create_number_object (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
ecma_number_t *prim_value_p = ecma_get_number_from_value (num_value);
|
||||
|
||||
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_NUMBER_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_NUMBER_PROTOTYPE);
|
||||
#else /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN */
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN */
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (prototype_obj_p,
|
||||
true,
|
||||
ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_create_object (obj_p, prototype_obj_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
|
||||
@@ -40,9 +40,10 @@
|
||||
*
|
||||
* @return pointer to newly created Arguments object
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment the Arguments
|
||||
void
|
||||
ecma_create_arguments_object (ecma_object_ptr_t &obj_p, /**< out: object pointer */
|
||||
const ecma_object_ptr_t& func_obj_p, /**< callee function */
|
||||
const ecma_object_ptr_t& lex_env_p, /**< lexical environment the Arguments
|
||||
object is created for */
|
||||
ecma_collection_iterator_t *formal_params_iter_p, /**< formal parameters
|
||||
collection iterator */
|
||||
@@ -55,9 +56,10 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
*len_p = ecma_uint32_to_number (arguments_list_length);
|
||||
|
||||
// 2., 3., 6.
|
||||
ecma_object_t *prototype_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_p;
|
||||
ecma_builtin_get (prototype_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_create_object (obj_p, prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
|
||||
ecma_deref_object (prototype_p);
|
||||
|
||||
@@ -130,7 +132,8 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
&& formal_params_number > 0)
|
||||
{
|
||||
// 8.
|
||||
ecma_object_t *map_p = ecma_op_create_object_object_noarg ();
|
||||
ecma_object_ptr_t map_p;
|
||||
ecma_op_create_object_object_noarg (map_p);
|
||||
|
||||
// 11.c
|
||||
MEM_DEFINE_LOCAL_ARRAY (formal_params, formal_params_number, ecma_string_t *);
|
||||
@@ -197,12 +200,18 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
|
||||
ecma_property_t *parameters_map_prop_p = ecma_create_internal_property (obj_p,
|
||||
ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP);
|
||||
ECMA_SET_POINTER(parameters_map_prop_p->u.internal_property.value, map_p);
|
||||
{
|
||||
ecma_object_t *map_tmp_p = (ecma_object_t*) map_p;
|
||||
ECMA_SET_POINTER(parameters_map_prop_p->u.internal_property.value, map_tmp_p);
|
||||
}
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (obj_p, map_p);
|
||||
|
||||
ecma_property_t *scope_prop_p = ecma_create_internal_property (map_p,
|
||||
ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
ECMA_SET_POINTER(scope_prop_p->u.internal_property.value, lex_env_p);
|
||||
{
|
||||
ecma_object_t *lex_env_tmp_p = (ecma_object_t *) lex_env_p;
|
||||
ECMA_SET_POINTER(scope_prop_p->u.internal_property.value, lex_env_tmp_p);
|
||||
}
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (map_p, lex_env_p);
|
||||
|
||||
ecma_deref_object (map_p);
|
||||
@@ -239,16 +248,17 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_object_t *thrower_p = ecma_builtin_get (ECMA_BUILTIN_ID_TYPE_ERROR_THROWER);
|
||||
ecma_object_ptr_t thrower_p;
|
||||
ecma_builtin_get (thrower_p, ECMA_BUILTIN_ID_TYPE_ERROR_THROWER);
|
||||
|
||||
// 14.
|
||||
prop_desc = ecma_make_empty_property_descriptor ();
|
||||
{
|
||||
prop_desc.is_get_defined = true;
|
||||
prop_desc.get_p = thrower_p;
|
||||
prop_desc.get_p = (ecma_object_t*) thrower_p;
|
||||
|
||||
prop_desc.is_set_defined = true;
|
||||
prop_desc.set_p = thrower_p;
|
||||
prop_desc.set_p = (ecma_object_t*) thrower_p;
|
||||
|
||||
prop_desc.is_enumerable_defined = true;
|
||||
prop_desc.is_enumerable = false;
|
||||
@@ -271,8 +281,6 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
ecma_deref_ecma_string (caller_magic_string_p);
|
||||
ecma_deref_object (thrower_p);
|
||||
}
|
||||
|
||||
return obj_p;
|
||||
} /* ecma_create_arguments_object */
|
||||
|
||||
/**
|
||||
@@ -283,15 +291,15 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
|
||||
*/
|
||||
static void
|
||||
ecma_arguments_get_mapped_arg_value (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *map_p, /**< [[ParametersMap]] object */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
ecma_property_t *scope_prop_p = ecma_get_internal_property (map_p, ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
ecma_object_t *lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
scope_prop_p->u.internal_property.value);
|
||||
JERRY_ASSERT(lex_env_p != NULL
|
||||
ecma_object_ptr_t lex_env_p;
|
||||
lex_env_p.unpack_from (scope_prop_p->u.internal_property.value);
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ()
|
||||
&& ecma_is_lexical_environment (lex_env_p));
|
||||
|
||||
ecma_value_t arg_name_prop_value;
|
||||
@@ -315,13 +323,13 @@ ecma_arguments_get_mapped_arg_value (ecma_completion_value_t &ret_value, /**< ou
|
||||
*/
|
||||
void
|
||||
ecma_op_arguments_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
// 1.
|
||||
ecma_property_t *map_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP);
|
||||
ecma_object_t *map_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
map_prop_p->u.internal_property.value);
|
||||
ecma_object_ptr_t map_p;
|
||||
map_p.unpack_from (map_prop_p->u.internal_property.value);
|
||||
|
||||
// 2.
|
||||
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
|
||||
@@ -352,7 +360,7 @@ ecma_op_arguments_object_get (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
* Returned value must be freed with ecma_free_completion_value
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_arguments_object_get_own_property (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
// 1.
|
||||
@@ -366,8 +374,8 @@ ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object
|
||||
|
||||
// 3.
|
||||
ecma_property_t *map_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP);
|
||||
ecma_object_t *map_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
map_prop_p->u.internal_property.value);
|
||||
ecma_object_ptr_t map_p;
|
||||
map_p.unpack_from (map_prop_p->u.internal_property.value);
|
||||
|
||||
// 4.
|
||||
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
|
||||
@@ -403,7 +411,7 @@ ecma_op_arguments_object_get_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 */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p, /**< property name */
|
||||
const ecma_property_descriptor_t* property_desc_p, /**< property
|
||||
* descriptor */
|
||||
@@ -411,8 +419,8 @@ ecma_op_arguments_object_define_own_property (ecma_completion_value_t &ret_value
|
||||
{
|
||||
// 1.
|
||||
ecma_property_t *map_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP);
|
||||
ecma_object_t *map_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
map_prop_p->u.internal_property.value);
|
||||
ecma_object_ptr_t map_p;
|
||||
map_p.unpack_from (map_prop_p->u.internal_property.value);
|
||||
|
||||
// 2.
|
||||
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
|
||||
@@ -494,14 +502,14 @@ ecma_op_arguments_object_define_own_property (ecma_completion_value_t &ret_value
|
||||
*/
|
||||
void
|
||||
ecma_op_arguments_object_delete (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p, /**< property name */
|
||||
bool is_throw) /**< flag that controls failure handling */
|
||||
{
|
||||
// 1.
|
||||
ecma_property_t *map_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP);
|
||||
ecma_object_t *map_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
map_prop_p->u.internal_property.value);
|
||||
ecma_object_ptr_t map_p;
|
||||
map_p.unpack_from (map_prop_p->u.internal_property.value);
|
||||
|
||||
// 2.
|
||||
ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
#include "ecma-helpers.h"
|
||||
#include "ecma-value.h"
|
||||
|
||||
extern ecma_object_t*
|
||||
ecma_create_arguments_object (ecma_object_t *func_obj_p,
|
||||
ecma_object_t *lex_env_p,
|
||||
extern void
|
||||
ecma_create_arguments_object (ecma_object_ptr_t &ret_val,
|
||||
const ecma_object_ptr_t& func_obj_p,
|
||||
const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_collection_iterator_t *formal_params_iter_p,
|
||||
const ecma_value_t *arguments_list_p,
|
||||
ecma_length_t arguments_list_length,
|
||||
@@ -30,19 +31,19 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p,
|
||||
|
||||
extern void
|
||||
ecma_op_arguments_object_get (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *obj_p,
|
||||
const ecma_object_ptr_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_op_arguments_object_get_own_property (const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p,
|
||||
const ecma_property_descriptor_t* property_desc_p,
|
||||
bool is_throw);
|
||||
|
||||
@@ -42,7 +42,9 @@ ecma_reject (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
{
|
||||
if (is_throw)
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -57,20 +59,19 @@ ecma_reject (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
*
|
||||
* @return pointer to newly created 'Object' object
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_op_create_object_object_noarg (void)
|
||||
void
|
||||
ecma_op_create_object_object_noarg (ecma_object_ptr_t &obj_p) /**< out: object pointer */
|
||||
{
|
||||
ecma_object_t *object_prototype_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t object_prototype_p;
|
||||
ecma_builtin_get (object_prototype_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
|
||||
// 3., 4., 6., 7.
|
||||
ecma_object_t *obj_p = ecma_create_object (object_prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
ecma_create_object (obj_p, object_prototype_p, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||
|
||||
ecma_deref_object (object_prototype_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
class_prop_p->u.internal_property.value = ECMA_MAGIC_STRING_OBJECT_UL;
|
||||
|
||||
return obj_p;
|
||||
} /* ecma_op_create_object_object_noarg */
|
||||
|
||||
/**
|
||||
@@ -100,7 +101,8 @@ ecma_op_create_object_object_arg (ecma_completion_value_t &ret_value, /**< out:
|
||||
JERRY_ASSERT (ecma_is_value_undefined (value)
|
||||
|| ecma_is_value_null (value));
|
||||
|
||||
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_op_create_object_object_noarg (obj_p);
|
||||
|
||||
ecma_make_normal_completion_value (ret_value, ecma_value_t (obj_p));
|
||||
}
|
||||
@@ -118,10 +120,10 @@ ecma_op_create_object_object_arg (ecma_completion_value_t &ret_value, /**< out:
|
||||
*/
|
||||
void
|
||||
ecma_op_general_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -149,11 +151,11 @@ ecma_op_general_object_get (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
else
|
||||
{
|
||||
// 4.
|
||||
ecma_object_t *getter_p = ECMA_GET_POINTER (ecma_object_t,
|
||||
prop_p->u.named_accessor_property.get_p);
|
||||
ecma_object_ptr_t getter_p;
|
||||
getter_p.unpack_from (prop_p->u.named_accessor_property.get_p, true);
|
||||
|
||||
// 5.
|
||||
if (getter_p == NULL)
|
||||
if (getter_p.is_null ())
|
||||
{
|
||||
ecma_make_simple_completion_value (ret_value, ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
}
|
||||
@@ -179,10 +181,10 @@ ecma_op_general_object_get (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
* NULL (i.e. ecma-undefined) - otherwise.
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_general_object_get_own_property (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_general_object_get_own_property (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -200,10 +202,10 @@ ecma_op_general_object_get_own_property (ecma_object_t *obj_p, /**< the object *
|
||||
* NULL (i.e. ecma-undefined) - otherwise.
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_general_object_get_property (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_general_object_get_property (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -217,10 +219,11 @@ ecma_op_general_object_get_property (ecma_object_t *obj_p, /**< the object */
|
||||
}
|
||||
|
||||
// 3.
|
||||
ecma_object_t *prototype_p = ecma_get_object_prototype (obj_p);
|
||||
ecma_object_ptr_t prototype_p;
|
||||
ecma_get_object_prototype (prototype_p, obj_p);
|
||||
|
||||
// 4., 5.
|
||||
if (prototype_p != NULL)
|
||||
if (prototype_p.is_not_null ())
|
||||
{
|
||||
return ecma_op_object_get_property (prototype_p, property_name_p);
|
||||
}
|
||||
@@ -242,12 +245,12 @@ ecma_op_general_object_get_property (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 */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -257,7 +260,9 @@ ecma_op_general_object_put (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
if (is_throw)
|
||||
{
|
||||
// a.
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -299,9 +304,9 @@ ecma_op_general_object_put (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
&& desc_p->type == ECMA_PROPERTY_NAMEDACCESSOR)
|
||||
{
|
||||
// a.
|
||||
ecma_object_t *setter_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t,
|
||||
desc_p->u.named_accessor_property.set_p);
|
||||
JERRY_ASSERT(setter_p != NULL);
|
||||
ecma_object_ptr_t setter_p;
|
||||
setter_p.unpack_from (desc_p->u.named_accessor_property.set_p);
|
||||
JERRY_ASSERT(setter_p.is_not_null ());
|
||||
|
||||
ECMA_TRY_CATCH (ret_value, ecma_op_function_call, call_ret, setter_p, ecma_value_t (obj_p), &value, 1);
|
||||
|
||||
@@ -349,10 +354,10 @@ ecma_op_general_object_put (ecma_completion_value_t &ret_value, /**< out: comple
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool
|
||||
ecma_op_general_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_general_object_can_put (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -388,10 +393,11 @@ ecma_op_general_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
}
|
||||
|
||||
// 3.
|
||||
ecma_object_t *proto_p = ecma_get_object_prototype (obj_p);
|
||||
ecma_object_ptr_t proto_p;
|
||||
ecma_get_object_prototype (proto_p, obj_p);
|
||||
|
||||
// 4.
|
||||
if (proto_p == NULL)
|
||||
if (proto_p.is_null ())
|
||||
{
|
||||
return ecma_get_object_extensible (obj_p);
|
||||
}
|
||||
@@ -408,11 +414,11 @@ ecma_op_general_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
// 7.
|
||||
if (inherited_p->type == ECMA_PROPERTY_NAMEDACCESSOR)
|
||||
{
|
||||
ecma_object_t *setter_p = ECMA_GET_POINTER (ecma_object_t,
|
||||
inherited_p->u.named_accessor_property.set_p);
|
||||
ecma_object_ptr_t setter_p;
|
||||
setter_p.unpack_from (inherited_p->u.named_accessor_property.set_p, true);
|
||||
|
||||
// a.
|
||||
if (setter_p == NULL)
|
||||
if (setter_p.is_null ())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -452,11 +458,11 @@ ecma_op_general_object_can_put (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 */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p, /**< property name */
|
||||
bool is_throw) /**< flag that controls failure handling */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -482,7 +488,9 @@ ecma_op_general_object_delete (ecma_completion_value_t &ret_value, /**< out: com
|
||||
else if (is_throw)
|
||||
{
|
||||
// 4.
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -503,10 +511,10 @@ ecma_op_general_object_delete (ecma_completion_value_t &ret_value, /**< out: com
|
||||
*/
|
||||
void
|
||||
ecma_op_general_object_default_value (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_preferred_type_hint_t hint) /**< hint on preferred result type */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
if (hint == ECMA_PREFERRED_TYPE_NO)
|
||||
@@ -559,7 +567,8 @@ ecma_op_general_object_default_value (ecma_completion_value_t &ret_value, /**< o
|
||||
|
||||
if (ecma_op_is_callable (function_value_get))
|
||||
{
|
||||
ecma_object_t *func_obj_p = ecma_get_object_from_value (function_value_get);
|
||||
ecma_object_ptr_t func_obj_p;
|
||||
ecma_get_object_from_value (func_obj_p, function_value_get);
|
||||
|
||||
ecma_op_function_call (call_completion,
|
||||
func_obj_p,
|
||||
@@ -590,7 +599,9 @@ ecma_op_general_object_default_value (ecma_completion_value_t &ret_value, /**< o
|
||||
ecma_free_completion_value (call_completion);
|
||||
}
|
||||
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
} /* ecma_op_general_object_default_value */
|
||||
|
||||
/**
|
||||
@@ -605,13 +616,13 @@ ecma_op_general_object_default_value (ecma_completion_value_t &ret_value, /**< o
|
||||
*/
|
||||
void
|
||||
ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the 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 */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -658,10 +669,15 @@ ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value,
|
||||
// b.
|
||||
JERRY_ASSERT(is_property_desc_accessor_descriptor);
|
||||
|
||||
ecma_object_ptr_t get_p, set_p;
|
||||
|
||||
get_p = property_desc_p->get_p;
|
||||
set_p = property_desc_p->set_p;
|
||||
|
||||
ecma_create_named_accessor_property (obj_p,
|
||||
property_name_p,
|
||||
property_desc_p->get_p,
|
||||
property_desc_p->set_p,
|
||||
get_p,
|
||||
set_p,
|
||||
property_desc_p->is_enumerable,
|
||||
property_desc_p->is_configurable);
|
||||
|
||||
@@ -784,11 +800,12 @@ ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value,
|
||||
if (is_current_data_descriptor)
|
||||
{
|
||||
// b.
|
||||
ecma_object_ptr_t null_pointer;
|
||||
|
||||
current_p = ecma_create_named_accessor_property (obj_p,
|
||||
property_name_p,
|
||||
NULL,
|
||||
NULL,
|
||||
null_pointer,
|
||||
null_pointer,
|
||||
ecma_is_property_enumerable (current_p),
|
||||
ecma_is_property_configurable (current_p));
|
||||
}
|
||||
@@ -875,9 +892,13 @@ ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value,
|
||||
{
|
||||
JERRY_ASSERT(is_current_accessor_descriptor);
|
||||
|
||||
ecma_object_t *get_p = property_desc_p->get_p;
|
||||
ecma_object_ptr_t get_p;
|
||||
get_p = property_desc_p->get_p;
|
||||
|
||||
ECMA_SET_POINTER(current_p->u.named_accessor_property.get_p, get_p);
|
||||
{
|
||||
ecma_object_t *get_tmp_p = (ecma_object_t*) get_p;
|
||||
ECMA_SET_POINTER(current_p->u.named_accessor_property.get_p, get_tmp_p);
|
||||
}
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (obj_p, get_p);
|
||||
}
|
||||
|
||||
@@ -885,9 +906,13 @@ ecma_op_general_object_define_own_property (ecma_completion_value_t &ret_value,
|
||||
{
|
||||
JERRY_ASSERT(is_current_accessor_descriptor);
|
||||
|
||||
ecma_object_t *set_p = property_desc_p->set_p;
|
||||
ecma_object_ptr_t set_p;
|
||||
set_p = property_desc_p->set_p;
|
||||
|
||||
ECMA_SET_POINTER(current_p->u.named_accessor_property.set_p, set_p);
|
||||
{
|
||||
ecma_object_t *set_tmp_p = (ecma_object_t*) set_p;
|
||||
ECMA_SET_POINTER(current_p->u.named_accessor_property.set_p, set_tmp_p);
|
||||
}
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object (obj_p, set_p);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,43 +27,43 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
extern ecma_object_t*
|
||||
ecma_op_create_object_object_noarg (void);
|
||||
extern void
|
||||
ecma_op_create_object_object_noarg (ecma_object_ptr_t &ret_val);
|
||||
extern void
|
||||
ecma_op_create_object_object_arg (ecma_completion_value_t &ret_value,
|
||||
const ecma_value_t& value);
|
||||
|
||||
extern void
|
||||
ecma_op_general_object_get (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *obj_p,
|
||||
const ecma_object_ptr_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_op_general_object_get_own_property (const ecma_object_ptr_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_op_general_object_get_property (const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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_op_general_object_can_put (const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p,
|
||||
const ecma_property_descriptor_t* property_desc_p,
|
||||
bool is_throw);
|
||||
|
||||
@@ -42,10 +42,10 @@
|
||||
*/
|
||||
void
|
||||
ecma_op_object_get (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -87,7 +87,7 @@ ecma_op_object_get (ecma_completion_value_t &ret_value, /**< out: completion val
|
||||
* NULL (i.e. ecma-undefined) - otherwise.
|
||||
*/
|
||||
static __noinline ecma_property_t*
|
||||
ecma_op_object_get_own_property_longpath (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_object_get_own_property_longpath (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
const ecma_object_type_t type = ecma_get_object_type (obj_p);
|
||||
@@ -154,10 +154,10 @@ ecma_op_object_get_own_property_longpath (ecma_object_t *obj_p, /**< the object
|
||||
* NULL (i.e. ecma-undefined) - otherwise.
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_object_get_own_property (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_object_get_own_property (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -183,10 +183,10 @@ ecma_op_object_get_own_property (ecma_object_t *obj_p, /**< the object */
|
||||
* NULL (i.e. ecma-undefined) - otherwise.
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_object_get_property (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -194,7 +194,7 @@ ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */
|
||||
JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT);
|
||||
|
||||
/*
|
||||
* typedef ecma_property_t* (*get_property_ptr_t) (ecma_object_t *, ecma_string_t *);
|
||||
* typedef ecma_property_t* (*get_property_ptr_t) (const ecma_object_ptr_t& , ecma_string_t *);
|
||||
* static const get_property_ptr_t get_property [ECMA_OBJECT_TYPE__COUNT] =
|
||||
* {
|
||||
* [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_get_property,
|
||||
@@ -223,12 +223,12 @@ ecma_op_object_get_property (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 */
|
||||
const ecma_object_ptr_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 */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -236,7 +236,7 @@ ecma_op_object_put (ecma_completion_value_t &ret_value, /**< out: completion val
|
||||
JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT);
|
||||
|
||||
/*
|
||||
* typedef ecma_property_t* (*put_ptr_t) (ecma_object_t *, ecma_string_t *);
|
||||
* typedef ecma_property_t* (*put_ptr_t) (const ecma_object_ptr_t& , ecma_string_t *);
|
||||
* static const put_ptr_t put [ECMA_OBJECT_TYPE__COUNT] =
|
||||
* {
|
||||
* [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_put,
|
||||
@@ -264,10 +264,10 @@ ecma_op_object_put (ecma_completion_value_t &ret_value, /**< out: completion val
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool
|
||||
ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
ecma_op_object_can_put (const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -275,7 +275,7 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT);
|
||||
|
||||
/*
|
||||
* typedef ecma_property_t* (*can_put_ptr_t) (ecma_object_t *, ecma_string_t *);
|
||||
* typedef ecma_property_t* (*can_put_ptr_t) (const ecma_object_ptr_t& , ecma_string_t *);
|
||||
* static const can_put_ptr_t can_put [ECMA_OBJECT_TYPE__COUNT] =
|
||||
* {
|
||||
* [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_can_put,
|
||||
@@ -304,11 +304,11 @@ ecma_op_object_can_put (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 */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_string_t *property_name_p, /**< property name */
|
||||
bool is_throw) /**< flag that controls failure handling */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -360,17 +360,17 @@ ecma_op_object_delete (ecma_completion_value_t &ret_value, /**< out: completion
|
||||
*/
|
||||
void
|
||||
ecma_op_object_default_value (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
ecma_preferred_type_hint_t hint) /**< hint on preferred result type */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
const ecma_object_type_t type = ecma_get_object_type (obj_p);
|
||||
JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT);
|
||||
|
||||
/*
|
||||
* typedef ecma_property_t* (*default_value_ptr_t) (ecma_object_t *, ecma_string_t *);
|
||||
* typedef ecma_property_t* (*default_value_ptr_t) (const ecma_object_ptr_t& , ecma_string_t *);
|
||||
* static const default_value_ptr_t default_value [ECMA_OBJECT_TYPE__COUNT] =
|
||||
* {
|
||||
* [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_default_value,
|
||||
@@ -399,13 +399,13 @@ ecma_op_object_default_value (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
*/
|
||||
void
|
||||
ecma_op_object_define_own_property (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the 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 */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
JERRY_ASSERT(property_name_p != NULL);
|
||||
|
||||
@@ -465,10 +465,10 @@ ecma_op_object_define_own_property (ecma_completion_value_t &ret_value, /**< out
|
||||
*/
|
||||
void
|
||||
ecma_op_object_has_instance (ecma_completion_value_t &ret_value, /**< out: completion value */
|
||||
ecma_object_t *obj_p, /**< the object */
|
||||
const ecma_object_ptr_t& obj_p, /**< the object */
|
||||
const ecma_value_t& value) /**< argument 'V' */
|
||||
{
|
||||
JERRY_ASSERT(obj_p != NULL
|
||||
JERRY_ASSERT(obj_p.is_not_null ()
|
||||
&& !ecma_is_lexical_environment (obj_p));
|
||||
|
||||
const ecma_object_type_t type = ecma_get_object_type (obj_p);
|
||||
@@ -480,7 +480,9 @@ ecma_op_object_has_instance (ecma_completion_value_t &ret_value, /**< out: compl
|
||||
case ECMA_OBJECT_TYPE_STRING:
|
||||
case ECMA_OBJECT_TYPE_ARGUMENTS:
|
||||
{
|
||||
ecma_make_throw_obj_completion_value (ret_value, ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
ecma_object_ptr_t exception_obj_p;
|
||||
ecma_new_standard_error (exception_obj_p, ECMA_ERROR_TYPE);
|
||||
ecma_make_throw_obj_completion_value (ret_value, exception_obj_p);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,41 +29,41 @@
|
||||
|
||||
extern void
|
||||
ecma_op_object_get (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *obj_p,
|
||||
const ecma_object_ptr_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_op_object_get_own_property (const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p);
|
||||
extern ecma_property_t*
|
||||
ecma_op_object_get_property (ecma_object_t *obj_p,
|
||||
ecma_op_object_get_property (const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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_op_object_can_put (const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_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,
|
||||
const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p,
|
||||
const ecma_property_descriptor_t* property_desc_p,
|
||||
bool is_throw);
|
||||
extern void
|
||||
ecma_op_object_has_instance (ecma_completion_value_t &ret_value,
|
||||
ecma_object_t *obj_p,
|
||||
const ecma_object_ptr_t& obj_p,
|
||||
const ecma_value_t& value);
|
||||
/**
|
||||
* @}
|
||||
|
||||
@@ -36,25 +36,24 @@
|
||||
* pointer to lexical environment - reference's base,
|
||||
* else - NULL.
|
||||
*/
|
||||
ecma_object_t*
|
||||
ecma_op_resolve_reference_base (ecma_object_t *lex_env_p, /**< starting lexical environment */
|
||||
void
|
||||
ecma_op_resolve_reference_base (ecma_object_ptr_t &lex_env_iter_p, /**< out: object pointer */
|
||||
const ecma_object_ptr_t &lex_env_p, /**< starting lexical environment */
|
||||
ecma_string_t *name_p) /**< identifier's name */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL);
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ());
|
||||
|
||||
ecma_object_t *lex_env_iter_p = lex_env_p;
|
||||
lex_env_iter_p = lex_env_p;
|
||||
|
||||
while (lex_env_iter_p != NULL)
|
||||
while (lex_env_iter_p.is_not_null ())
|
||||
{
|
||||
if (ecma_op_has_binding (lex_env_iter_p, name_p))
|
||||
{
|
||||
return lex_env_iter_p;
|
||||
return;
|
||||
}
|
||||
|
||||
lex_env_iter_p = ecma_get_lex_env_outer_reference (lex_env_iter_p);
|
||||
ecma_get_lex_env_outer_reference (lex_env_iter_p, lex_env_iter_p);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
} /* ecma_op_resolve_reference_base */
|
||||
|
||||
/**
|
||||
@@ -65,15 +64,16 @@ ecma_op_resolve_reference_base (ecma_object_t *lex_env_p, /**< starting lexical
|
||||
*/
|
||||
void
|
||||
ecma_op_get_identifier_reference (ecma_reference_t &ret, /**< out: reference */
|
||||
ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
const ecma_object_ptr_t& lex_env_p, /**< lexical environment */
|
||||
ecma_string_t *name_p, /**< identifier's name */
|
||||
bool is_strict) /**< strict reference flag */
|
||||
{
|
||||
JERRY_ASSERT(lex_env_p != NULL);
|
||||
JERRY_ASSERT(lex_env_p.is_not_null ());
|
||||
|
||||
ecma_object_t *base_lex_env_p = ecma_op_resolve_reference_base (lex_env_p, name_p);
|
||||
ecma_object_ptr_t base_lex_env_p;
|
||||
ecma_op_resolve_reference_base (base_lex_env_p, lex_env_p, name_p);
|
||||
|
||||
if (base_lex_env_p != NULL)
|
||||
if (base_lex_env_p.is_not_null ())
|
||||
{
|
||||
ecma_make_reference (ret,
|
||||
ecma_value_t (base_lex_env_p),
|
||||
|
||||
@@ -48,11 +48,13 @@ typedef struct ecma_reference_t
|
||||
unsigned int is_strict : 1;
|
||||
} ecma_reference_t;
|
||||
|
||||
extern ecma_object_t* ecma_op_resolve_reference_base (ecma_object_t *lex_env_p,
|
||||
ecma_string_t *name_p);
|
||||
extern void
|
||||
ecma_op_resolve_reference_base (ecma_object_ptr_t &ret_val,
|
||||
const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *name_p);
|
||||
|
||||
extern void ecma_op_get_identifier_reference (ecma_reference_t &ret,
|
||||
ecma_object_t *lex_env_p,
|
||||
const ecma_object_ptr_t& lex_env_p,
|
||||
ecma_string_t *name_p,
|
||||
bool is_strict);
|
||||
extern void ecma_make_reference (ecma_reference_t &ret,
|
||||
|
||||
@@ -84,14 +84,15 @@ ecma_op_create_string_object (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_STRING_BUILTIN
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_STRING_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_STRING_PROTOTYPE);
|
||||
#else /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_STRING_BUILTIN */
|
||||
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
ecma_object_ptr_t prototype_obj_p;
|
||||
ecma_builtin_get (prototype_obj_p, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_STRING_BUILTIN */
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (prototype_obj_p,
|
||||
true,
|
||||
ECMA_OBJECT_TYPE_STRING);
|
||||
ecma_object_ptr_t obj_p;
|
||||
ecma_create_object (obj_p, prototype_obj_p, true, ECMA_OBJECT_TYPE_STRING);
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
||||
@@ -125,7 +126,7 @@ ecma_op_create_string_object (ecma_completion_value_t &ret_value, /**< out: comp
|
||||
* Returned value must be freed with ecma_free_completion_value
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_string_object_get_own_property (ecma_object_t *obj_p, /**< the array object */
|
||||
ecma_op_string_object_get_own_property (const ecma_object_ptr_t& obj_p, /**< the array object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_STRING);
|
||||
|
||||
@@ -32,7 +32,7 @@ ecma_op_create_string_object (ecma_completion_value_t &ret_value,
|
||||
ecma_length_t arguments_list_len);
|
||||
|
||||
extern ecma_property_t*
|
||||
ecma_op_string_object_get_own_property (ecma_object_t *obj_p,
|
||||
ecma_op_string_object_get_own_property (const ecma_object_ptr_t& obj_p,
|
||||
ecma_string_t *property_name_p);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user