Major property rework: introducing virtual properties.
Properties are changed to a type and value pair instead of a pointer to an internal representation. Functions such as ecma_op_object_get_[own_]property do not return with property pointers anymore. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -668,9 +668,9 @@ ecma_builtin_json_walk (ecma_object_t *reviver_p, /**< reviver function */
|
||||
arguments_list[0] = ecma_make_string_value (name_p);
|
||||
arguments_list[1] = value_get;
|
||||
|
||||
/*
|
||||
* The completion value can be anything including exceptions.
|
||||
*/
|
||||
/*
|
||||
* The completion value can be anything including exceptions.
|
||||
*/
|
||||
ret_value = ecma_op_function_call (reviver_p,
|
||||
ecma_make_object_value (holder_p),
|
||||
arguments_list,
|
||||
@@ -746,12 +746,13 @@ ecma_builtin_json_parse (ecma_value_t this_arg, /**< 'this' argument */
|
||||
ecma_object_t *object_p = ecma_op_create_object_object_noarg ();
|
||||
ecma_string_t *name_p = ecma_get_magic_string (LIT_MAGIC_STRING__EMPTY);
|
||||
|
||||
ecma_property_t *property_p;
|
||||
property_p = ecma_create_named_data_property (object_p,
|
||||
name_p,
|
||||
ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE);
|
||||
ecma_property_value_t *prop_value_p;
|
||||
prop_value_p = ecma_create_named_data_property (object_p,
|
||||
name_p,
|
||||
ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE,
|
||||
NULL);
|
||||
|
||||
ecma_named_data_property_assign_value (object_p, property_p, final_result);
|
||||
ecma_named_data_property_assign_value (object_p, prop_value_p, final_result);
|
||||
ecma_free_value (final_result);
|
||||
|
||||
ret_value = ecma_builtin_json_walk (ecma_get_object_from_value (arg2),
|
||||
@@ -1445,11 +1446,15 @@ ecma_builtin_json_object (ecma_object_t *obj_p, /**< the object*/
|
||||
while (ecma_collection_iterator_next (&iter))
|
||||
{
|
||||
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
JERRY_ASSERT (ecma_is_property_enumerable (property_p));
|
||||
ecma_property_t property = ecma_op_object_get_own_property (obj_p,
|
||||
property_name_p,
|
||||
NULL,
|
||||
ECMA_PROPERTY_GET_NO_OPTIONS);
|
||||
|
||||
if (ECMA_PROPERTY_GET_TYPE (property_p) == ECMA_PROPERTY_TYPE_NAMEDDATA)
|
||||
JERRY_ASSERT (ecma_is_property_enumerable (property));
|
||||
|
||||
if (ECMA_PROPERTY_GET_TYPE (property) == ECMA_PROPERTY_TYPE_NAMEDDATA)
|
||||
{
|
||||
ecma_append_to_values_collection (property_keys_p, *iter.current_value_p, true);
|
||||
}
|
||||
|
||||
@@ -242,15 +242,17 @@ ecma_builtin_object_prototype_object_property_is_enumerable (ecma_value_t this_a
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (obj_val);
|
||||
|
||||
/* 3. */
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_string_p);
|
||||
ecma_property_t property = ecma_op_object_get_own_property (obj_p,
|
||||
property_name_string_p,
|
||||
NULL,
|
||||
ECMA_PROPERTY_GET_NO_OPTIONS);
|
||||
|
||||
/* 4. */
|
||||
if (property_p != NULL)
|
||||
if (property != ECMA_PROPERTY_TYPE_NOT_FOUND)
|
||||
{
|
||||
bool is_enumerable = ecma_is_property_enumerable (property_p);
|
||||
bool is_enumerable = ecma_is_property_enumerable (property);
|
||||
|
||||
return_value = ecma_make_simple_value (is_enumerable ? ECMA_SIMPLE_VALUE_TRUE
|
||||
: ECMA_SIMPLE_VALUE_FALSE);
|
||||
return_value = ecma_make_boolean_value (is_enumerable);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -202,16 +202,17 @@ ecma_builtin_object_object_seal (ecma_value_t this_arg, /**< 'this' argument */
|
||||
&& ecma_is_value_empty (ret_value))
|
||||
{
|
||||
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
// 2.a
|
||||
ecma_property_descriptor_t prop_desc = ecma_get_property_descriptor_from_property (property_p);
|
||||
ecma_property_descriptor_t prop_desc;
|
||||
|
||||
if (!ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 2.b
|
||||
if (ecma_is_property_configurable (property_p))
|
||||
{
|
||||
prop_desc.is_configurable = false;
|
||||
}
|
||||
prop_desc.is_configurable = false;
|
||||
|
||||
// 2.c
|
||||
ECMA_TRY_CATCH (define_own_prop_ret,
|
||||
@@ -276,23 +277,23 @@ ecma_builtin_object_object_freeze (ecma_value_t this_arg, /**< 'this' argument *
|
||||
&& ecma_is_value_empty (ret_value))
|
||||
{
|
||||
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
// 2.a
|
||||
ecma_property_descriptor_t prop_desc = ecma_get_property_descriptor_from_property (property_p);
|
||||
ecma_property_descriptor_t prop_desc;
|
||||
|
||||
if (!ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 2.b
|
||||
if (ECMA_PROPERTY_GET_TYPE (property_p) == ECMA_PROPERTY_TYPE_NAMEDDATA
|
||||
&& ecma_is_property_writable (property_p))
|
||||
if (prop_desc.is_writable_defined && prop_desc.is_writable)
|
||||
{
|
||||
prop_desc.is_writable = false;
|
||||
}
|
||||
|
||||
// 2.c
|
||||
if (ecma_is_property_configurable (property_p))
|
||||
{
|
||||
prop_desc.is_configurable = false;
|
||||
}
|
||||
prop_desc.is_configurable = false;
|
||||
|
||||
// 2.d
|
||||
ECMA_TRY_CATCH (define_own_prop_ret,
|
||||
@@ -400,10 +401,13 @@ ecma_builtin_object_object_is_sealed (ecma_value_t this_arg, /**< 'this' argumen
|
||||
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||
|
||||
// 2.a
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_p);
|
||||
ecma_property_t property = ecma_op_object_get_own_property (obj_p,
|
||||
property_name_p,
|
||||
NULL,
|
||||
ECMA_PROPERTY_GET_NO_OPTIONS);
|
||||
|
||||
// 2.b
|
||||
if (ecma_is_property_configurable (property_p))
|
||||
if (ecma_is_property_configurable (property))
|
||||
{
|
||||
is_sealed = false;
|
||||
break;
|
||||
@@ -468,21 +472,21 @@ ecma_builtin_object_object_is_frozen (ecma_value_t this_arg, /**< 'this' argumen
|
||||
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||
|
||||
// 2.a
|
||||
ecma_property_t *property_p = ecma_op_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (property_p) == ECMA_PROPERTY_TYPE_NAMEDDATA
|
||||
|| ECMA_PROPERTY_GET_TYPE (property_p) == ECMA_PROPERTY_TYPE_NAMEDACCESSOR);
|
||||
ecma_property_t property = ecma_op_object_get_own_property (obj_p,
|
||||
property_name_p,
|
||||
NULL,
|
||||
ECMA_PROPERTY_GET_NO_OPTIONS);
|
||||
|
||||
// 2.b
|
||||
if (ECMA_PROPERTY_GET_TYPE (property_p) == ECMA_PROPERTY_TYPE_NAMEDDATA
|
||||
&& ecma_is_property_writable (property_p))
|
||||
if (ECMA_PROPERTY_GET_TYPE (property) != ECMA_PROPERTY_TYPE_NAMEDACCESSOR
|
||||
&& ecma_is_property_writable (property))
|
||||
{
|
||||
is_frozen = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// 2.c
|
||||
if (ecma_is_property_configurable (property_p))
|
||||
if (ecma_is_property_configurable (property))
|
||||
{
|
||||
is_frozen = false;
|
||||
break;
|
||||
@@ -598,12 +602,10 @@ ecma_builtin_object_object_get_own_property_descriptor (ecma_value_t this_arg, /
|
||||
ecma_string_t *name_str_p = ecma_get_string_from_value (name_str_value);
|
||||
|
||||
// 3.
|
||||
ecma_property_t *prop_p = ecma_op_object_get_own_property (obj_p, name_str_p);
|
||||
ecma_property_descriptor_t prop_desc;
|
||||
|
||||
if (prop_p != NULL)
|
||||
if (ecma_op_object_get_own_property_descriptor (obj_p, name_str_p, &prop_desc))
|
||||
{
|
||||
ecma_property_descriptor_t prop_desc = ecma_get_property_descriptor_from_property (prop_p);
|
||||
|
||||
// 4.
|
||||
ecma_object_t *desc_obj_p = ecma_op_from_property_descriptor (&prop_desc);
|
||||
|
||||
|
||||
@@ -1517,10 +1517,10 @@ ecma_builtin_helper_split_match (ecma_value_t input_string, /**< first argument
|
||||
{
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (ret_value);
|
||||
ecma_string_t *magic_index_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_INDEX);
|
||||
ecma_property_t *index_prop_p = ecma_get_named_property (obj_p, magic_index_str_p);
|
||||
ecma_property_value_t *index_prop_value_p = ecma_get_named_data_property (obj_p, magic_index_str_p);
|
||||
|
||||
ecma_number_t index_num = ecma_get_number_from_value (ecma_get_named_data_property_value (index_prop_p));
|
||||
ecma_value_assign_number (&ECMA_PROPERTY_VALUE_PTR (index_prop_p)->value, index_num + start_idx);
|
||||
ecma_number_t index_num = ecma_get_number_from_value (index_prop_value_p->value);
|
||||
ecma_value_assign_number (&index_prop_value_p->value, index_num + start_idx);
|
||||
|
||||
ecma_deref_ecma_string (magic_index_str_p);
|
||||
}
|
||||
@@ -1578,13 +1578,15 @@ ecma_builtin_helper_split_match (ecma_value_t input_string, /**< first argument
|
||||
JERRY_ASSERT (ecma_is_value_true (put_comp));
|
||||
|
||||
ecma_string_t *magic_index_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_INDEX);
|
||||
ecma_property_t *index_prop_p = ecma_create_named_data_property (match_array_p,
|
||||
magic_index_str_p,
|
||||
ECMA_PROPERTY_FLAG_WRITABLE);
|
||||
ecma_property_value_t *index_prop_value_p;
|
||||
index_prop_value_p = ecma_create_named_data_property (match_array_p,
|
||||
magic_index_str_p,
|
||||
ECMA_PROPERTY_FLAG_WRITABLE,
|
||||
NULL);
|
||||
ecma_deref_ecma_string (magic_index_str_p);
|
||||
|
||||
ecma_named_data_property_assign_value (match_array_p,
|
||||
index_prop_p,
|
||||
index_prop_value_p,
|
||||
ecma_make_uint32_value (start_idx));
|
||||
|
||||
ret_value = match_array;
|
||||
@@ -1787,10 +1789,10 @@ ecma_builtin_string_prototype_object_split (ecma_value_t this_arg, /**< this arg
|
||||
ecma_deref_ecma_string (zero_str_p);
|
||||
|
||||
ecma_string_t *magic_index_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_INDEX);
|
||||
ecma_property_t *index_prop_p = ecma_get_named_property (match_array_obj_p, magic_index_str_p);
|
||||
ecma_property_value_t *index_prop_value_p = ecma_get_named_data_property (match_array_obj_p,
|
||||
magic_index_str_p);
|
||||
|
||||
ecma_value_t index_value = ecma_get_named_data_property_value (index_prop_p);
|
||||
ecma_number_t index_num = ecma_get_number_from_value (index_value);
|
||||
ecma_number_t index_num = ecma_get_number_from_value (index_prop_value_p->value);
|
||||
JERRY_ASSERT (index_num >= 0);
|
||||
|
||||
uint32_t end_pos = ecma_number_to_uint32 (index_num);
|
||||
|
||||
@@ -127,11 +127,13 @@ ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
|
||||
{
|
||||
ecma_string_t *length_str_p = ecma_new_ecma_length_string ();
|
||||
|
||||
ecma_property_t *length_prop_p = ecma_create_named_data_property (obj_p,
|
||||
length_str_p,
|
||||
ECMA_PROPERTY_FLAG_WRITABLE);
|
||||
ecma_property_value_t *length_prop_value_p;
|
||||
length_prop_value_p = ecma_create_named_data_property (obj_p,
|
||||
length_str_p,
|
||||
ECMA_PROPERTY_FLAG_WRITABLE,
|
||||
NULL);
|
||||
|
||||
ecma_set_named_data_property_value (length_prop_p, ecma_make_integer_value (0));
|
||||
length_prop_value_p->value = ecma_make_integer_value (0);
|
||||
|
||||
ecma_deref_ecma_string (length_str_p);
|
||||
break;
|
||||
@@ -346,14 +348,14 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
|
||||
* as it is non-configurable and so can't be deleted
|
||||
*/
|
||||
|
||||
ecma_property_t *len_prop_p = ecma_create_named_data_property (object_p,
|
||||
string_p,
|
||||
ECMA_PROPERTY_FIXED);
|
||||
ecma_property_t *len_prop_p;
|
||||
ecma_property_value_t *len_prop_value_p = ecma_create_named_data_property (object_p,
|
||||
string_p,
|
||||
ECMA_PROPERTY_FIXED,
|
||||
&len_prop_p);
|
||||
|
||||
ecma_set_named_data_property_value (len_prop_p,
|
||||
ecma_make_integer_value (ext_obj_p->u.built_in.length));
|
||||
len_prop_value_p->value = ecma_make_integer_value (ext_obj_p->u.built_in.length);
|
||||
|
||||
JERRY_ASSERT (!ecma_is_property_configurable (len_prop_p));
|
||||
return len_prop_p;
|
||||
}
|
||||
|
||||
@@ -519,11 +521,13 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
|
||||
}
|
||||
}
|
||||
|
||||
ecma_property_t *prop_p = ecma_create_named_data_property (object_p,
|
||||
string_p,
|
||||
curr_property_p->attributes);
|
||||
ecma_property_t *prop_p;
|
||||
ecma_property_value_t *prop_value_p = ecma_create_named_data_property (object_p,
|
||||
string_p,
|
||||
curr_property_p->attributes,
|
||||
&prop_p);
|
||||
|
||||
ecma_set_named_data_property_value (prop_p, value);
|
||||
prop_value_p->value = value;
|
||||
|
||||
/* Reference count of objects must be decreased. */
|
||||
if (ecma_is_value_object (value))
|
||||
|
||||
Reference in New Issue
Block a user