@@ -97,12 +97,13 @@ ecma_module_create_normalized_path (const uint8_t *char_p, /**< module specifier
97
97
} /* ecma_module_create_normalized_path */
98
98
99
99
/**
100
- * Checks if we already have a module request in the module list.
100
+ * Find a module with a specific identifier
101
101
*
102
- * @return pointer to found or newly created module structure
102
+ * @return pointer to ecma_module_t, if found
103
+ * NULL, otherwise
103
104
*/
104
105
ecma_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 */
106
107
{
107
108
ecma_module_t * current_p = JERRY_CONTEXT (ecma_modules_p );
108
109
while (current_p != NULL )
@@ -114,16 +115,59 @@ ecma_module_find_or_create_module (ecma_string_t * const path_p) /**< module pat
114
115
current_p = current_p -> next_p ;
115
116
}
116
117
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 ;
124
118
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 );
125
154
} /* ecma_module_find_or_create_module */
126
155
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
+
127
171
/**
128
172
* Creates a module context.
129
173
*
@@ -274,6 +318,30 @@ ecma_module_resolve_export (ecma_module_t * const module_p, /**< base module */
274
318
continue ;
275
319
}
276
320
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
+
277
345
if (context_p -> local_exports_p != NULL )
278
346
{
279
347
/* 15.2.1.16.3 / 4 */
@@ -645,25 +713,44 @@ ecma_module_connect_imports (void)
645
713
return ecma_raise_syntax_error (ECMA_ERR_MSG ("Ambiguous import request." ));
646
714
}
647
715
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 )
651
717
{
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 );
653
731
}
732
+ else
733
+ {
734
+ result = ecma_module_evaluate (record .module_p );
654
735
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
+ }
659
740
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 */ );
665
751
666
- ecma_free_value (prop_value );
752
+ ecma_free_value (prop_value );
753
+ }
667
754
}
668
755
669
756
import_names_p = import_names_p -> next_p ;
@@ -873,6 +960,17 @@ static void
873
960
ecma_module_release_module (ecma_module_t * module_p ) /**< module */
874
961
{
875
962
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
+
876
974
if (module_p -> state >= ECMA_MODULE_STATE_PARSING )
877
975
{
878
976
ecma_module_release_module_context (module_p -> context_p );
@@ -889,11 +987,7 @@ ecma_module_release_module (ecma_module_t *module_p) /**< module */
889
987
ecma_bytecode_deref (module_p -> compiled_code_p );
890
988
}
891
989
892
- if (module_p -> namespace_object_p != NULL )
893
- {
894
- ecma_deref_object (module_p -> namespace_object_p );
895
- }
896
-
990
+ finished :
897
991
jmem_heap_free_block (module_p , sizeof (ecma_module_t ));
898
992
} /* ecma_module_release_module */
899
993
0 commit comments