Support parsing of scripts / functions stored in string values (#4728)
Function arguments must be passed as string values. Snapshots are generated from compiled code rather than source code. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -844,17 +844,19 @@ main (void)
|
||||
jerry_release_value (val_t);
|
||||
|
||||
/* Test: create function */
|
||||
const jerry_char_t func_arg_list[] = "a , b,c";
|
||||
const jerry_char_t func_src[] = " return 5 + a+\nb+c";
|
||||
jerry_value_t script_source = jerry_create_string ((const jerry_char_t *) " return 5 + a+\nb+c");
|
||||
|
||||
jerry_value_t func_val = jerry_parse_function (func_arg_list,
|
||||
sizeof (func_arg_list) - 1,
|
||||
func_src,
|
||||
sizeof (func_src) - 1,
|
||||
NULL);
|
||||
jerry_parse_options_t parse_options;
|
||||
parse_options.options = JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
parse_options.argument_list = jerry_create_string ((const jerry_char_t *) "a , b,c");
|
||||
|
||||
jerry_value_t func_val = jerry_parse_value (script_source, &parse_options);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (func_val));
|
||||
|
||||
jerry_release_value (parse_options.argument_list);
|
||||
jerry_release_value (script_source);
|
||||
|
||||
jerry_value_t func_args[3] =
|
||||
{
|
||||
jerry_create_number (4),
|
||||
@@ -869,6 +871,24 @@ main (void)
|
||||
jerry_release_value (val_t);
|
||||
jerry_release_value (func_val);
|
||||
|
||||
parse_options.options = JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
parse_options.argument_list = jerry_create_null ();
|
||||
|
||||
func_val = jerry_parse ((const jerry_char_t *) "", 0, &parse_options);
|
||||
jerry_release_value (parse_options.argument_list);
|
||||
|
||||
TEST_ASSERT (jerry_value_is_error (func_val)
|
||||
&& jerry_get_error_type (func_val) == JERRY_ERROR_TYPE);
|
||||
jerry_release_value (func_val);
|
||||
|
||||
script_source = jerry_create_number (4.5);
|
||||
func_val = jerry_parse_value (script_source, NULL);
|
||||
jerry_release_value (script_source);
|
||||
|
||||
TEST_ASSERT (jerry_value_is_error (func_val)
|
||||
&& jerry_get_error_type (func_val) == JERRY_ERROR_TYPE);
|
||||
jerry_release_value (func_val);
|
||||
|
||||
jerry_cleanup ();
|
||||
|
||||
TEST_ASSERT (test_api_is_free_callback_was_called);
|
||||
@@ -1048,7 +1068,6 @@ main (void)
|
||||
"SyntaxError: Primary expression expected [<anonymous>:2:10]",
|
||||
false);
|
||||
|
||||
jerry_parse_options_t parse_options;
|
||||
parse_options.options = JERRY_PARSE_HAS_RESOURCE;
|
||||
parse_options.resource_name = jerry_create_string ((const jerry_char_t *) "filename.js");
|
||||
|
||||
|
||||
@@ -36,13 +36,14 @@ main (void)
|
||||
jerry_value_t regex_obj = jerry_create_regexp (pattern2, flags);
|
||||
TEST_ASSERT (jerry_value_is_object (regex_obj));
|
||||
|
||||
const jerry_char_t func_arg_list[] = "regex";
|
||||
const jerry_char_t func_src2[] = "return [regex.exec('a\\nb'), regex.dotAll, regex.sticky, regex.unicode ];";
|
||||
jerry_value_t func_val = jerry_parse_function (func_arg_list,
|
||||
sizeof (func_arg_list) - 1,
|
||||
func_src2,
|
||||
sizeof (func_src2) - 1,
|
||||
NULL);
|
||||
|
||||
jerry_parse_options_t parse_options;
|
||||
parse_options.options = JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
parse_options.argument_list = jerry_create_string ((const jerry_char_t *) "regex");
|
||||
|
||||
jerry_value_t func_val = jerry_parse (func_src2, sizeof (func_src2) - 1, &parse_options);
|
||||
jerry_release_value (parse_options.argument_list);
|
||||
|
||||
jerry_value_t res = jerry_call_function (func_val, undefined_this_arg, ®ex_obj, 1);
|
||||
jerry_value_t regex_res = jerry_get_property_by_index (res, 0);
|
||||
|
||||
@@ -30,13 +30,14 @@ main (void)
|
||||
jerry_value_t regex_obj = jerry_create_regexp (pattern, flags);
|
||||
TEST_ASSERT (jerry_value_is_object (regex_obj));
|
||||
|
||||
const jerry_char_t func_arg_list[] = "regex";
|
||||
const jerry_char_t func_src[] = "return [regex.exec('something.domain.com'), regex.multiline, regex.global];";
|
||||
jerry_value_t func_val = jerry_parse_function (func_arg_list,
|
||||
sizeof (func_arg_list) - 1,
|
||||
func_src,
|
||||
sizeof (func_src) - 1,
|
||||
NULL);
|
||||
|
||||
jerry_parse_options_t parse_options;
|
||||
parse_options.options = JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
parse_options.argument_list = jerry_create_string ((const jerry_char_t *) "regex");
|
||||
|
||||
jerry_value_t func_val = jerry_parse (func_src, sizeof (func_src) - 1, &parse_options);
|
||||
jerry_release_value (parse_options.argument_list);
|
||||
|
||||
jerry_value_t res = jerry_call_function (func_val, global_obj_val, ®ex_obj, 1);
|
||||
jerry_value_t regex_res = jerry_get_property_by_index (res, 0);
|
||||
|
||||
@@ -62,15 +62,16 @@ test_parse_function (const char *source_p, /**< source code */
|
||||
jerry_parse_options_t *options_p, /**< options passed to jerry_parse */
|
||||
bool run_code) /**< run the code after parsing */
|
||||
{
|
||||
options_p->options |= JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
options_p->argument_list = jerry_create_string ((const jerry_char_t *) "");
|
||||
|
||||
for (size_t i = 0; i < USER_VALUES_SIZE; i++)
|
||||
{
|
||||
options_p->user_value = user_values[i];
|
||||
|
||||
jerry_value_t result = jerry_parse_function ((const jerry_char_t *) "",
|
||||
0,
|
||||
(const jerry_char_t *) source_p,
|
||||
strlen (source_p),
|
||||
options_p);
|
||||
jerry_value_t result = jerry_parse ((const jerry_char_t *) source_p,
|
||||
strlen (source_p),
|
||||
options_p);
|
||||
TEST_ASSERT (!jerry_value_is_error (result));
|
||||
|
||||
if (run_code)
|
||||
@@ -94,6 +95,8 @@ test_parse_function (const char *source_p, /**< source code */
|
||||
jerry_release_value (user_value);
|
||||
jerry_release_value (result);
|
||||
}
|
||||
|
||||
jerry_release_value (options_p->argument_list);
|
||||
} /* test_parse_function */
|
||||
|
||||
int
|
||||
|
||||
@@ -63,19 +63,26 @@ static void test_function_snapshot (void)
|
||||
const jerry_init_flag_t flags = JERRY_INIT_EMPTY;
|
||||
static uint32_t function_snapshot_buffer[SNAPSHOT_BUFFER_SIZE];
|
||||
|
||||
const jerry_char_t func_args[] = "a, b";
|
||||
const jerry_char_t code_to_snapshot[] = "return a + b";
|
||||
|
||||
jerry_init (flags);
|
||||
jerry_value_t generate_result;
|
||||
generate_result = jerry_generate_function_snapshot (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
func_args,
|
||||
sizeof (func_args) - 1,
|
||||
NULL,
|
||||
0,
|
||||
function_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
|
||||
jerry_parse_options_t parse_options;
|
||||
parse_options.options = JERRY_PARSE_HAS_ARGUMENT_LIST;
|
||||
parse_options.argument_list = jerry_create_string ((const jerry_char_t *) "a, b");
|
||||
|
||||
jerry_value_t parse_result = jerry_parse (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
&parse_options);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
jerry_value_t generate_result = jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
function_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
jerry_release_value (parse_options.argument_list);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
|
||||
@@ -146,13 +153,16 @@ static void test_function_arguments_snapshot (void)
|
||||
);
|
||||
jerry_init (JERRY_INIT_EMPTY);
|
||||
|
||||
jerry_value_t generate_result;
|
||||
generate_result = jerry_generate_snapshot (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL,
|
||||
0,
|
||||
arguments_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_value_t parse_result = jerry_parse (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
jerry_value_t generate_result= jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
arguments_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
@@ -204,18 +214,22 @@ static void test_snapshot_with_user (void)
|
||||
);
|
||||
jerry_init (JERRY_INIT_EMPTY);
|
||||
|
||||
jerry_value_t result = jerry_generate_snapshot (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL,
|
||||
0,
|
||||
snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_value_t parse_result = jerry_parse (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (result)
|
||||
&& jerry_value_is_number (result));
|
||||
jerry_value_t generate_result = jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
size_t snapshot_size = (size_t) jerry_get_number_value (result);
|
||||
jerry_release_value (result);
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
|
||||
size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
|
||||
jerry_release_value (generate_result);
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
@@ -234,11 +248,11 @@ static void test_snapshot_with_user (void)
|
||||
snapshot_exec_options.user_value = jerry_create_string ((const jerry_char_t *) "AnyString...");
|
||||
}
|
||||
|
||||
result = jerry_exec_snapshot (snapshot_buffer,
|
||||
snapshot_size,
|
||||
0,
|
||||
JERRY_SNAPSHOT_EXEC_HAS_USER_VALUE,
|
||||
&snapshot_exec_options);
|
||||
jerry_value_t result = jerry_exec_snapshot (snapshot_buffer,
|
||||
snapshot_size,
|
||||
0,
|
||||
JERRY_SNAPSHOT_EXEC_HAS_USER_VALUE,
|
||||
&snapshot_exec_options);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (result)
|
||||
&& jerry_value_is_function (result));
|
||||
@@ -284,13 +298,17 @@ main (void)
|
||||
sizeof (magic_string_lengths) / sizeof (jerry_length_t),
|
||||
magic_string_lengths);
|
||||
|
||||
jerry_value_t generate_result;
|
||||
generate_result = jerry_generate_snapshot (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL,
|
||||
JERRY_SNAPSHOT_SAVE_STATIC,
|
||||
snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_value_t parse_result = jerry_parse (code_to_snapshot,
|
||||
sizeof (code_to_snapshot) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
jerry_value_t generate_result = jerry_generate_snapshot (parse_result,
|
||||
JERRY_SNAPSHOT_SAVE_STATIC,
|
||||
snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
|
||||
@@ -319,13 +337,18 @@ main (void)
|
||||
const jerry_char_t code_to_snapshot1[] = "var a = 'hello'; 123";
|
||||
|
||||
jerry_init (JERRY_INIT_EMPTY);
|
||||
jerry_value_t generate_result;
|
||||
generate_result = jerry_generate_snapshot (code_to_snapshot1,
|
||||
sizeof (code_to_snapshot1) - 1,
|
||||
NULL,
|
||||
0,
|
||||
snapshot_buffer_0,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
|
||||
jerry_value_t parse_result = jerry_parse (code_to_snapshot1,
|
||||
sizeof (code_to_snapshot1) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
jerry_value_t generate_result = jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
snapshot_buffer_0,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
|
||||
@@ -337,12 +360,18 @@ main (void)
|
||||
const jerry_char_t code_to_snapshot2[] = "var b = 'hello'; 456";
|
||||
|
||||
jerry_init (JERRY_INIT_EMPTY);
|
||||
generate_result = jerry_generate_snapshot (code_to_snapshot2,
|
||||
sizeof (code_to_snapshot2) - 1,
|
||||
NULL,
|
||||
|
||||
parse_result = jerry_parse (code_to_snapshot2,
|
||||
sizeof (code_to_snapshot2) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
generate_result = jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
snapshot_buffer_1,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result)
|
||||
&& jerry_value_is_number (generate_result));
|
||||
|
||||
@@ -402,13 +431,16 @@ main (void)
|
||||
static uint32_t literal_snapshot_buffer[SNAPSHOT_BUFFER_SIZE];
|
||||
static const jerry_char_t code_for_c_format[] = "var object = { aa:'fo\" o\\n \\\\', Bb:'max', aaa:'xzy0' };";
|
||||
|
||||
jerry_value_t generate_result;
|
||||
generate_result = jerry_generate_snapshot (code_for_c_format,
|
||||
sizeof (code_for_c_format) - 1,
|
||||
NULL,
|
||||
0,
|
||||
literal_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_value_t parse_result = jerry_parse (code_for_c_format,
|
||||
sizeof (code_for_c_format) - 1,
|
||||
NULL);
|
||||
TEST_ASSERT (!jerry_value_is_error (parse_result));
|
||||
|
||||
jerry_value_t generate_result = jerry_generate_snapshot (parse_result,
|
||||
0,
|
||||
literal_snapshot_buffer,
|
||||
SNAPSHOT_BUFFER_SIZE);
|
||||
jerry_release_value (parse_result);
|
||||
|
||||
TEST_ASSERT (!jerry_value_is_error (generate_result));
|
||||
TEST_ASSERT (jerry_value_is_number (generate_result));
|
||||
|
||||
Reference in New Issue
Block a user