From 03274c112a2f25831b598525be2fa9958614ceaf Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Wed, 20 Jun 2018 15:27:45 +0200 Subject: Remove ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND. (#2408) Only the global object bound to the root node of the lexical environment tree does not have a provideThis flag, and ecma_op_implicit_this_value() falls back to the global object. Hence we get the same effect regardless of provideThis. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/ecma/base/ecma-globals.h | 5 ++-- jerry-core/ecma/base/ecma-helpers.c | 34 +++---------------------- jerry-core/ecma/base/ecma-helpers.h | 4 +-- jerry-core/ecma/operations/ecma-lex-env.c | 39 +++++++++-------------------- jerry-core/ecma/operations/ecma-reference.c | 3 +-- jerry-core/vm/vm.c | 4 +-- 6 files changed, 20 insertions(+), 69 deletions(-) (limited to 'jerry-core') diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 75d2a3e4..8194742e 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -613,9 +613,8 @@ typedef enum /* Types between 0 - 12 are ecma_object_type_t which can have a built-in flag. */ ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE = 13, /**< declarative lexical environment */ - ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND = 14, /**< object-bound lexical environment */ - ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 15, /**< object-bound lexical environment - * with provideThis flag */ + ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 14, /**< object-bound lexical environment + * with provideThis flag */ ECMA_LEXICAL_ENVIRONMENT_TYPE_START = ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE, /**< first lexical * environment type */ diff --git a/jerry-core/ecma/base/ecma-helpers.c b/jerry-core/ecma/base/ecma-helpers.c index 275c5496..0f10e7d8 100644 --- a/jerry-core/ecma/base/ecma-helpers.c +++ b/jerry-core/ecma/base/ecma-helpers.c @@ -140,24 +140,14 @@ ecma_create_decl_lex_env (ecma_object_t *outer_lexical_environment_p) /**< outer */ ecma_object_t * ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, /**< outer lexical environment */ - ecma_object_t *binding_obj_p, /**< binding object */ - bool provide_this) /**< provideThis flag */ + ecma_object_t *binding_obj_p) /**< binding object */ { JERRY_ASSERT (binding_obj_p != NULL && !ecma_is_lexical_environment (binding_obj_p)); ecma_object_t *new_lexical_environment_p = ecma_alloc_object (); - uint16_t type; - - if (provide_this) - { - type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND; - } - else - { - type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND; - } + uint16_t type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND; new_lexical_environment_p->type_flags_refs = type; @@ -358,23 +348,6 @@ ecma_get_property_list (const ecma_object_t *object_p) /**< object or lexical en object_p->property_list_or_bound_object_cp); } /* ecma_get_property_list */ -/** - * Get lexical environment's 'provideThis' property - * - * @return true - if it has 'this' property - * false - otherwise - */ -inline bool JERRY_ATTR_PURE -ecma_get_lex_env_provide_this (const ecma_object_t *object_p) /**< object-bound lexical environment */ -{ - JERRY_ASSERT (object_p != NULL); - JERRY_ASSERT (ecma_is_lexical_environment (object_p)); - JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); - - return ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND; -} /* ecma_get_lex_env_provide_this */ - /** * Get lexical environment's bound object. * @@ -385,8 +358,7 @@ ecma_get_lex_env_binding_object (const ecma_object_t *object_p) /**< object-boun { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (ecma_is_lexical_environment (object_p)); - JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); return ECMA_GET_NON_NULL_POINTER (ecma_object_t, object_p->property_list_or_bound_object_cp); diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index 16a12456..7476d377 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -297,8 +297,7 @@ ecma_collection_iterator_next (ecma_value_t *iterator_p); /* ecma-helpers.c */ ecma_object_t *ecma_create_object (ecma_object_t *prototype_object_p, size_t ext_object_size, ecma_object_type_t type); ecma_object_t *ecma_create_decl_lex_env (ecma_object_t *outer_lexical_environment_p); -ecma_object_t *ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p, - bool provide_this); +ecma_object_t *ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p); bool JERRY_ATTR_PURE ecma_is_lexical_environment (const ecma_object_t *object_p); bool JERRY_ATTR_PURE ecma_get_object_extensible (const ecma_object_t *object_p); void ecma_set_object_extensible (ecma_object_t *object_p, bool is_extensible); @@ -311,7 +310,6 @@ ecma_lexical_environment_type_t JERRY_ATTR_PURE ecma_get_lex_env_type (const ecm ecma_object_t JERRY_ATTR_PURE *ecma_get_lex_env_outer_reference (const ecma_object_t *object_p); ecma_property_header_t JERRY_ATTR_PURE *ecma_get_property_list (const ecma_object_t *object_p); ecma_object_t JERRY_ATTR_PURE *ecma_get_lex_env_binding_object (const ecma_object_t *object_p); -bool JERRY_ATTR_PURE ecma_get_lex_env_provide_this (const ecma_object_t *object_p); ecma_property_value_t * ecma_create_named_data_property (ecma_object_t *object_p, ecma_string_t *name_p, uint8_t prop_attributes, diff --git a/jerry-core/ecma/operations/ecma-lex-env.c b/jerry-core/ecma/operations/ecma-lex-env.c index b9438578..758055bd 100644 --- a/jerry-core/ecma/operations/ecma-lex-env.c +++ b/jerry-core/ecma/operations/ecma-lex-env.c @@ -41,7 +41,7 @@ ecma_init_global_lex_env (void) { ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL); - JERRY_CONTEXT (ecma_global_lex_env_p) = ecma_create_object_lex_env (NULL, glob_obj_p, false); + JERRY_CONTEXT (ecma_global_lex_env_p) = ecma_create_object_lex_env (NULL, glob_obj_p); ecma_deref_object (glob_obj_p); } /* ecma_init_global_lex_env */ @@ -94,8 +94,7 @@ ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */ } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); @@ -136,8 +135,7 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); @@ -204,8 +202,7 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); @@ -218,10 +215,8 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment { return completion; } - else - { - JERRY_ASSERT (ecma_is_value_boolean (completion)); - } + + JERRY_ASSERT (ecma_is_value_boolean (completion)); } return ECMA_VALUE_EMPTY; @@ -252,8 +247,7 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */ } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); @@ -322,8 +316,7 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */ } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); @@ -351,20 +344,12 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); - 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_ref_object (binding_obj_p); + ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); + ecma_ref_object (binding_obj_p); - return ecma_make_object_value (binding_obj_p); - } - else - { - return ECMA_VALUE_UNDEFINED; - } + return ecma_make_object_value (binding_obj_p); } } /* ecma_op_implicit_this_value */ diff --git a/jerry-core/ecma/operations/ecma-reference.c b/jerry-core/ecma/operations/ecma-reference.c index b64070e2..961e3c85 100644 --- a/jerry-core/ecma/operations/ecma-reference.c +++ b/jerry-core/ecma/operations/ecma-reference.c @@ -83,8 +83,7 @@ ecma_op_resolve_reference_value (ecma_object_t *lex_env_p, /**< starting lexical } else { - JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND - || ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index 32aae2e3..5c62d087 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -2300,9 +2300,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ object_p = ecma_get_object_from_value (result); - with_env_p = ecma_create_object_lex_env (frame_ctx_p->lex_env_p, - object_p, - true); + with_env_p = ecma_create_object_lex_env (frame_ctx_p->lex_env_p, object_p); ecma_deref_object (object_p); -- cgit v1.2.3