@@ -341,59 +341,90 @@ char *jsonnet_fmt_snippet(JsonnetVm *vm, const char *filename, const char *snipp
341
341
}
342
342
343
343
344
+ namespace {
345
+ enum EvalKind { REGULAR, MULTI, STREAM };
346
+ }
347
+
344
348
static char *jsonnet_evaluate_snippet_aux (JsonnetVm *vm, const char *filename,
345
- const char *snippet, int *error, bool multi )
349
+ const char *snippet, int *error, EvalKind kind )
346
350
{
347
351
try {
348
352
Allocator alloc;
349
- std::string json_str;
350
353
AST *expr;
351
- std::map<std::string, std::string> files;
352
354
Tokens tokens = jsonnet_lex (filename, snippet);
353
355
354
356
expr = jsonnet_parse (&alloc, tokens);
355
357
356
358
jsonnet_desugar (&alloc, expr);
357
359
358
360
jsonnet_static_analysis (expr);
359
- if (multi) {
360
- files = jsonnet_vm_execute_multi (&alloc, expr, vm->ext , vm->maxStack ,
361
- vm->gcMinObjects , vm->gcGrowthTrigger ,
362
- vm->importCallback , vm->importCallbackContext ,
363
- vm->stringOutput );
364
- } else {
365
- json_str = jsonnet_vm_execute (&alloc, expr, vm->ext , vm->maxStack ,
366
- vm->gcMinObjects , vm->gcGrowthTrigger ,
367
- vm->importCallback , vm->importCallbackContext ,
368
- vm->stringOutput );
369
- json_str += " \n " ;
370
- }
371
-
372
- if (multi) {
373
- size_t sz = 1 ; // final sentinel
374
- for (const auto &pair : files) {
375
- sz += pair.first .length () + 1 ; // include sentinel
376
- sz += pair.second .length () + 2 ; // Add a '\n' as well as sentinel
361
+ switch (kind) {
362
+ case REGULAR: {
363
+ std::string json_str = jsonnet_vm_execute (
364
+ &alloc, expr, vm->ext , vm->maxStack , vm->gcMinObjects , vm->gcGrowthTrigger ,
365
+ vm->importCallback , vm->importCallbackContext , vm->stringOutput );
366
+ json_str += " \n " ;
367
+ *error = false ;
368
+ return from_string (vm, json_str);
377
369
}
378
- char *buf = (char *)::malloc (sz);
379
- if (buf == nullptr ) memory_panic ();
380
- std::ptrdiff_t i = 0 ;
381
- for (const auto &pair : files) {
382
- memcpy (&buf[i], pair.first .c_str (), pair.first .length () + 1 );
383
- i += pair.first .length () + 1 ;
384
- memcpy (&buf[i], pair.second .c_str (), pair.second .length ());
385
- i += pair.second .length ();
386
- buf[i] = ' \n ' ;
387
- i++;
388
- buf[i] = ' \0 ' ;
389
- i++;
370
+ break ;
371
+
372
+ case MULTI: {
373
+ std::map<std::string, std::string> files = jsonnet_vm_execute_multi (
374
+ &alloc, expr, vm->ext , vm->maxStack , vm->gcMinObjects , vm->gcGrowthTrigger ,
375
+ vm->importCallback , vm->importCallbackContext , vm->stringOutput );
376
+ size_t sz = 1 ; // final sentinel
377
+ for (const auto &pair : files) {
378
+ sz += pair.first .length () + 1 ; // include sentinel
379
+ sz += pair.second .length () + 2 ; // Add a '\n' as well as sentinel
380
+ }
381
+ char *buf = (char *)::malloc (sz);
382
+ if (buf == nullptr ) memory_panic ();
383
+ std::ptrdiff_t i = 0 ;
384
+ for (const auto &pair : files) {
385
+ memcpy (&buf[i], pair.first .c_str (), pair.first .length () + 1 );
386
+ i += pair.first .length () + 1 ;
387
+ memcpy (&buf[i], pair.second .c_str (), pair.second .length ());
388
+ i += pair.second .length ();
389
+ buf[i] = ' \n ' ;
390
+ i++;
391
+ buf[i] = ' \0 ' ;
392
+ i++;
393
+ }
394
+ buf[i] = ' \0 ' ; // final sentinel
395
+ *error = false ;
396
+ return buf;
390
397
}
391
- buf[i] = ' \0 ' ; // final sentinel
392
- *error = false ;
393
- return buf;
394
- } else {
395
- *error = false ;
396
- return from_string (vm, json_str);
398
+ break ;
399
+
400
+ case STREAM: {
401
+ std::vector<std::string> documents = jsonnet_vm_execute_stream (
402
+ &alloc, expr, vm->ext , vm->maxStack , vm->gcMinObjects , vm->gcGrowthTrigger ,
403
+ vm->importCallback , vm->importCallbackContext );
404
+ size_t sz = 1 ; // final sentinel
405
+ for (const auto &doc : documents) {
406
+ sz += doc.length () + 2 ; // Add a '\n' as well as sentinel
407
+ }
408
+ char *buf = (char *)::malloc (sz);
409
+ if (buf == nullptr ) memory_panic ();
410
+ std::ptrdiff_t i = 0 ;
411
+ for (const auto &doc : documents) {
412
+ memcpy (&buf[i], doc.c_str (), doc.length ());
413
+ i += doc.length ();
414
+ buf[i] = ' \n ' ;
415
+ i++;
416
+ buf[i] = ' \0 ' ;
417
+ i++;
418
+ }
419
+ buf[i] = ' \0 ' ; // final sentinel
420
+ *error = false ;
421
+ return buf;
422
+ }
423
+ break ;
424
+
425
+ default :
426
+ fputs (" INTERNAL ERROR: bad value of 'kind', probably memory corruption.\n " , stderr);
427
+ abort ();
397
428
}
398
429
399
430
} catch (StaticError &e) {
@@ -423,7 +454,7 @@ static char *jsonnet_evaluate_snippet_aux(JsonnetVm *vm, const char *filename,
423
454
424
455
}
425
456
426
- static char *jsonnet_evaluate_file_aux (JsonnetVm *vm, const char *filename, int *error, bool multi )
457
+ static char *jsonnet_evaluate_file_aux (JsonnetVm *vm, const char *filename, int *error, EvalKind kind )
427
458
{
428
459
std::ifstream f;
429
460
f.open (filename);
@@ -437,29 +468,37 @@ static char *jsonnet_evaluate_file_aux(JsonnetVm *vm, const char *filename, int
437
468
input.assign (std::istreambuf_iterator<char >(f),
438
469
std::istreambuf_iterator<char >());
439
470
440
- return jsonnet_evaluate_snippet_aux (vm, filename, input.c_str (), error, multi );
471
+ return jsonnet_evaluate_snippet_aux (vm, filename, input.c_str (), error, kind );
441
472
}
442
473
443
474
char *jsonnet_evaluate_file (JsonnetVm *vm, const char *filename, int *error)
444
475
{
445
476
TRY
446
- return jsonnet_evaluate_file_aux (vm, filename, error, false );
477
+ return jsonnet_evaluate_file_aux (vm, filename, error, REGULAR );
447
478
CATCH (" jsonnet_evaluate_file" )
448
479
return nullptr ; // Never happens.
449
480
}
450
481
451
482
char *jsonnet_evaluate_file_multi (JsonnetVm *vm, const char *filename, int *error)
452
483
{
453
484
TRY
454
- return jsonnet_evaluate_file_aux (vm, filename, error, true );
485
+ return jsonnet_evaluate_file_aux (vm, filename, error, MULTI );
455
486
CATCH (" jsonnet_evaluate_file_multi" )
456
487
return nullptr ; // Never happens.
457
488
}
458
489
490
+ char *jsonnet_evaluate_file_stream (JsonnetVm *vm, const char *filename, int *error)
491
+ {
492
+ TRY
493
+ return jsonnet_evaluate_file_aux (vm, filename, error, STREAM);
494
+ CATCH (" jsonnet_evaluate_file_stream" )
495
+ return nullptr ; // Never happens.
496
+ }
497
+
459
498
char *jsonnet_evaluate_snippet (JsonnetVm *vm, const char *filename, const char *snippet, int *error)
460
499
{
461
500
TRY
462
- return jsonnet_evaluate_snippet_aux (vm, filename, snippet, error, false );
501
+ return jsonnet_evaluate_snippet_aux (vm, filename, snippet, error, REGULAR );
463
502
CATCH (" jsonnet_evaluate_snippet" )
464
503
return nullptr ; // Never happens.
465
504
}
@@ -468,11 +507,20 @@ char *jsonnet_evaluate_snippet_multi(JsonnetVm *vm, const char *filename,
468
507
const char *snippet, int *error)
469
508
{
470
509
TRY
471
- return jsonnet_evaluate_snippet_aux (vm, filename, snippet, error, true );
510
+ return jsonnet_evaluate_snippet_aux (vm, filename, snippet, error, MULTI );
472
511
CATCH (" jsonnet_evaluate_snippet_multi" )
473
512
return nullptr ; // Never happens.
474
513
}
475
514
515
+ char *jsonnet_evaluate_snippet_stream (JsonnetVm *vm, const char *filename,
516
+ const char *snippet, int *error)
517
+ {
518
+ TRY
519
+ return jsonnet_evaluate_snippet_aux (vm, filename, snippet, error, STREAM);
520
+ CATCH (" jsonnet_evaluate_snippet_stream" )
521
+ return nullptr ; // Never happens.
522
+ }
523
+
476
524
char *jsonnet_realloc (JsonnetVm *vm, char *str, size_t sz)
477
525
{
478
526
(void ) vm;
0 commit comments