@@ -97,12 +97,13 @@ ecma_module_create_normalized_path (const uint8_t *char_p, /**< module specifier
9797} /* ecma_module_create_normalized_path */
9898
9999/**
100- * Checks if we already have a module request in the module list.
100+ * Find a module with a specific identifier
101101 *
102- * @return pointer to found or newly created module structure
102+ * @return pointer to ecma_module_t, if found
103+ * NULL, otherwise
103104 */
104105ecma_module_t *
105- ecma_module_find_or_create_module (ecma_string_t * const path_p ) /**< module path */
106+ ecma_module_find_module (ecma_string_t * const path_p ) /**< module identifier */
106107{
107108 ecma_module_t * current_p = JERRY_CONTEXT (ecma_modules_p );
108109 while (current_p != NULL )
@@ -114,16 +115,59 @@ ecma_module_find_or_create_module (ecma_string_t * const path_p) /**< module pat
114115 current_p = current_p -> next_p ;
115116 }
116117
117- current_p = (ecma_module_t * ) jmem_heap_alloc_block (sizeof (ecma_module_t ));
118- memset (current_p , 0 , sizeof (ecma_module_t ));
119-
120- ecma_ref_ecma_string (path_p );
121- current_p -> path_p = path_p ;
122- current_p -> next_p = JERRY_CONTEXT (ecma_modules_p );
123- JERRY_CONTEXT (ecma_modules_p ) = current_p ;
124118 return current_p ;
119+ } /* ecma_module_find_module */
120+
121+ /**
122+ * Create a new module
123+ *
124+ * @return pointer to created module
125+ */
126+ static ecma_module_t *
127+ ecma_module_create_module (ecma_string_t * const path_p ) /**< module identifier */
128+ {
129+ ecma_module_t * module_p = (ecma_module_t * ) jmem_heap_alloc_block (sizeof (ecma_module_t ));
130+ memset (module_p , 0 , sizeof (ecma_module_t ));
131+
132+ module_p -> path_p = path_p ;
133+ module_p -> next_p = JERRY_CONTEXT (ecma_modules_p );
134+ JERRY_CONTEXT (ecma_modules_p ) = module_p ;
135+ return module_p ;
136+ } /* ecma_module_create_module */
137+
138+ /**
139+ * Checks if we already have a module request in the module list.
140+ *
141+ * @return pointer to found or newly created module structure
142+ */
143+ ecma_module_t *
144+ ecma_module_find_or_create_module (ecma_string_t * const path_p ) /**< module path */
145+ {
146+ ecma_module_t * module_p = ecma_module_find_module (path_p );
147+ if (module_p )
148+ {
149+ ecma_deref_ecma_string (path_p );
150+ return module_p ;
151+ }
152+
153+ return ecma_module_create_module (path_p );
125154} /* ecma_module_find_or_create_module */
126155
156+ /**
157+ * Create a new native module
158+ *
159+ * @return pointer to created module
160+ */
161+ ecma_module_t *
162+ ecma_module_create_native_module (ecma_string_t * const path_p , /**< module identifier */
163+ ecma_object_t * const namespace_p ) /**< module namespace */
164+ {
165+ ecma_module_t * module_p = ecma_module_create_module (path_p );
166+ module_p -> state = ECMA_MODULE_STATE_NATIVE ;
167+ module_p -> namespace_object_p = namespace_p ;
168+ return module_p ;
169+ } /* ecma_module_create_native_module */
170+
127171/**
128172 * Creates a module context.
129173 *
@@ -274,6 +318,30 @@ ecma_module_resolve_export (ecma_module_t * const module_p, /**< base module */
274318 continue ;
275319 }
276320
321+ if (current_module_p -> state == ECMA_MODULE_STATE_NATIVE )
322+ {
323+ ecma_object_t * object_p = current_module_p -> namespace_object_p ;
324+ ecma_value_t prop_value = ecma_op_object_find_own (ecma_make_object_value (object_p ),
325+ object_p ,
326+ current_export_name_p );
327+ if (ecma_is_value_found (prop_value ))
328+ {
329+ found = true;
330+ found_record .module_p = current_module_p ;
331+ found_record .name_p = current_export_name_p ;
332+ ecma_free_value (prop_value );
333+ }
334+
335+ if (ecma_compare_ecma_string_to_magic_id (current_export_name_p , LIT_MAGIC_STRING_DEFAULT ))
336+ {
337+ ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("No default export in native module." ));
338+ break ;
339+ }
340+
341+ ecma_module_resolve_stack_pop (& stack_p );
342+ continue ;
343+ }
344+
277345 if (context_p -> local_exports_p != NULL )
278346 {
279347 /* 15.2.1.16.3 / 4 */
@@ -645,25 +713,44 @@ ecma_module_connect_imports (void)
645713 return ecma_raise_syntax_error (ECMA_ERR_MSG ("Ambiguous import request." ));
646714 }
647715
648- result = ecma_module_evaluate (record .module_p );
649-
650- if (ECMA_IS_VALUE_ERROR (result ))
716+ if (record .module_p -> state == ECMA_MODULE_STATE_NATIVE )
651717 {
652- return result ;
718+ ecma_object_t * object_p = record .module_p -> namespace_object_p ;
719+ ecma_value_t prop_value = ecma_op_object_find_own (ecma_make_object_value (object_p ),
720+ object_p ,
721+ record .name_p );
722+ JERRY_ASSERT (ecma_is_value_found (prop_value ));
723+
724+ ecma_op_create_mutable_binding (local_env_p , import_names_p -> local_name_p , true /* is_deletable */ );
725+ ecma_op_set_mutable_binding (local_env_p ,
726+ import_names_p -> local_name_p ,
727+ prop_value ,
728+ false /* is_strict */ );
729+
730+ ecma_free_value (prop_value );
653731 }
732+ else
733+ {
734+ result = ecma_module_evaluate (record .module_p );
654735
655- ecma_object_t * ref_base_lex_env_p ;
656- ecma_value_t prop_value = ecma_op_get_value_lex_env_base ( record . module_p -> scope_p ,
657- & ref_base_lex_env_p ,
658- record . name_p );
736+ if ( ECMA_IS_VALUE_ERROR ( result ))
737+ {
738+ return result ;
739+ }
659740
660- ecma_op_create_mutable_binding (local_env_p , import_names_p -> local_name_p , true /* is_deletable */ );
661- ecma_op_set_mutable_binding (local_env_p ,
662- import_names_p -> local_name_p ,
663- prop_value ,
664- false /* is_strict */ );
741+ ecma_object_t * ref_base_lex_env_p ;
742+ ecma_value_t prop_value = ecma_op_get_value_lex_env_base (record .module_p -> scope_p ,
743+ & ref_base_lex_env_p ,
744+ record .name_p );
745+
746+ ecma_op_create_mutable_binding (local_env_p , import_names_p -> local_name_p , true /* is_deletable */ );
747+ ecma_op_set_mutable_binding (local_env_p ,
748+ import_names_p -> local_name_p ,
749+ prop_value ,
750+ false /* is_strict */ );
665751
666- ecma_free_value (prop_value );
752+ ecma_free_value (prop_value );
753+ }
667754 }
668755
669756 import_names_p = import_names_p -> next_p ;
@@ -873,6 +960,17 @@ static void
873960ecma_module_release_module (ecma_module_t * module_p ) /**< module */
874961{
875962 ecma_deref_ecma_string (module_p -> path_p );
963+
964+ if (module_p -> namespace_object_p != NULL )
965+ {
966+ ecma_deref_object (module_p -> namespace_object_p );
967+ }
968+
969+ if (module_p -> state == ECMA_MODULE_STATE_NATIVE )
970+ {
971+ goto finished ;
972+ }
973+
876974 if (module_p -> state >= ECMA_MODULE_STATE_PARSING )
877975 {
878976 ecma_module_release_module_context (module_p -> context_p );
@@ -889,11 +987,7 @@ ecma_module_release_module (ecma_module_t *module_p) /**< module */
889987 ecma_bytecode_deref (module_p -> compiled_code_p );
890988 }
891989
892- if (module_p -> namespace_object_p != NULL )
893- {
894- ecma_deref_object (module_p -> namespace_object_p );
895- }
896-
990+ finished :
897991 jmem_heap_free_block (module_p , sizeof (ecma_module_t ));
898992} /* ecma_module_release_module */
899993
0 commit comments