14
14
*/
15
15
16
16
#include <assert.h>
17
+ #include <stdlib.h>
17
18
#include <string.h>
18
19
19
20
#include "jerryscript.h"
27
28
*/
28
29
#define JERRY_BUFFER_SIZE (1048576)
29
30
31
+ /**
32
+ * Maximum number of loaded literals
33
+ */
34
+ #define JERRY_LITERAL_LENGTH (4096)
35
+
30
36
/**
31
37
* Standalone Jerry exit codes
32
38
*/
33
39
#define JERRY_STANDALONE_EXIT_CODE_OK (0)
34
40
#define JERRY_STANDALONE_EXIT_CODE_FAIL (1)
35
41
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 ];
38
44
static 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 ];
39
47
40
48
/**
41
49
* Check whether JerryScript has a requested feature enabled or not. If not,
@@ -168,6 +176,7 @@ typedef enum
168
176
OPT_GENERATE_LITERAL_C ,
169
177
OPT_GENERATE_SHOW_OP ,
170
178
OPT_GENERATE_OUT ,
179
+ OPT_IMPORT_LITERAL_LIST
171
180
} generate_opt_id_t ;
172
181
173
182
/**
@@ -179,6 +188,9 @@ static const cli_opt_t generate_opts[] =
179
188
.help = "print this help and exit" ),
180
189
CLI_OPT_DEF (.id = OPT_GENERATE_STATIC , .opt = "s" , .longopt = "static" ,
181
190
.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)" ),
182
194
CLI_OPT_DEF (.id = OPT_GENERATE_LITERAL_LIST , .longopt = "save-literals-list-format" ,
183
195
.meta = "FILE" ,
184
196
.help = "export literals found in parsed JS input (in list format)" ),
@@ -190,7 +202,7 @@ static const cli_opt_t generate_opts[] =
190
202
CLI_OPT_DEF (.id = OPT_GENERATE_OUT , .opt = "o" , .meta = "FILE" ,
191
203
.help = "specify output file name (default: js.snapshot)" ),
192
204
CLI_OPT_DEF (.id = CLI_OPT_DEFAULT , .meta = "FILE" ,
193
- .help = "input snapshot file" )
205
+ .help = "input source file" )
194
206
};
195
207
196
208
/**
@@ -206,13 +218,14 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
206
218
(void ) argc ;
207
219
208
220
bool is_save_literals_mode_in_c_format = false;
221
+ bool is_import_literals = false;
209
222
uint32_t snapshot_flags = 0 ;
210
223
jerry_init_flag_t flags = JERRY_INIT_EMPTY ;
211
224
212
225
const char * file_name_p = NULL ;
213
226
uint8_t * source_p = input_buffer ;
214
227
size_t source_length = 0 ;
215
- const char * save_literals_file_name_p = NULL ;
228
+ const char * literals_file_name_p = NULL ;
216
229
217
230
cli_change_opts (cli_state_p , generate_opts );
218
231
@@ -230,17 +243,19 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
230
243
snapshot_flags |= JERRY_SNAPSHOT_SAVE_STATIC ;
231
244
break ;
232
245
}
233
- case OPT_GENERATE_LITERAL_LIST :
234
246
case OPT_GENERATE_LITERAL_C :
247
+ case OPT_GENERATE_LITERAL_LIST :
248
+ case OPT_IMPORT_LITERAL_LIST :
235
249
{
236
- if (save_literals_file_name_p != NULL )
250
+ if (literals_file_name_p != NULL )
237
251
{
238
252
jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Error: literal file name already specified" );
239
253
return JERRY_STANDALONE_EXIT_CODE_FAIL ;
240
254
}
241
255
256
+ is_import_literals = (id == OPT_IMPORT_LITERAL_LIST );
242
257
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 );
244
259
break ;
245
260
}
246
261
case OPT_GENERATE_SHOW_OP :
@@ -306,8 +321,39 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
306
321
return JERRY_STANDALONE_EXIT_CODE_FAIL ;
307
322
}
308
323
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 );
310
328
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 ;
311
357
snapshot_result = jerry_generate_snapshot ((jerry_char_t * ) file_name_p ,
312
358
(size_t ) strlen (file_name_p ),
313
359
(jerry_char_t * ) source_p ,
@@ -343,7 +389,7 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
343
389
344
390
printf ("Created snapshot file: '%s' (%lu bytes)\n" , output_file_name_p , (unsigned long ) snapshot_size );
345
391
346
- if (save_literals_file_name_p != NULL )
392
+ if (literals_file_name_p != NULL && ! is_import_literals )
347
393
{
348
394
const size_t literal_buffer_size = jerry_parse_and_save_literals ((jerry_char_t * ) source_p ,
349
395
source_length ,
@@ -357,18 +403,18 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
357
403
return JERRY_STANDALONE_EXIT_CODE_FAIL ;
358
404
}
359
405
360
- FILE * literal_file_p = fopen (save_literals_file_name_p , "wb" );
406
+ FILE * literal_file_p = fopen (literals_file_name_p , "wb" );
361
407
362
408
if (literal_file_p == NULL )
363
409
{
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 );
365
411
return JERRY_STANDALONE_EXIT_CODE_FAIL ;
366
412
}
367
413
368
414
fwrite (output_buffer , sizeof (uint8_t ), literal_buffer_size , literal_file_p );
369
415
fclose (literal_file_p );
370
416
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 );
372
418
}
373
419
374
420
return 0 ;
0 commit comments