1414 */
1515
1616#include <assert.h>
17+ #include <stdlib.h>
1718#include <string.h>
1819
1920#include "jerryscript.h"
2728 */
2829#define JERRY_BUFFER_SIZE (1048576)
2930
31+ /**
32+ * Maximum number of loaded literals
33+ */
34+ #define JERRY_LITERAL_LENGTH (4096)
35+
3036/**
3137 * Standalone Jerry exit codes
3238 */
3339#define JERRY_STANDALONE_EXIT_CODE_OK (0)
3440#define JERRY_STANDALONE_EXIT_CODE_FAIL (1)
3541
36- static uint8_t input_buffer [ JERRY_BUFFER_SIZE ];
37- static uint32_t output_buffer [ JERRY_BUFFER_SIZE / 4 ];
42+ static uint8_t input_buffer [JERRY_BUFFER_SIZE ];
43+ static uint32_t output_buffer [JERRY_BUFFER_SIZE / 4 ];
3844static const char * output_file_name_p = "js.snapshot" ;
45+ static jerry_length_t magic_string_lengths [JERRY_LITERAL_LENGTH ];
46+ static jerry_char_ptr_t magic_string_items [JERRY_LITERAL_LENGTH ];
3947
4048/**
4149 * Check whether JerryScript has a requested feature enabled or not. If not,
@@ -168,6 +176,7 @@ typedef enum
168176 OPT_GENERATE_LITERAL_C ,
169177 OPT_GENERATE_SHOW_OP ,
170178 OPT_GENERATE_OUT ,
179+ OPT_IMPORT_LITERAL_LIST
171180} generate_opt_id_t ;
172181
173182/**
@@ -179,6 +188,9 @@ static const cli_opt_t generate_opts[] =
179188 .help = "print this help and exit" ),
180189 CLI_OPT_DEF (.id = OPT_GENERATE_STATIC , .opt = "s" , .longopt = "static" ,
181190 .help = "generate static snapshot" ),
191+ CLI_OPT_DEF (.id = OPT_IMPORT_LITERAL_LIST , .longopt = "load-literals-list-format" ,
192+ .meta = "FILE" ,
193+ .help = "import literals from list format (for static snapshots)" ),
182194 CLI_OPT_DEF (.id = OPT_GENERATE_LITERAL_LIST , .longopt = "save-literals-list-format" ,
183195 .meta = "FILE" ,
184196 .help = "export literals found in parsed JS input (in list format)" ),
@@ -190,7 +202,7 @@ static const cli_opt_t generate_opts[] =
190202 CLI_OPT_DEF (.id = OPT_GENERATE_OUT , .opt = "o" , .meta = "FILE" ,
191203 .help = "specify output file name (default: js.snapshot)" ),
192204 CLI_OPT_DEF (.id = CLI_OPT_DEFAULT , .meta = "FILE" ,
193- .help = "input snapshot file" )
205+ .help = "input source file" )
194206};
195207
196208/**
@@ -206,13 +218,14 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
206218 (void ) argc ;
207219
208220 bool is_save_literals_mode_in_c_format = false;
221+ bool is_import_literals = false;
209222 uint32_t snapshot_flags = 0 ;
210223 jerry_init_flag_t flags = JERRY_INIT_EMPTY ;
211224
212225 const char * file_name_p = NULL ;
213226 uint8_t * source_p = input_buffer ;
214227 size_t source_length = 0 ;
215- const char * save_literals_file_name_p = NULL ;
228+ const char * literals_file_name_p = NULL ;
216229
217230 cli_change_opts (cli_state_p , generate_opts );
218231
@@ -230,17 +243,19 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
230243 snapshot_flags |= JERRY_SNAPSHOT_SAVE_STATIC ;
231244 break ;
232245 }
233- case OPT_GENERATE_LITERAL_LIST :
234246 case OPT_GENERATE_LITERAL_C :
247+ case OPT_GENERATE_LITERAL_LIST :
248+ case OPT_IMPORT_LITERAL_LIST :
235249 {
236- if (save_literals_file_name_p != NULL )
250+ if (literals_file_name_p != NULL )
237251 {
238252 jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Error: literal file name already specified" );
239253 return JERRY_STANDALONE_EXIT_CODE_FAIL ;
240254 }
241255
256+ is_import_literals = (id == OPT_IMPORT_LITERAL_LIST );
242257 is_save_literals_mode_in_c_format = (id == OPT_GENERATE_LITERAL_C );
243- save_literals_file_name_p = cli_consume_string (cli_state_p );
258+ literals_file_name_p = cli_consume_string (cli_state_p );
244259 break ;
245260 }
246261 case OPT_GENERATE_SHOW_OP :
@@ -306,8 +321,39 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
306321 return JERRY_STANDALONE_EXIT_CODE_FAIL ;
307322 }
308323
309- jerry_value_t snapshot_result ;
324+ if (is_import_literals )
325+ {
326+ uint8_t * sp_buffer_start_p = source_p + source_length + 1 ;
327+ size_t sp_buffer_size = read_file (sp_buffer_start_p , literals_file_name_p );
310328
329+ if (sp_buffer_size > 0 )
330+ {
331+ const char * sp_buffer_p = (const char * ) sp_buffer_start_p ;
332+ uint32_t num_of_lit = 0 ;
333+
334+ do
335+ {
336+ char * sp_buffer_end_p = NULL ;
337+ jerry_length_t mstr_size = (jerry_length_t ) strtol (sp_buffer_p , & sp_buffer_end_p , 10 );
338+ if (mstr_size > 0 )
339+ {
340+ magic_string_items [num_of_lit ] = (jerry_char_ptr_t ) (sp_buffer_end_p + 1 );
341+ magic_string_lengths [num_of_lit ] = mstr_size ;
342+ num_of_lit ++ ;
343+ }
344+ sp_buffer_p = sp_buffer_end_p + mstr_size + 1 ;
345+ }
346+ while ((size_t ) (sp_buffer_p - (char * ) sp_buffer_start_p ) < sp_buffer_size );
347+
348+ if (num_of_lit > 0 )
349+ {
350+ jerry_register_magic_strings (magic_string_items , num_of_lit ,
351+ magic_string_lengths );
352+ }
353+ }
354+ }
355+
356+ jerry_value_t snapshot_result ;
311357 snapshot_result = jerry_generate_snapshot ((jerry_char_t * ) file_name_p ,
312358 (size_t ) strlen (file_name_p ),
313359 (jerry_char_t * ) source_p ,
@@ -343,7 +389,7 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
343389
344390 printf ("Created snapshot file: '%s' (%lu bytes)\n" , output_file_name_p , (unsigned long ) snapshot_size );
345391
346- if (save_literals_file_name_p != NULL )
392+ if (literals_file_name_p != NULL && ! is_import_literals )
347393 {
348394 const size_t literal_buffer_size = jerry_parse_and_save_literals ((jerry_char_t * ) source_p ,
349395 source_length ,
@@ -357,18 +403,18 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
357403 return JERRY_STANDALONE_EXIT_CODE_FAIL ;
358404 }
359405
360- FILE * literal_file_p = fopen (save_literals_file_name_p , "wb" );
406+ FILE * literal_file_p = fopen (literals_file_name_p , "wb" );
361407
362408 if (literal_file_p == NULL )
363409 {
364- jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Error: Unable to write literal file: '%s'\n" , save_literals_file_name_p );
410+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Error: Unable to write literal file: '%s'\n" , literals_file_name_p );
365411 return JERRY_STANDALONE_EXIT_CODE_FAIL ;
366412 }
367413
368414 fwrite (output_buffer , sizeof (uint8_t ), literal_buffer_size , literal_file_p );
369415 fclose (literal_file_p );
370416
371- printf ("Created literal file: '%s' (%lu bytes)\n" , save_literals_file_name_p , (unsigned long ) literal_buffer_size );
417+ printf ("Created literal file: '%s' (%lu bytes)\n" , literals_file_name_p , (unsigned long ) literal_buffer_size );
372418 }
373419
374420 return 0 ;
0 commit comments