Support function object retrieval for async functions (#4668)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2021-05-11 12:22:37 +02:00
committed by GitHub
parent a58884c169
commit e042998f02
8 changed files with 141 additions and 62 deletions
+128 -49
View File
@@ -95,6 +95,40 @@ backtrace_callback (jerry_backtrace_frame_t *frame_p, /* frame information */
return false;
} /* backtrace_callback */
static bool
async_backtrace_callback (jerry_backtrace_frame_t *frame_p, /* frame information */
void *user_p) /* user data */
{
TEST_ASSERT ((void *) handler_args_p == user_p);
TEST_ASSERT (jerry_backtrace_get_frame_type (frame_p) == JERRY_BACKTRACE_FRAME_JS);
const jerry_backtrace_location_t *location_p = jerry_backtrace_get_location (frame_p);
const jerry_value_t *function_p = jerry_backtrace_get_function (frame_p);
TEST_ASSERT (location_p != NULL);
TEST_ASSERT (function_p != NULL);
compare_string (location_p->resource_name, "async_capture_test.js");
++frame_index;
if (frame_index == 1)
{
TEST_ASSERT (jerry_backtrace_is_strict (frame_p));
TEST_ASSERT (location_p->line == 3);
TEST_ASSERT (location_p->column == 1);
TEST_ASSERT (handler_args_p[0] == *function_p);
return true;
}
TEST_ASSERT (frame_index == 2);
TEST_ASSERT (!jerry_backtrace_is_strict (frame_p));
TEST_ASSERT (location_p->line == 8);
TEST_ASSERT (location_p->column == 1);
TEST_ASSERT (handler_args_p[1] == *function_p);
return true;
} /* async_backtrace_callback */
static jerry_value_t
capture_handler (const jerry_call_info_t *call_info_p, /**< call information */
const jerry_value_t args_p[], /**< argument list */
@@ -104,12 +138,14 @@ capture_handler (const jerry_call_info_t *call_info_p, /**< call information */
JERRY_UNUSED (args_p);
JERRY_UNUSED (args_count);
TEST_ASSERT (args_count == 3);
TEST_ASSERT (args_count == 2 || args_count == 3);
TEST_ASSERT (frame_index == 0);
frame_index = 0;
handler_args_p = args_p;
jerry_backtrace_capture (backtrace_callback, (void *) args_p);
TEST_ASSERT (frame_index == 3);
jerry_backtrace_capture (args_count == 3 ? backtrace_callback : async_backtrace_callback, (void *) args_p);
TEST_ASSERT (frame_index == (int) args_count);
return jerry_create_undefined ();
} /* capture_handler */
@@ -186,21 +222,21 @@ test_get_backtrace_api_call (void)
register_callback (backtrace_handler, "backtrace");
register_callback (capture_handler, "capture");
const char *source = ("function f() {\n"
" return backtrace(0);\n"
"}\n"
"\n"
"function g() {\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
const char *source_p = ("function f() {\n"
" return backtrace(0);\n"
"}\n"
"\n"
"function g() {\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
jerry_value_t backtrace = run ("something.js", source);
jerry_value_t backtrace = run ("something.js", source_p);
TEST_ASSERT (!jerry_value_is_error (backtrace)
&& jerry_value_is_array (backtrace));
@@ -216,21 +252,21 @@ test_get_backtrace_api_call (void)
/* Depth set to 2 this time. */
source = ("function f() {\n"
" return backtrace(2);\n"
"}\n"
"\n"
"function g() {\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
source_p = ("function f() {\n"
" return backtrace(2);\n"
"}\n"
"\n"
"function g() {\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
backtrace = run ("something_else.js", source);
backtrace = run ("something_else.js", source_p);
TEST_ASSERT (!jerry_value_is_error (backtrace)
&& jerry_value_is_array (backtrace));
@@ -244,25 +280,68 @@ test_get_backtrace_api_call (void)
/* Test frame capturing. */
source = ("function f() {\n"
" return capture(f, g, h);\n"
"}\n"
"\n"
"function g() {\n"
" 'use strict';\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
frame_index = 0;
source_p = ("function f() {\n"
" return capture(f, g, h);\n"
"}\n"
"\n"
"function g() {\n"
" 'use strict';\n"
" return f();\n"
"}\n"
"\n"
"function h() {\n"
" return g();\n"
"}\n"
"\n"
"h();\n");
backtrace = run ("capture_test.js", source);
jerry_value_t result = run ("capture_test.js", source_p);
TEST_ASSERT (jerry_value_is_undefined (backtrace));
jerry_release_value (backtrace);
TEST_ASSERT (jerry_value_is_undefined (result));
jerry_release_value (result);
TEST_ASSERT (frame_index == 3);
/* Test async frame capturing. */
source_p = "async function f() {}";
result = jerry_eval ((const jerry_char_t *) source_p, strlen (source_p), JERRY_PARSE_NO_OPTS);
if (!jerry_value_is_error (result))
{
jerry_release_value (result);
frame_index = 0;
source_p = ("function f() {\n"
" 'use strict';\n"
" return capture(f, g);\n"
"}\n"
"\n"
"async function g() {\n"
" await 0;\n"
" return f();\n"
"}\n"
"\n"
"g();\n");
result = run ("async_capture_test.js", source_p);
TEST_ASSERT (jerry_value_is_promise (result));
jerry_release_value (result);
TEST_ASSERT (frame_index == 0);
result = jerry_run_all_enqueued_jobs ();
TEST_ASSERT (!jerry_value_is_error (result));
TEST_ASSERT (frame_index == 2);
}
else
{
TEST_ASSERT (jerry_get_error_type (result) == JERRY_ERROR_SYNTAX);
}
jerry_release_value (result);
jerry_cleanup ();
} /* test_get_backtrace_api_call */