diff --git a/jerry-core/ecma/base/ecma-module.c b/jerry-core/ecma/base/ecma-module.c index e0d2c7e94..bd597543b 100644 --- a/jerry-core/ecma/base/ecma-module.c +++ b/jerry-core/ecma/base/ecma-module.c @@ -907,7 +907,7 @@ ecma_module_check_indirect_exports (void) /** * Cleans up a list of module names. */ -void +static void ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first module name */ { while (module_name_p != NULL) @@ -925,7 +925,7 @@ ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first /** * Cleans up a list of module nodes. */ -static void +void ecma_module_release_module_nodes (ecma_module_node_t *module_node_p) /**< first module node */ { while (module_node_p != NULL) diff --git a/jerry-core/ecma/base/ecma-module.h b/jerry-core/ecma/base/ecma-module.h index b0b437e27..290b4d5c3 100644 --- a/jerry-core/ecma/base/ecma-module.h +++ b/jerry-core/ecma/base/ecma-module.h @@ -137,7 +137,7 @@ ecma_value_t ecma_module_connect_imports (void); ecma_value_t ecma_module_parse_modules (void); ecma_value_t ecma_module_check_indirect_exports (void); -void ecma_module_release_module_names (ecma_module_names_t *module_name_p); +void ecma_module_release_module_nodes (ecma_module_node_t *module_node_p); void ecma_module_cleanup (void); #endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */ diff --git a/jerry-core/parser/js/js-parser-internal.h b/jerry-core/parser/js/js-parser-internal.h index ce03743d7..d756f6dac 100644 --- a/jerry-core/parser/js/js-parser-internal.h +++ b/jerry-core/parser/js/js-parser-internal.h @@ -631,8 +631,7 @@ void parser_module_handle_requests (parser_context_t *context_p); void parser_module_parse_export_clause (parser_context_t *context_p); void parser_module_parse_import_clause (parser_context_t *context_p); void parser_module_set_default (parser_context_t *context_p); -ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p, - ecma_module_node_t *template_node_p); +ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p); bool parser_module_check_duplicate_import (parser_context_t *context_p, ecma_string_t *local_name_p); bool parser_module_check_duplicate_export (parser_context_t *context_p, ecma_string_t *export_name_p); void parser_module_add_names_to_node (parser_context_t *context_p, diff --git a/jerry-core/parser/js/js-parser-module.c b/jerry-core/parser/js/js-parser-module.c index 46e096436..0878931e4 100644 --- a/jerry-core/parser/js/js-parser-module.c +++ b/jerry-core/parser/js/js-parser-module.c @@ -142,6 +142,7 @@ void parser_module_add_export_node_to_context (parser_context_t *context_p) /**< parser context */ { ecma_module_node_t *module_node_p = context_p->module_current_node_p; + context_p->module_current_node_p = NULL; ecma_module_node_t **export_list_p; /* Check which list we should add it to. */ @@ -181,16 +182,18 @@ parser_module_add_export_node_to_context (parser_context_t *context_p) /**< pars module_names_p->next_p = stored_exports_p->module_names_p; stored_exports_p->module_names_p = module_node_p->module_names_p; + module_node_p->module_names_p = NULL; } + + ecma_module_release_module_nodes (module_node_p); return; } stored_exports_p = stored_exports_p->next_p; } - ecma_module_node_t *export_node_p = parser_module_create_module_node (context_p, module_node_p); - export_node_p->next_p = *export_list_p; - *export_list_p = export_node_p; + module_node_p->next_p = *export_list_p; + *export_list_p = module_node_p; } /* parser_module_add_export_node_to_context */ /** @@ -200,6 +203,7 @@ void parser_module_add_import_node_to_context (parser_context_t *context_p) /**< parser context */ { ecma_module_node_t *module_node_p = context_p->module_current_node_p; + context_p->module_current_node_p = NULL; ecma_module_node_t *stored_imports = JERRY_CONTEXT (module_top_context_p)->imports_p; /* Check if we have a node with the same module request, append to it if we do. */ @@ -218,16 +222,18 @@ parser_module_add_import_node_to_context (parser_context_t *context_p) /**< pars module_names_p->next_p = stored_imports->module_names_p; stored_imports->module_names_p = module_node_p->module_names_p; + module_node_p->module_names_p = NULL; } + + ecma_module_release_module_nodes (module_node_p); return; } stored_imports = stored_imports->next_p; } - ecma_module_node_t *permanent_node_p = parser_module_create_module_node (context_p, module_node_p); - permanent_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p; - JERRY_CONTEXT (module_top_context_p)->imports_p = permanent_node_p; + module_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p; + JERRY_CONTEXT (module_top_context_p)->imports_p = module_node_p; } /* parser_module_add_import_node_to_context */ /** @@ -305,21 +311,10 @@ parser_module_context_init (void) * - otherwise: an empty node. */ ecma_module_node_t * -parser_module_create_module_node (parser_context_t *context_p, /**< parser context */ - ecma_module_node_t *template_node_p) /**< template node for the new node */ +parser_module_create_module_node (parser_context_t *context_p) /**< parser context */ { ecma_module_node_t *node_p = (ecma_module_node_t *) parser_malloc (context_p, sizeof (ecma_module_node_t)); - - if (template_node_p != NULL) - { - node_p->module_names_p = template_node_p->module_names_p; - node_p->module_request_p = template_node_p->module_request_p; - node_p->next_p = NULL; - } - else - { - memset (node_p, 0, sizeof (ecma_module_node_t)); - } + memset (node_p, 0, sizeof (ecma_module_node_t)); return node_p; } /* parser_module_create_module_node */ diff --git a/jerry-core/parser/js/js-parser-statm.c b/jerry-core/parser/js/js-parser-statm.c index f779a29ad..673af3a8d 100644 --- a/jerry-core/parser/js/js-parser-statm.c +++ b/jerry-core/parser/js/js-parser-statm.c @@ -1815,9 +1815,7 @@ parser_parse_import_statement (parser_context_t *context_p) /**< parser context parser_module_check_request_place (context_p); parser_module_context_init (); - ecma_module_node_t module_node; - memset (&module_node, 0, sizeof (ecma_module_node_t)); - context_p->module_current_node_p = &module_node; + context_p->module_current_node_p = parser_module_create_module_node (context_p); lexer_next_token (context_p); @@ -1933,9 +1931,7 @@ parser_parse_export_statement (parser_context_t *context_p) /**< context */ parser_module_check_request_place (context_p); parser_module_context_init (); - ecma_module_node_t module_node; - memset (&module_node, 0, sizeof (ecma_module_node_t)); - context_p->module_current_node_p = &module_node; + context_p->module_current_node_p = parser_module_create_module_node (context_p); lexer_next_token (context_p); switch (context_p->token.type) diff --git a/jerry-core/parser/js/js-parser.c b/jerry-core/parser/js/js-parser.c index 80b1b560b..55ce06f45 100644 --- a/jerry-core/parser/js/js-parser.c +++ b/jerry-core/parser/js/js-parser.c @@ -2581,10 +2581,9 @@ parser_parse_source (const uint8_t *arg_list_p, /**< function argument list */ scanner_cleanup (&context); #if ENABLED (JERRY_ES2015_MODULE_SYSTEM) - if (context.module_current_node_p != NULL - && context.module_current_node_p->module_names_p != NULL) + if (context.module_current_node_p != NULL) { - ecma_module_release_module_names (context.module_current_node_p->module_names_p); + ecma_module_release_module_nodes (context.module_current_node_p); } #endif