diff --git a/src/libcoreint/opcodes-helpers-variables.c b/src/libcoreint/opcodes-helpers-variables.c index c07984fa5..c1e6e90e5 100644 --- a/src/libcoreint/opcodes-helpers-variables.c +++ b/src/libcoreint/opcodes-helpers-variables.c @@ -42,9 +42,9 @@ do_strict_eval_arguments_check (ecma_reference_t ref) /**< ECMA-reference */ ecma_string_t* magic_string_eval = ecma_get_magic_string (ECMA_MAGIC_STRING_EVAL); ecma_string_t* magic_string_arguments = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS); - ret = (ecma_compare_ecma_strings (ref.referenced_name_p, + ret = (ecma_compare_ecma_strings (ECMA_GET_POINTER (ref.referenced_name_cp), magic_string_eval) - || ecma_compare_ecma_strings (ref.referenced_name_p, + || ecma_compare_ecma_strings (ECMA_GET_POINTER (ref.referenced_name_cp), magic_string_arguments)); ecma_deref_ecma_string (magic_string_eval); diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index 469a9cc69..10f24df9a 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -1472,7 +1472,7 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */ JERRY_ASSERT (ecma_is_lexical_environment (bindings_p)); ECMA_TRY_CATCH (delete_completion, - ecma_op_delete_binding (bindings_p, ref.referenced_name_p), + ecma_op_delete_binding (bindings_p, ECMA_GET_POINTER (ref.referenced_name_cp)), ret_value); ret_value = set_variable_value (int_data, dst_var_idx, delete_completion.u.value); diff --git a/src/libecmaobjects/ecma-globals.h b/src/libecmaobjects/ecma-globals.h index 201c1688a..10a8eb391 100644 --- a/src/libecmaobjects/ecma-globals.h +++ b/src/libecmaobjects/ecma-globals.h @@ -773,10 +773,10 @@ typedef struct ecma_value_t base; /** referenced name */ - ecma_string_t *referenced_name_p; + unsigned int referenced_name_cp : ECMA_POINTER_FIELD_WIDTH; /** strict reference flag */ - bool is_strict; + unsigned int is_strict : 1; } ecma_reference_t; /** diff --git a/src/libecmaoperations/ecma-get-put-value.c b/src/libecmaoperations/ecma-get-put-value.c index 51b13eb58..d8a0fb01d 100644 --- a/src/libecmaoperations/ecma-get-put-value.c +++ b/src/libecmaoperations/ecma-get-put-value.c @@ -73,7 +73,7 @@ ecma_op_get_value (ecma_reference_t ref) /**< ECMA-reference */ JERRY_ASSERT(obj_p != NULL && !ecma_is_lexical_environment (obj_p)); - return ecma_op_object_get (obj_p, ref.referenced_name_p); + return ecma_op_object_get (obj_p, ECMA_GET_POINTER (ref.referenced_name_cp)); } else { @@ -86,7 +86,7 @@ ecma_op_get_value (ecma_reference_t ref) /**< ECMA-reference */ JERRY_ASSERT (obj_p != NULL && !ecma_is_lexical_environment (obj_p)); - ret_value = ecma_op_object_get (obj_p, ref.referenced_name_p); + ret_value = ecma_op_object_get (obj_p, ECMA_GET_POINTER (ref.referenced_name_cp)); ECMA_FINALIZE (obj_base); @@ -101,7 +101,9 @@ ecma_op_get_value (ecma_reference_t ref) /**< ECMA-reference */ && ecma_is_lexical_environment (lex_env_p)); // 5.a - return ecma_op_get_binding_value (lex_env_p, ref.referenced_name_p, ref.is_strict); + return ecma_op_get_binding_value (lex_env_p, + ECMA_GET_POINTER (ref.referenced_name_cp), + ref.is_strict); } } /* ecma_op_get_value */ @@ -159,7 +161,7 @@ ecma_op_put_value (ecma_reference_t ref, /**< ECMA-reference */ ecma_object_t *global_object_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL); ecma_completion_value_t completion = ecma_op_object_put (global_object_p, - ref.referenced_name_p, + ECMA_GET_POINTER (ref.referenced_name_cp), value, false); @@ -186,7 +188,7 @@ ecma_op_put_value (ecma_reference_t ref, /**< ECMA-reference */ ECMA_TRY_CATCH (put_completion, ecma_op_object_put (obj_p, - ref.referenced_name_p, + ECMA_GET_POINTER (ref.referenced_name_cp), value, ref.is_strict), ret_value); @@ -209,18 +211,20 @@ ecma_op_put_value (ecma_reference_t ref, /**< ECMA-reference */ JERRY_ASSERT (obj_p != NULL && !ecma_is_lexical_environment (obj_p)); + ecma_string_t *referenced_name_p = ECMA_GET_POINTER (ref.referenced_name_cp); + // sub_2. - if (!ecma_op_object_can_put (obj_p, ref.referenced_name_p)) + if (!ecma_op_object_can_put (obj_p, referenced_name_p)) { ret_value = ecma_reject_put (ref.is_strict); } else { // sub_3. - ecma_property_t *own_prop_p = ecma_op_object_get_own_property (obj_p, ref.referenced_name_p); + ecma_property_t *own_prop_p = ecma_op_object_get_own_property (obj_p, referenced_name_p); // sub_5. - ecma_property_t *prop_p = ecma_op_object_get_property (obj_p, ref.referenced_name_p); + ecma_property_t *prop_p = ecma_op_object_get_property (obj_p, referenced_name_p); // sub_4., sub_7 if ((own_prop_p != NULL @@ -261,7 +265,10 @@ ecma_op_put_value (ecma_reference_t ref, /**< ECMA-reference */ && ecma_is_lexical_environment (lex_env_p)); // 5.a. - return ecma_op_set_mutable_binding (lex_env_p, ref.referenced_name_p, value, ref.is_strict); + return ecma_op_set_mutable_binding (lex_env_p, + ECMA_GET_POINTER (ref.referenced_name_cp), + value, + ref.is_strict); } } /* ecma_op_put_value */ diff --git a/src/libecmaoperations/ecma-reference.c b/src/libecmaoperations/ecma-reference.c index 0aad474fd..5448a2e93 100644 --- a/src/libecmaoperations/ecma-reference.c +++ b/src/libecmaoperations/ecma-reference.c @@ -84,10 +84,11 @@ ecma_make_reference (ecma_value_t base, /**< base value */ ecma_reference_t ref = (ecma_reference_t) { .base = ecma_copy_value (base, true), - .referenced_name_p = name_p, .is_strict = is_strict }; + ECMA_SET_POINTER (ref.referenced_name_cp, name_p); + return ref; } /* ecma_make_reference */ @@ -101,7 +102,7 @@ void ecma_free_reference (ecma_reference_t ref) /**< reference */ { ecma_free_value (ref.base, true); - ecma_deref_ecma_string (ref.referenced_name_p); + ecma_deref_ecma_string (ECMA_GET_POINTER (ref.referenced_name_cp)); } /* ecma_free_reference */ /**