Skip to content

Commit fc264c9

Browse files
committed
Remove ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND.
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 [email protected]
1 parent acdbbf2 commit fc264c9

File tree

6 files changed

+20
-69
lines changed

6 files changed

+20
-69
lines changed

jerry-core/ecma/base/ecma-globals.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -613,9 +613,8 @@ typedef enum
613613
/* Types between 0 - 12 are ecma_object_type_t which can have a built-in flag. */
614614

615615
ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE = 13, /**< declarative lexical environment */
616-
ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND = 14, /**< object-bound lexical environment */
617-
ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 15, /**< object-bound lexical environment
618-
* with provideThis flag */
616+
ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 14, /**< object-bound lexical environment
617+
* with provideThis flag */
619618

620619
ECMA_LEXICAL_ENVIRONMENT_TYPE_START = ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE, /**< first lexical
621620
* environment type */

jerry-core/ecma/base/ecma-helpers.c

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -140,24 +140,14 @@ ecma_create_decl_lex_env (ecma_object_t *outer_lexical_environment_p) /**< outer
140140
*/
141141
ecma_object_t *
142142
ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, /**< outer lexical environment */
143-
ecma_object_t *binding_obj_p, /**< binding object */
144-
bool provide_this) /**< provideThis flag */
143+
ecma_object_t *binding_obj_p) /**< binding object */
145144
{
146145
JERRY_ASSERT (binding_obj_p != NULL
147146
&& !ecma_is_lexical_environment (binding_obj_p));
148147

149148
ecma_object_t *new_lexical_environment_p = ecma_alloc_object ();
150149

151-
uint16_t type;
152-
153-
if (provide_this)
154-
{
155-
type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND;
156-
}
157-
else
158-
{
159-
type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND;
160-
}
150+
uint16_t type = ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND;
161151

162152
new_lexical_environment_p->type_flags_refs = type;
163153

@@ -358,23 +348,6 @@ ecma_get_property_list (const ecma_object_t *object_p) /**< object or lexical en
358348
object_p->property_list_or_bound_object_cp);
359349
} /* ecma_get_property_list */
360350

361-
/**
362-
* Get lexical environment's 'provideThis' property
363-
*
364-
* @return true - if it has 'this' property
365-
* false - otherwise
366-
*/
367-
inline bool JERRY_ATTR_PURE
368-
ecma_get_lex_env_provide_this (const ecma_object_t *object_p) /**< object-bound lexical environment */
369-
{
370-
JERRY_ASSERT (object_p != NULL);
371-
JERRY_ASSERT (ecma_is_lexical_environment (object_p));
372-
JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
373-
|| ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
374-
375-
return ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND;
376-
} /* ecma_get_lex_env_provide_this */
377-
378351
/**
379352
* Get lexical environment's bound object.
380353
*
@@ -385,8 +358,7 @@ ecma_get_lex_env_binding_object (const ecma_object_t *object_p) /**< object-boun
385358
{
386359
JERRY_ASSERT (object_p != NULL);
387360
JERRY_ASSERT (ecma_is_lexical_environment (object_p));
388-
JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
389-
|| ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
361+
JERRY_ASSERT (ecma_get_lex_env_type (object_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
390362

391363
return ECMA_GET_NON_NULL_POINTER (ecma_object_t,
392364
object_p->property_list_or_bound_object_cp);

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,7 @@ ecma_collection_iterator_next (ecma_value_t *iterator_p);
297297
/* ecma-helpers.c */
298298
ecma_object_t *ecma_create_object (ecma_object_t *prototype_object_p, size_t ext_object_size, ecma_object_type_t type);
299299
ecma_object_t *ecma_create_decl_lex_env (ecma_object_t *outer_lexical_environment_p);
300-
ecma_object_t *ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p,
301-
bool provide_this);
300+
ecma_object_t *ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p);
302301
bool JERRY_ATTR_PURE ecma_is_lexical_environment (const ecma_object_t *object_p);
303302
bool JERRY_ATTR_PURE ecma_get_object_extensible (const ecma_object_t *object_p);
304303
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
311310
ecma_object_t JERRY_ATTR_PURE *ecma_get_lex_env_outer_reference (const ecma_object_t *object_p);
312311
ecma_property_header_t JERRY_ATTR_PURE *ecma_get_property_list (const ecma_object_t *object_p);
313312
ecma_object_t JERRY_ATTR_PURE *ecma_get_lex_env_binding_object (const ecma_object_t *object_p);
314-
bool JERRY_ATTR_PURE ecma_get_lex_env_provide_this (const ecma_object_t *object_p);
315313

316314
ecma_property_value_t *
317315
ecma_create_named_data_property (ecma_object_t *object_p, ecma_string_t *name_p, uint8_t prop_attributes,

jerry-core/ecma/operations/ecma-lex-env.c

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ ecma_init_global_lex_env (void)
4141
{
4242
ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
4343

44-
JERRY_CONTEXT (ecma_global_lex_env_p) = ecma_create_object_lex_env (NULL, glob_obj_p, false);
44+
JERRY_CONTEXT (ecma_global_lex_env_p) = ecma_create_object_lex_env (NULL, glob_obj_p);
4545

4646
ecma_deref_object (glob_obj_p);
4747
} /* ecma_init_global_lex_env */
@@ -94,8 +94,7 @@ ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */
9494
}
9595
else
9696
{
97-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
98-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
97+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
9998

10099
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
101100

@@ -136,8 +135,7 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
136135
}
137136
else
138137
{
139-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
140-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
138+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
141139

142140
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
143141

@@ -204,8 +202,7 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
204202
}
205203
else
206204
{
207-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
208-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
205+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
209206

210207
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
211208

@@ -218,10 +215,8 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
218215
{
219216
return completion;
220217
}
221-
else
222-
{
223-
JERRY_ASSERT (ecma_is_value_boolean (completion));
224-
}
218+
219+
JERRY_ASSERT (ecma_is_value_boolean (completion));
225220
}
226221

227222
return ECMA_VALUE_EMPTY;
@@ -252,8 +247,7 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
252247
}
253248
else
254249
{
255-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
256-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
250+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
257251

258252
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
259253

@@ -322,8 +316,7 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
322316
}
323317
else
324318
{
325-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
326-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
319+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
327320

328321
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
329322

@@ -351,20 +344,12 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment
351344
}
352345
else
353346
{
354-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
355-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
347+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
356348

357-
if (ecma_get_lex_env_provide_this (lex_env_p))
358-
{
359-
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
360-
ecma_ref_object (binding_obj_p);
349+
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
350+
ecma_ref_object (binding_obj_p);
361351

362-
return ecma_make_object_value (binding_obj_p);
363-
}
364-
else
365-
{
366-
return ECMA_VALUE_UNDEFINED;
367-
}
352+
return ecma_make_object_value (binding_obj_p);
368353
}
369354
} /* ecma_op_implicit_this_value */
370355

jerry-core/ecma/operations/ecma-reference.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ ecma_op_resolve_reference_value (ecma_object_t *lex_env_p, /**< starting lexical
8383
}
8484
else
8585
{
86-
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECT_BOUND
87-
|| ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
86+
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND);
8887

8988
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
9089

jerry-core/vm/vm.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,9 +2300,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
23002300

23012301
object_p = ecma_get_object_from_value (result);
23022302

2303-
with_env_p = ecma_create_object_lex_env (frame_ctx_p->lex_env_p,
2304-
object_p,
2305-
true);
2303+
with_env_p = ecma_create_object_lex_env (frame_ctx_p->lex_env_p, object_p);
23062304

23072305
ecma_deref_object (object_p);
23082306

0 commit comments

Comments
 (0)