@@ -170,14 +170,24 @@ static void dump_hex(FILE *f, const uint8_t *buf, size_t len)
170170 fprintf (f , "\n" );
171171}
172172
173+ typedef enum {
174+ CNAME_TYPE_SCRIPT ,
175+ CNAME_TYPE_MODULE ,
176+ CNAME_TYPE_JSON_MODULE ,
177+ } CNameTypeEnum ;
178+
173179static void output_object_code (JSContext * ctx ,
174180 FILE * fo , JSValueConst obj , const char * c_name ,
175- BOOL load_only )
181+ CNameTypeEnum c_name_type )
176182{
177183 uint8_t * out_buf ;
178184 size_t out_buf_len ;
179185 int flags ;
180- flags = JS_WRITE_OBJ_BYTECODE ;
186+
187+ if (c_name_type == CNAME_TYPE_JSON_MODULE )
188+ flags = 0 ;
189+ else
190+ flags = JS_WRITE_OBJ_BYTECODE ;
181191 if (byte_swap )
182192 flags |= JS_WRITE_OBJ_BSWAP ;
183193 out_buf = JS_WriteObject (ctx , & out_buf_len , obj , flags );
@@ -186,7 +196,7 @@ static void output_object_code(JSContext *ctx,
186196 exit (1 );
187197 }
188198
189- namelist_add (& cname_list , c_name , NULL , load_only );
199+ namelist_add (& cname_list , c_name , NULL , c_name_type );
190200
191201 fprintf (fo , "const uint32_t %s_size = %u;\n\n" ,
192202 c_name , (unsigned int )out_buf_len );
@@ -227,7 +237,8 @@ static void find_unique_cname(char *cname, size_t cname_size)
227237}
228238
229239JSModuleDef * jsc_module_loader (JSContext * ctx ,
230- const char * module_name , void * opaque )
240+ const char * module_name , void * opaque ,
241+ JSValueConst attributes )
231242{
232243 JSModuleDef * m ;
233244 namelist_entry_t * e ;
@@ -249,31 +260,69 @@ JSModuleDef *jsc_module_loader(JSContext *ctx,
249260 } else {
250261 size_t buf_len ;
251262 uint8_t * buf ;
252- JSValue func_val ;
253263 char cname [1024 ];
254-
264+ int res ;
265+
255266 buf = js_load_file (ctx , & buf_len , module_name );
256267 if (!buf ) {
257268 JS_ThrowReferenceError (ctx , "could not load module filename '%s'" ,
258269 module_name );
259270 return NULL ;
260271 }
261272
262- /* compile the module */
263- func_val = JS_Eval (ctx , (char * )buf , buf_len , module_name ,
264- JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY );
265- js_free (ctx , buf );
266- if (JS_IsException (func_val ))
267- return NULL ;
268- get_c_name (cname , sizeof (cname ), module_name );
269- if (namelist_find (& cname_list , cname )) {
270- find_unique_cname (cname , sizeof (cname ));
271- }
272- output_object_code (ctx , outfile , func_val , cname , TRUE);
273+ res = js_module_test_json (ctx , attributes );
274+ if (has_suffix (module_name , ".json" ) || res > 0 ) {
275+ /* compile as JSON or JSON5 depending on "type" */
276+ JSValue val ;
277+ int flags ;
278+
279+ if (res == 2 )
280+ flags = JS_PARSE_JSON_EXT ;
281+ else
282+ flags = 0 ;
283+ val = JS_ParseJSON2 (ctx , (char * )buf , buf_len , module_name , flags );
284+ js_free (ctx , buf );
285+ if (JS_IsException (val ))
286+ return NULL ;
287+ /* create a dummy module */
288+ m = JS_NewCModule (ctx , module_name , js_module_dummy_init );
289+ if (!m ) {
290+ JS_FreeValue (ctx , val );
291+ return NULL ;
292+ }
293+
294+ get_c_name (cname , sizeof (cname ), module_name );
295+ if (namelist_find (& cname_list , cname )) {
296+ find_unique_cname (cname , sizeof (cname ));
297+ }
298+
299+ /* output the module name */
300+ fprintf (outfile , "static const uint8_t %s_module_name[] = {\n" ,
301+ cname );
302+ dump_hex (outfile , (const uint8_t * )module_name , strlen (module_name ) + 1 );
303+ fprintf (outfile , "};\n\n" );
273304
274- /* the module is already referenced, so we must free it */
275- m = JS_VALUE_GET_PTR (func_val );
276- JS_FreeValue (ctx , func_val );
305+ output_object_code (ctx , outfile , val , cname , CNAME_TYPE_JSON_MODULE );
306+ JS_FreeValue (ctx , val );
307+ } else {
308+ JSValue func_val ;
309+
310+ /* compile the module */
311+ func_val = JS_Eval (ctx , (char * )buf , buf_len , module_name ,
312+ JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY );
313+ js_free (ctx , buf );
314+ if (JS_IsException (func_val ))
315+ return NULL ;
316+ get_c_name (cname , sizeof (cname ), module_name );
317+ if (namelist_find (& cname_list , cname )) {
318+ find_unique_cname (cname , sizeof (cname ));
319+ }
320+ output_object_code (ctx , outfile , func_val , cname , CNAME_TYPE_MODULE );
321+
322+ /* the module is already referenced, so we must free it */
323+ m = JS_VALUE_GET_PTR (func_val );
324+ JS_FreeValue (ctx , func_val );
325+ }
277326 }
278327 return m ;
279328}
@@ -314,7 +363,7 @@ static void compile_file(JSContext *ctx, FILE *fo,
314363 } else {
315364 get_c_name (c_name , sizeof (c_name ), filename );
316365 }
317- output_object_code (ctx , fo , obj , c_name , FALSE );
366+ output_object_code (ctx , fo , obj , c_name , CNAME_TYPE_SCRIPT );
318367 JS_FreeValue (ctx , obj );
319368}
320369
@@ -709,7 +758,7 @@ int main(int argc, char **argv)
709758 JS_SetStripInfo (rt , strip_flags );
710759
711760 /* loader for ES6 modules */
712- JS_SetModuleLoaderFunc (rt , NULL , jsc_module_loader , NULL );
761+ JS_SetModuleLoaderFunc2 (rt , NULL , jsc_module_loader , NULL , NULL );
713762
714763 fprintf (fo , "/* File generated automatically by the QuickJS compiler. */\n"
715764 "\n"
@@ -732,7 +781,7 @@ int main(int argc, char **argv)
732781 }
733782
734783 for (i = 0 ; i < dynamic_module_list .count ; i ++ ) {
735- if (!jsc_module_loader (ctx , dynamic_module_list .array [i ].name , NULL )) {
784+ if (!jsc_module_loader (ctx , dynamic_module_list .array [i ].name , NULL , JS_UNDEFINED )) {
736785 fprintf (stderr , "Could not load dynamic module '%s'\n" ,
737786 dynamic_module_list .array [i ].name );
738787 exit (1 );
@@ -770,9 +819,12 @@ int main(int argc, char **argv)
770819 }
771820 for (i = 0 ; i < cname_list .count ; i ++ ) {
772821 namelist_entry_t * e = & cname_list .array [i ];
773- if (e -> flags ) {
822+ if (e -> flags == CNAME_TYPE_MODULE ) {
774823 fprintf (fo , " js_std_eval_binary(ctx, %s, %s_size, 1);\n" ,
775824 e -> name , e -> name );
825+ } else if (e -> flags == CNAME_TYPE_JSON_MODULE ) {
826+ fprintf (fo , " js_std_eval_binary_json_module(ctx, %s, %s_size, (const char *)%s_module_name);\n" ,
827+ e -> name , e -> name , e -> name );
776828 }
777829 }
778830 fprintf (fo ,
@@ -797,7 +849,7 @@ int main(int argc, char **argv)
797849
798850 for (i = 0 ; i < cname_list .count ; i ++ ) {
799851 namelist_entry_t * e = & cname_list .array [i ];
800- if (! e -> flags ) {
852+ if (e -> flags == CNAME_TYPE_SCRIPT ) {
801853 fprintf (fo , " js_std_eval_binary(ctx, %s, %s_size, 0);\n" ,
802854 e -> name , e -> name );
803855 }
0 commit comments