From 8b55a4ef7bb04583c04cff904f1ccbf1a54a4f01 Mon Sep 17 00:00:00 2001 From: zherczeg Date: Tue, 20 Sep 2016 13:33:57 +0200 Subject: [PATCH] Rewrite ecma_op_get_value_object_base to use ecma_op_object_find_own() call. (#1365) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/ecma/base/ecma-globals.h | 5 ++ .../ecma/operations/ecma-get-put-value.c | 79 +++++++------------ jerry-core/ecma/operations/ecma-objects.c | 6 +- 3 files changed, 37 insertions(+), 53 deletions(-) diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index fa558aae2..b1fb87d3a 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -437,6 +437,11 @@ typedef struct #define ECMA_PROPERTY_VALUE_PTR(property_p) \ ((ecma_property_value_t *) ECMA_PROPERTY_VALUE_DATA_PTR (property_p)) +/** + * Depth limit for property search (maximum prototype chain depth). + */ +#define ECMA_PROPERTY_SEARCH_DEPTH_LIMIT 128 + /** * Property reference. */ diff --git a/jerry-core/ecma/operations/ecma-get-put-value.c b/jerry-core/ecma/operations/ecma-get-put-value.c index a5e148b65..703e299a3 100644 --- a/jerry-core/ecma/operations/ecma-get-put-value.c +++ b/jerry-core/ecma/operations/ecma-get-put-value.c @@ -75,76 +75,55 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc * Returned value must be freed with ecma_free_value. */ ecma_value_t -ecma_op_get_value_object_base (ecma_value_t base, /**< base value */ +ecma_op_get_value_object_base (ecma_value_t base_value, /**< base value */ ecma_string_t *property_name_p) /**< property name */ { - // 4.a - if (ecma_is_value_object (base)) + if (ecma_is_value_object (base_value)) { - // 4.b case 1 - ecma_object_t *obj_p = ecma_get_object_from_value (base); + ecma_object_t *obj_p = ecma_get_object_from_value (base_value); JERRY_ASSERT (obj_p != NULL && !ecma_is_lexical_environment (obj_p)); return ecma_op_object_get (obj_p, property_name_p); } - JERRY_ASSERT (ecma_is_value_boolean (base) - || ecma_is_value_number (base) - || ecma_is_value_string (base)); + JERRY_ASSERT (ecma_is_value_boolean (base_value) + || ecma_is_value_number (base_value) + || ecma_is_value_string (base_value)); - // 4.b case 2 ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); - // 1. - ECMA_TRY_CATCH (obj_base, ecma_op_to_object (base), ret_value); + ECMA_TRY_CATCH (object_base, ecma_op_to_object (base_value), ret_value); - ecma_object_t *obj_p = ecma_get_object_from_value (obj_base); - JERRY_ASSERT (obj_p != NULL - && !ecma_is_lexical_environment (obj_p)); + ecma_object_t *object_p = ecma_get_object_from_value (object_base); + JERRY_ASSERT (object_p != NULL + && !ecma_is_lexical_environment (object_p)); - // 2. - ecma_property_ref_t property_ref; - ecma_property_t property = ecma_op_object_get_property (obj_p, - property_name_p, - &property_ref, - ECMA_PROPERTY_GET_VALUE); + ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); - if (property == ECMA_PROPERTY_TYPE_NOT_FOUND) + /* Circular reference is possible in JavaScript and testing it is complicated. */ + int max_depth = ECMA_PROPERTY_SEARCH_DEPTH_LIMIT; + + do { - // 3. - ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); - } - else if (ECMA_PROPERTY_GET_TYPE (property) == ECMA_PROPERTY_TYPE_NAMEDDATA) - { - // 4. - ret_value = ecma_copy_value (property_ref.value_p->value); - } - else if (ECMA_PROPERTY_GET_TYPE (property) == ECMA_PROPERTY_TYPE_VIRTUAL) - { - // 4. - ret_value = property_ref.virtual_value; - } - else - { - // 5. - JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (property) == ECMA_PROPERTY_TYPE_NAMEDACCESSOR); + ecma_value_t value = ecma_op_object_find_own (base_value, object_p, property_name_p); - ecma_object_t *obj_p = ecma_get_named_accessor_property_getter (property_ref.value_p); - - // 6. - if (obj_p == NULL) + if (ecma_is_value_found (value)) { - ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + ret_value = value; + break; } - else - { - // 7. - ret_value = ecma_op_function_call (obj_p, base, NULL, 0); - } - } - ECMA_FINALIZE (obj_base); + if (--max_depth == 0) + { + break; + } + + object_p = ecma_get_object_prototype (object_p); + } + while (object_p != NULL); + + ECMA_FINALIZE (object_base); return ret_value; } /* ecma_op_get_value_object_base */ diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 7ad68bbeb..99c28f5eb 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -202,7 +202,7 @@ ecma_op_object_get_property (ecma_object_t *object_p, /**< the object */ uint32_t options) /**< option bits */ { /* Circular reference is possible in JavaScript and testing it is complicated. */ - int max_depth = 128; + int max_depth = ECMA_PROPERTY_SEARCH_DEPTH_LIMIT; do { @@ -400,7 +400,7 @@ ecma_op_object_find (ecma_object_t *object_p, /**< the object */ ecma_string_t *property_name_p) /**< property name */ { /* Circular reference is possible in JavaScript and testing it is complicated. */ - int max_depth = 128; + int max_depth = ECMA_PROPERTY_SEARCH_DEPTH_LIMIT; ecma_value_t base_value = ecma_make_object_value (object_p); do @@ -468,7 +468,7 @@ ecma_op_object_get (ecma_object_t *object_p, /**< the object */ ecma_string_t *property_name_p) /**< property name */ { /* Circular reference is possible in JavaScript and testing it is complicated. */ - int max_depth = 128; + int max_depth = ECMA_PROPERTY_SEARCH_DEPTH_LIMIT; ecma_value_t base_value = ecma_make_object_value (object_p); do