@@ -41,32 +41,57 @@ ecma_module_create_normalized_path (const uint8_t *char_p, /**< module specifier
4141 prop_length_t size ) /**< size of module specifier */
4242{
4343 JERRY_ASSERT (size > 0 );
44- ecma_string_t * ret_p ;
44+ ecma_string_t * ret_p = NULL ;
4545
46- /* Zero terminate the string. */
47- uint8_t * temp_p = (uint8_t * ) jmem_heap_alloc_block (size + 1u );
48- memcpy (temp_p , char_p , size );
49- temp_p [size ] = LIT_CHAR_NULL ;
46+ /* The module specifier is cesu8 encoded, we need to convert is to utf8, and zero terminate it,
47+ * so that OS level functions can handle it. */
48+ lit_utf8_byte_t * path_p = (lit_utf8_byte_t * ) jmem_heap_alloc_block (size + 1u );
5049
51- uint8_t * normalized_p = (uint8_t * ) jmem_heap_alloc_block (ECMA_MODULE_MAX_PATH );
52- size_t new_size = jerry_port_normalize_path ((const char * ) temp_p ,
53- (char * ) normalized_p ,
54- ECMA_MODULE_MAX_PATH );
50+ lit_utf8_size_t utf8_size ;
51+ utf8_size = lit_convert_cesu8_string_to_utf8_string (char_p ,
52+ size ,
53+ path_p ,
54+ size );
55+ path_p [utf8_size ] = LIT_CHAR_NULL ;
5556
57+ lit_utf8_byte_t * module_path_p = NULL ;
58+ lit_utf8_size_t module_path_size = 0 ;
5659
57- if (new_size == 0 )
60+ /* Check if we have a current module, and use its path as the base path. */
61+ JERRY_ASSERT (JERRY_CONTEXT (module_top_context_p ) != NULL );
62+ if (JERRY_CONTEXT (module_top_context_p )-> module_p != NULL )
5863 {
59- /* Failed to normalize path, use original. */
60- ret_p = ecma_new_ecma_string_from_utf8 (temp_p , (lit_utf8_size_t ) (size + 1u ));
64+ JERRY_ASSERT (JERRY_CONTEXT (module_top_context_p )-> module_p -> path_p != NULL );
65+ module_path_size = ecma_string_get_size (JERRY_CONTEXT (module_top_context_p )-> module_p -> path_p );
66+ module_path_p = (lit_utf8_byte_t * ) jmem_heap_alloc_block (module_path_size + 1 );
67+
68+ lit_utf8_size_t module_utf8_size ;
69+ module_utf8_size = ecma_string_copy_to_utf8_buffer (JERRY_CONTEXT (module_top_context_p )-> module_p -> path_p ,
70+ module_path_p ,
71+ module_path_size );
72+
73+ module_path_p [module_utf8_size ] = LIT_CHAR_NULL ;
6174 }
62- else
75+
76+ lit_utf8_byte_t * normalized_out_p = (lit_utf8_byte_t * ) jmem_heap_alloc_block (ECMA_MODULE_MAX_PATH );
77+ size_t normalized_size = jerry_port_normalize_path ((const char * ) path_p ,
78+ (char * ) normalized_out_p ,
79+ ECMA_MODULE_MAX_PATH ,
80+ (char * ) module_path_p );
81+
82+
83+ if (normalized_size > 0 )
6384 {
64- /* Copy the trailing \0 into the string as well, to make it more convenient to use later . */
65- ret_p = ecma_new_ecma_string_from_utf8 ( normalized_p , (lit_utf8_size_t ) (new_size + 1u ));
85+ /* Convert the normalized path to cesu8 . */
86+ ret_p = ecma_new_ecma_string_from_utf8_converted_to_cesu8 ( normalized_out_p , (lit_utf8_size_t ) (normalized_size ));
6687 }
6788
68- jmem_heap_free_block (temp_p , size + 1u );
69- jmem_heap_free_block (normalized_p , ECMA_MODULE_MAX_PATH );
89+ jmem_heap_free_block (path_p , size + 1u );
90+ jmem_heap_free_block (normalized_out_p , ECMA_MODULE_MAX_PATH );
91+ if (module_path_p != NULL )
92+ {
93+ jmem_heap_free_block (module_path_p , module_path_size + 1 );
94+ }
7095
7196 return ret_p ;
7297} /* ecma_module_create_normalized_path */
@@ -573,17 +598,7 @@ ecma_module_connect_imports (void)
573598{
574599 ecma_module_context_t * current_context_p = JERRY_CONTEXT (module_top_context_p );
575600
576- ecma_object_t * local_env_p ;
577-
578- if (current_context_p -> module_p != NULL )
579- {
580- local_env_p = current_context_p -> module_p -> scope_p ;
581- }
582- else
583- {
584- /* This is the root context. */
585- local_env_p = ecma_get_global_environment ();
586- }
601+ ecma_object_t * local_env_p = current_context_p -> module_p -> scope_p ;
587602 JERRY_ASSERT (ecma_is_lexical_environment (local_env_p ));
588603
589604 ecma_module_node_t * import_node_p = current_context_p -> imports_p ;
@@ -677,14 +692,18 @@ ecma_module_parse (ecma_module_t *module_p) /**< module */
677692 module_p -> state = ECMA_MODULE_STATE_PARSING ;
678693 module_p -> context_p = ecma_module_create_module_context ();
679694
680- lit_utf8_size_t script_path_size ;
681- uint8_t flags = ECMA_STRING_FLAG_EMPTY ;
682- const lit_utf8_byte_t * script_path_p = ecma_string_get_chars (module_p -> path_p ,
683- & script_path_size ,
684- & flags );
695+ lit_utf8_size_t module_path_size = ecma_string_get_size (module_p -> path_p );
696+ lit_utf8_byte_t * module_path_p = (lit_utf8_byte_t * ) jmem_heap_alloc_block (module_path_size + 1 );
697+
698+ lit_utf8_size_t module_path_utf8_size ;
699+ module_path_utf8_size = ecma_string_copy_to_utf8_buffer (module_p -> path_p ,
700+ module_path_p ,
701+ module_path_size );
702+ module_path_p [module_path_utf8_size ] = LIT_CHAR_NULL ;
685703
686704 size_t source_size = 0 ;
687- uint8_t * source_p = jerry_port_read_source ((const char * ) script_path_p , & source_size );
705+ uint8_t * source_p = jerry_port_read_source ((const char * ) module_path_p , & source_size );
706+ jmem_heap_free_block (module_path_p , module_path_size + 1 );
688707
689708 if (source_p == NULL )
690709 {
@@ -700,15 +719,12 @@ ecma_module_parse (ecma_module_t *module_p) /**< module */
700719 {
701720 jerry_debugger_send_string (JERRY_DEBUGGER_SOURCE_CODE_NAME ,
702721 JERRY_DEBUGGER_NO_SUBTYPE ,
703- script_path_p ,
704- script_path_size - 1 );
722+ module_path_p ,
723+ module_path_size - 1 );
705724 }
706725#endif /* ENABLED (JERRY_DEBUGGER) && ENABLED (JERRY_PARSER) */
707726
708- #if ENABLED (JERRY_LINE_INFO ) || ENABLED (JERRY_ERROR_MESSAGES )
709- JERRY_CONTEXT (resource_name ) = ecma_make_string_value (ecma_new_ecma_string_from_utf8 (script_path_p ,
710- script_path_size - 1 ));
711- #endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
727+ JERRY_CONTEXT (resource_name ) = ecma_make_string_value (module_p -> path_p );
712728
713729 ecma_compiled_code_t * bytecode_data_p ;
714730 ecma_value_t ret_value = parser_parse_script (NULL ,
@@ -900,7 +916,6 @@ ecma_module_cleanup (void)
900916 current_p = next_p ;
901917 }
902918
903- ecma_module_release_module_context (JERRY_CONTEXT (module_top_context_p ));
904919 JERRY_CONTEXT (module_top_context_p ) = NULL ;
905920} /* ecma_module_cleanup */
906921
0 commit comments