From fc290191653e23bfa816c0ec77826f21b77e4927 Mon Sep 17 00:00:00 2001 From: Gergo Csizi Date: Thu, 12 Aug 2021 17:21:37 +0200 Subject: [PATCH] Simplify jerry_get_resource_name (#4730) JerryScript-DCO-1.0-Signed-off-by: Gergo Csizi csgergo92@gmail.com --- jerry-core/api/jerry.c | 28 +++++++------- tests/unit-core/test-resource-name.c | 56 ++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index aeec8ea12..de0f3ec20 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -5388,26 +5388,24 @@ jerry_value_t jerry_get_resource_name (const jerry_value_t value) /**< jerry api value */ { #if JERRY_RESOURCE_NAME - if (ecma_is_value_undefined (value)) + if (ecma_is_value_undefined (value) && JERRY_CONTEXT (vm_top_context_p) != NULL) { - if (JERRY_CONTEXT (vm_top_context_p) != NULL) - { - return ecma_copy_value (ecma_get_resource_name (JERRY_CONTEXT (vm_top_context_p)->shared_p->bytecode_header_p)); - } + return ecma_copy_value (ecma_get_resource_name (JERRY_CONTEXT (vm_top_context_p)->shared_p->bytecode_header_p)); } - else if (ecma_is_value_object (value)) + + const ecma_compiled_code_t *bytecode_p = ecma_bytecode_get_from_value (value); + + if (bytecode_p == NULL) { - ecma_object_t *obj_p = ecma_get_object_from_value (value); + return ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_ANON); + } - if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION - && !ecma_get_object_is_builtin (obj_p)) - { - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) obj_p; + ecma_value_t script_value = ((cbc_uint8_arguments_t *) bytecode_p)->script_value; + cbc_script_t *script_p = ECMA_GET_INTERNAL_VALUE_POINTER (cbc_script_t, script_value); - const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); - - return ecma_copy_value (ecma_get_resource_name (bytecode_data_p)); - } + if (CBC_SCRIPT_GET_TYPE (script_p) == CBC_SCRIPT_GENERIC) + { + return ecma_copy_value (script_p->resource_name); } #endif /* JERRY_RESOURCE_NAME */ diff --git a/tests/unit-core/test-resource-name.c b/tests/unit-core/test-resource-name.c index b8a5cf0c8..d43ede7cd 100644 --- a/tests/unit-core/test-resource-name.c +++ b/tests/unit-core/test-resource-name.c @@ -114,6 +114,62 @@ main (void) jerry_release_value (resource_value); jerry_release_value (parse_options.resource_name); + jerry_release_value (run_result); + jerry_release_value (program); + if (jerry_is_feature_enabled (JERRY_FEATURE_MODULE)) + { + const char *source_3 = ""; + + parse_options.options = JERRY_PARSE_MODULE | JERRY_PARSE_HAS_RESOURCE; + parse_options.resource_name = jerry_create_string ((const jerry_char_t *) "demo3.js"); + + program = jerry_parse ((const jerry_char_t *) source_3, + strlen (source_3), + &parse_options); + TEST_ASSERT (!jerry_value_is_error (program)); + + resource_value = jerry_get_resource_name (program); + TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, resource_value, parse_options.resource_name)); + jerry_release_value (resource_value); + + run_result = jerry_module_link (program, NULL, NULL); + TEST_ASSERT (!jerry_value_is_error (run_result)); + + resource_value = jerry_get_resource_name (run_result); + TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, resource_value, parse_options.resource_name)); + jerry_release_value (resource_value); + jerry_release_value (run_result); + + run_result = jerry_module_evaluate (program); + TEST_ASSERT (!jerry_value_is_error (run_result)); + + resource_value = jerry_get_resource_name (run_result); + TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, resource_value, parse_options.resource_name)); + jerry_release_value (resource_value); + jerry_release_value (run_result); + jerry_release_value (program); + jerry_release_value (parse_options.resource_name); + } + const char *source_4 = ("function f(){} \n" + "f.bind().bind();"); + + parse_options.options = JERRY_PARSE_HAS_RESOURCE; + parse_options.resource_name = jerry_create_string ((jerry_char_t *) "demo4.js"); + + program = jerry_parse ((const jerry_char_t *) source_4, + strlen (source_4), + &parse_options); + TEST_ASSERT (!jerry_value_is_error (program)); + + run_result = jerry_run (program); + TEST_ASSERT (!jerry_value_is_error (run_result)); + TEST_ASSERT (jerry_value_is_object (run_result)); + + resource_value = jerry_get_resource_name (run_result); + TEST_ASSERT (jerry_binary_operation (JERRY_BIN_OP_STRICT_EQUAL, resource_value, parse_options.resource_name)); + + jerry_release_value (resource_value); + jerry_release_value (parse_options.resource_name); jerry_release_value (run_result); jerry_release_value (program);