diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c index a087bd4d1..366043cbd 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c @@ -164,7 +164,6 @@ ecma_builtin_date_prototype_to_json (ecma_value_t this_arg) /**< this argument * } ecma_value_t ret_value = ECMA_VALUE_ERROR; - ecma_object_t *value_obj_p = ecma_get_object_from_value (obj); /* 4. */ @@ -180,8 +179,7 @@ ecma_builtin_date_prototype_to_json (ecma_value_t this_arg) /**< this argument * /* 6. */ else { - ecma_object_t *to_iso_obj_p = ecma_get_object_from_value (to_iso); - ret_value = ecma_op_function_call (to_iso_obj_p, this_arg, NULL, 0); + ret_value = ecma_op_invoke_by_magic_id (obj, LIT_MAGIC_STRING_TO_ISO_STRING_UL, NULL, 0); } ecma_free_value (to_iso); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c index 5d55d7171..616df69b9 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c @@ -210,53 +210,18 @@ ecma_builtin_helper_get_to_locale_string_at_index (ecma_object_t *obj_p, /**< th return ecma_get_magic_string (LIT_MAGIC_STRING__EMPTY); } - ecma_value_t index_obj_value = ecma_op_to_object (index_value); + ecma_value_t call_value = ecma_op_invoke_by_magic_id (index_value, LIT_MAGIC_STRING_TO_LOCALE_STRING_UL, NULL, 0); - if (ECMA_IS_VALUE_ERROR (index_obj_value)) - { - ecma_free_value (index_value); - return NULL; - } - - ecma_string_t *ret_string_p = NULL; - ecma_object_t *index_obj_p = ecma_get_object_from_value (index_obj_value); - ecma_value_t to_locale_value = ecma_op_object_get_by_magic_id (index_obj_p, LIT_MAGIC_STRING_TO_LOCALE_STRING_UL); - - if (ECMA_IS_VALUE_ERROR (to_locale_value)) - { - goto cleanup; - } - - if (!ecma_op_is_callable (to_locale_value)) - { - ecma_free_value (to_locale_value); - ecma_raise_type_error (ECMA_ERR_MSG ("'toLocaleString' is missing or not a function.")); - goto cleanup; - } - - ecma_object_t *locale_func_obj_p = ecma_get_object_from_value (to_locale_value); -#if ENABLED (JERRY_ESNEXT) - ecma_value_t index_parameter = index_value; -#else /* !ENABLED (JERRY_ESNEXT) */ - ecma_value_t index_parameter = index_obj_value; -#endif /* ENABLED (JERRY_ESNEXT) */ - ecma_value_t call_value = ecma_op_function_call (locale_func_obj_p, - index_parameter, - NULL, - 0); - ecma_deref_object (locale_func_obj_p); + ecma_free_value (index_value); if (ECMA_IS_VALUE_ERROR (call_value)) { - goto cleanup; + return NULL; } - ret_string_p = ecma_op_to_string (call_value); - ecma_free_value (call_value); + ecma_string_t *ret_string_p = ecma_op_to_string (call_value); -cleanup: - ecma_deref_object (index_obj_p); - ecma_free_value (index_value); + ecma_free_value (call_value); return ret_string_p; } /* ecma_builtin_helper_get_to_locale_string_at_index */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-object-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-object-prototype.c index 20fbcb08d..ad7423f68 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-object-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-object-prototype.c @@ -108,33 +108,9 @@ ecma_builtin_object_prototype_object_value_of (ecma_value_t this_arg) /**< this * Returned value must be freed with ecma_free_value. */ static ecma_value_t -ecma_builtin_object_prototype_object_to_locale_string (ecma_value_t this_arg, /**< this argument */ - ecma_object_t *obj_p) /**< this argument as an object */ +ecma_builtin_object_prototype_object_to_locale_string (ecma_value_t this_arg) /**< this argument */ { - /* 2. */ - - ecma_string_t *string_to_string = ecma_get_magic_string (LIT_MAGIC_STRING_TO_STRING_UL); - ecma_value_t to_string_val = ecma_op_object_get_with_receiver (obj_p, string_to_string, this_arg); - - if (ECMA_IS_VALUE_ERROR (to_string_val)) - { - return to_string_val; - } - - /* 3. */ - if (!ecma_op_is_callable (to_string_val)) - { - ecma_free_value (to_string_val); - return ecma_raise_type_error (ECMA_ERR_MSG ("'toString is missing or not a function.'")); - } - - /* 4. */ - ecma_object_t *to_string_func_obj_p = ecma_get_object_from_value (to_string_val); - ecma_value_t ret_value = ecma_op_function_call (to_string_func_obj_p, this_arg, NULL, 0); - - ecma_deref_object (to_string_func_obj_p); - - return ret_value; + return ecma_op_invoke_by_magic_id (this_arg, LIT_MAGIC_STRING_TO_STRING_UL, &this_arg, 1); } /* ecma_builtin_object_prototype_object_to_locale_string */ /** @@ -267,6 +243,11 @@ ecma_builtin_object_prototype_dispatch_routine (uint16_t builtin_routine_id, /** } } + if (builtin_routine_id == ECMA_OBJECT_PROTOTYPE_TO_LOCALE_STRING) + { + return ecma_builtin_object_prototype_object_to_locale_string (this_arg); + } + ecma_value_t to_object = ecma_op_to_object (this_arg); if (ECMA_IS_VALUE_ERROR (to_object)) @@ -278,26 +259,15 @@ ecma_builtin_object_prototype_dispatch_routine (uint16_t builtin_routine_id, /** ecma_value_t ret_value; - if (builtin_routine_id == ECMA_OBJECT_PROTOTYPE_IS_PROTOTYPE_OF) - { - ret_value = ecma_builtin_object_prototype_object_is_prototype_of (obj_p, arguments_list_p[0]); - } - #if ENABLED (JERRY_ESNEXT) - else if (builtin_routine_id == ECMA_OBJECT_PROTOTYPE_GET_PROTO) + if (builtin_routine_id == ECMA_OBJECT_PROTOTYPE_GET_PROTO) { ret_value = ecma_builtin_object_object_get_prototype_of (obj_p); } -#endif /* ENABLED (JERRY_ESNEXT)*/ - else +#endif /* ENABLED (JERRY_ESNEXT)*/ { -#if ENABLED (JERRY_ESNEXT) - ecma_value_t this_parameter = this_arg; -#else /* !ENABLED (JERRY_ESNEXT) */ - ecma_value_t this_parameter = ecma_make_object_value (obj_p); -#endif /* ENABLED (JERRY_ESNEXT) */ - ret_value = ecma_builtin_object_prototype_object_to_locale_string (this_parameter, obj_p); + ret_value = ecma_builtin_object_prototype_object_is_prototype_of (obj_p, arguments_list_p[0]); } ecma_deref_object (obj_p); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-promise-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-promise-prototype.c index 09d00c3c3..a5706debc 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-promise-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-promise-prototype.c @@ -65,9 +65,8 @@ static ecma_value_t ecma_builtin_promise_prototype_catch (ecma_value_t this_arg, /**< this argument */ ecma_value_t on_rejected) /**< on_rejected function */ { - return ecma_promise_then (this_arg, - ECMA_VALUE_UNDEFINED, - on_rejected); + ecma_value_t args[] = {ECMA_VALUE_UNDEFINED, on_rejected}; + return ecma_op_invoke_by_magic_id (this_arg, LIT_MAGIC_STRING_THEN, args, 2); } /* ecma_builtin_promise_prototype_catch */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c index 89f253490..c0b73ce3f 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c @@ -655,24 +655,8 @@ ecma_builtin_string_prototype_object_search (ecma_value_t this_value, /**< this ecma_deref_object (ecma_get_object_from_value (new_regexp)); #else /* ENABLED (JERRY_ESNEXT) */ ecma_object_t *regexp_obj_p = ecma_get_object_from_value (new_regexp); - ecma_value_t search_symbol = ecma_op_object_get_by_symbol_id (regexp_obj_p, LIT_GLOBAL_SYMBOL_SEARCH); - if (ECMA_IS_VALUE_ERROR (search_symbol)) - { - goto cleanup_regexp; - } - - if (!ecma_op_is_callable (search_symbol)) - { - result = ecma_raise_type_error (ECMA_ERR_MSG ("@@search is not callable")); - goto cleanup_regexp; - } - - ecma_object_t *search_method_p = ecma_get_object_from_value (search_symbol); - ecma_value_t arguments[] = { ecma_make_string_value (string_p) }; - result = ecma_op_function_call (search_method_p, new_regexp, arguments, 1); - ecma_deref_object (search_method_p); - -cleanup_regexp: + ecma_value_t this_str_value = ecma_make_string_value (string_p); + result = ecma_op_invoke_by_symbol_id (new_regexp, LIT_GLOBAL_SYMBOL_SEARCH, &this_str_value, 1); ecma_deref_object (regexp_obj_p); #endif /* !ENABLED (JERRY_ESNEXT) */ diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 951c9abcc..dfffa67d9 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -3072,7 +3072,14 @@ ecma_op_invoke (ecma_value_t object, /**< Object value */ } ecma_object_t *object_p = ecma_get_object_from_value (object_value); - ecma_value_t func = ecma_op_object_get (object_p, property_name_p); + +#if ENABLED (JERRY_ESNEXT) + ecma_value_t this_arg = object; +#else /* !ENABLED (JERRY_ESNEXT) */ + ecma_value_t this_arg = object_value; +#endif /* ENABLED (JERRY_ESNEXT) */ + + ecma_value_t func = ecma_op_object_get_with_receiver (object_p, property_name_p, this_arg); if (ECMA_IS_VALUE_ERROR (func)) { @@ -3089,7 +3096,8 @@ ecma_op_invoke (ecma_value_t object, /**< Object value */ } ecma_object_t *func_obj_p = ecma_get_object_from_value (func); - ecma_value_t call_result = ecma_op_function_call (func_obj_p, object, args_p, args_len); + ecma_value_t call_result = ecma_op_function_call (func_obj_p, this_arg, args_p, args_len); + ecma_deref_object (object_p); ecma_deref_object (func_obj_p); diff --git a/tests/test262-es6-excludelist.xml b/tests/test262-es6-excludelist.xml index f21fc0c63..4f1fd00b1 100644 --- a/tests/test262-es6-excludelist.xml +++ b/tests/test262-es6-excludelist.xml @@ -40,7 +40,6 @@ -