@@ -73,6 +73,7 @@ import '../utils/kernel_chain.dart' show runDiff, openWrite;
73
73
74
74
class Context extends ChainContext {
75
75
final CompilerContext compilerContext;
76
+ final CompilerContext compilerContextNoNNBD;
76
77
final List <DiagnosticMessage > errors;
77
78
78
79
@override
@@ -82,7 +83,8 @@ class Context extends ChainContext {
82
83
final Set <Uri > fuzzedLibraries = {};
83
84
int fuzzCompiles = 0 ;
84
85
85
- Context (this .compilerContext, this .errors, bool updateExpectations, this .fuzz)
86
+ Context (this .compilerContext, this .compilerContextNoNNBD, this .errors,
87
+ bool updateExpectations, this .fuzz)
86
88
: steps = < Step > [
87
89
const ReadTest (),
88
90
const CompileExpression (),
@@ -362,8 +364,12 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
362
364
363
365
// Compile [test.expression], update [test.errors] with results.
364
366
// As a side effect - verify that generated procedure can be serialized.
365
- Future <void > compileExpression (TestCase test, IncrementalCompiler compiler,
366
- IncrementalCompilerResult compilerResult, Context context) async {
367
+ Future <void > compileExpression (
368
+ TestCase test,
369
+ IncrementalCompiler compiler,
370
+ IncrementalCompiler ? compilerNoNNBD,
371
+ IncrementalCompilerResult compilerResult,
372
+ Context context) async {
367
373
Map <String , DartType >? definitions = createDefinitionsWithTypes (
368
374
compilerResult.classHierarchy? .knownLibraries,
369
375
test.definitionTypes,
@@ -408,29 +414,36 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
408
414
}
409
415
410
416
if (context.fuzz) {
411
- await fuzz (compiler, compilerResult, context);
417
+ await fuzz (compiler, compilerNoNNBD ! , compilerResult, context);
412
418
}
413
419
}
414
420
415
- Future <void > fuzz (IncrementalCompiler compiler,
416
- IncrementalCompilerResult compilerResult, Context context) async {
421
+ Future <void > fuzz (
422
+ IncrementalCompiler compiler,
423
+ IncrementalCompiler compilerNoNNBD,
424
+ IncrementalCompilerResult compilerResult,
425
+ Context context) async {
417
426
for (Library lib in compilerResult.classHierarchy! .knownLibraries) {
418
427
if (! context.fuzzedLibraries.add (lib.importUri)) continue ;
419
428
420
429
for (Member m in lib.members) {
421
- await fuzzMember (m, compiler, lib.importUri, context);
430
+ await fuzzMember (m, compiler, compilerNoNNBD, lib.importUri, context);
422
431
}
423
432
424
433
for (Class c in lib.classes) {
425
434
for (Member m in c.members) {
426
- await fuzzMember (m, compiler, lib.importUri, context);
435
+ await fuzzMember (m, compiler, compilerNoNNBD, lib.importUri, context);
427
436
}
428
437
}
429
438
}
430
439
}
431
440
432
- Future <void > fuzzMember (Member m, IncrementalCompiler compiler,
433
- Uri libraryUri, Context context) async {
441
+ Future <void > fuzzMember (
442
+ Member m,
443
+ IncrementalCompiler compiler,
444
+ IncrementalCompiler compilerNoNNBD,
445
+ Uri libraryUri,
446
+ Context context) async {
434
447
String expression = m.name.text;
435
448
if (m is Field || (m is Procedure && m.isGetter)) {
436
449
// fields and getters are fine as-is
@@ -447,8 +460,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
447
460
expression = "${parent .name }()" ;
448
461
}
449
462
} else {
450
- print ("Ignoring $m (${m .runtimeType })" );
451
- return ;
463
+ throw "Didn't know ${m .runtimeType }" ;
452
464
}
453
465
454
466
String ? className;
@@ -457,23 +469,36 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
457
469
className = parent.name;
458
470
}
459
471
460
- await fuzzTryCompile (compiler, "$expression " , libraryUri, className,
461
- ! m.isInstanceMember, context);
462
- if (className != null && ! m.isInstanceMember) {
463
- await fuzzTryCompile (compiler, "$className .$expression " , libraryUri, null ,
464
- ! m.isInstanceMember, context);
465
- }
466
- await fuzzTryCompile (compiler, "$expression .toString()" , libraryUri,
472
+ await fuzzTryCompile (compiler, compilerNoNNBD, "$expression " , libraryUri,
467
473
className, ! m.isInstanceMember, context);
468
474
if (className != null && ! m.isInstanceMember) {
469
- await fuzzTryCompile (compiler, "$className .$expression .toString() " ,
475
+ await fuzzTryCompile (compiler, compilerNoNNBD, "$className .$expression " ,
470
476
libraryUri, null , ! m.isInstanceMember, context);
471
477
}
472
- await fuzzTryCompile (compiler, "$expression .toString() == '42'" , libraryUri ,
473
- className, ! m.isInstanceMember, context);
478
+ await fuzzTryCompile (compiler, compilerNoNNBD, "$expression .toString()" ,
479
+ libraryUri, className, ! m.isInstanceMember, context);
474
480
if (className != null && ! m.isInstanceMember) {
475
481
await fuzzTryCompile (
476
482
compiler,
483
+ compilerNoNNBD,
484
+ "$className .$expression .toString()" ,
485
+ libraryUri,
486
+ null ,
487
+ ! m.isInstanceMember,
488
+ context);
489
+ }
490
+ await fuzzTryCompile (
491
+ compiler,
492
+ compilerNoNNBD,
493
+ "$expression .toString() == '42'" ,
494
+ libraryUri,
495
+ className,
496
+ ! m.isInstanceMember,
497
+ context);
498
+ if (className != null && ! m.isInstanceMember) {
499
+ await fuzzTryCompile (
500
+ compiler,
501
+ compilerNoNNBD,
477
502
"$className .$expression .toString() == '42'" ,
478
503
libraryUri,
479
504
null ,
@@ -482,6 +507,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
482
507
}
483
508
await fuzzTryCompile (
484
509
compiler,
510
+ compilerNoNNBD,
485
511
"() { var x = $expression .toString(); x == '42'; }()" ,
486
512
libraryUri,
487
513
className,
@@ -490,6 +516,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
490
516
if (className != null && ! m.isInstanceMember) {
491
517
await fuzzTryCompile (
492
518
compiler,
519
+ compilerNoNNBD,
493
520
"() { var x = $className .$expression .toString(); x == '42'; }()" ,
494
521
libraryUri,
495
522
null ,
@@ -498,25 +525,50 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
498
525
}
499
526
}
500
527
501
- Future <void > fuzzTryCompile (IncrementalCompiler compiler, String expression,
502
- Uri libraryUri, String ? className, bool isStatic, Context context) async {
528
+ Future <void > fuzzTryCompile (
529
+ IncrementalCompiler compiler,
530
+ IncrementalCompiler compilerNoNNBD,
531
+ String expression,
532
+ Uri libraryUri,
533
+ String ? className,
534
+ bool isStatic,
535
+ Context context) async {
503
536
context.fuzzCompiles++ ;
504
537
print ("Fuzz compile #${context .fuzzCompiles } "
505
538
"('$expression ' in $libraryUri $className )" );
506
- Procedure ? compiledProcedure = await compiler.compileExpression (
507
- expression,
508
- {},
509
- [],
510
- "debugExpr" ,
511
- libraryUri,
512
- className: className,
513
- isStatic: isStatic,
514
- );
515
- context.takeErrors ();
516
- if (compiledProcedure != null ) {
517
- // Confirm we can serialize generated procedure.
518
- List <int > list = serializeProcedure (compiledProcedure);
519
- assert (list.length > 0 );
539
+ {
540
+ Procedure ? compiledProcedure = await compiler.compileExpression (
541
+ expression,
542
+ {},
543
+ [],
544
+ "debugExpr" ,
545
+ libraryUri,
546
+ className: className,
547
+ isStatic: isStatic,
548
+ );
549
+ context.takeErrors ();
550
+ if (compiledProcedure != null ) {
551
+ // Confirm we can serialize generated procedure.
552
+ List <int > list = serializeProcedure (compiledProcedure);
553
+ assert (list.length > 0 );
554
+ }
555
+ }
556
+ {
557
+ Procedure ? compiledProcedure = await compilerNoNNBD.compileExpression (
558
+ expression,
559
+ {},
560
+ [],
561
+ "debugExpr" ,
562
+ libraryUri,
563
+ className: className,
564
+ isStatic: isStatic,
565
+ );
566
+ context.takeErrors ();
567
+ if (compiledProcedure != null ) {
568
+ // Confirm we can serialize generated procedure.
569
+ List <int > list = serializeProcedure (compiledProcedure);
570
+ assert (list.length > 0 );
571
+ }
520
572
}
521
573
}
522
574
@@ -543,11 +595,27 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
543
595
"${errors .map ((e ) => e .plainTextFormatted .first ).toList ()}" );
544
596
}
545
597
Uri dillFileUri = toTestUri ("${test .description .shortName }.dill" );
598
+ Uri dillFileNoNNBDUri =
599
+ toTestUri ("${test .description .shortName }.no.nnbd.dill" );
546
600
Uint8List dillData = await serializeComponent (component);
547
601
context.fileSystem.entityForUri (dillFileUri).writeAsBytesSync (dillData);
548
602
Set <Uri > beforeFuzzedLibraries = context.fuzzedLibraries.toSet ();
549
- await compileExpression (
550
- test, sourceCompiler, sourceCompilerResult, context);
603
+ IncrementalCompiler ? sourceCompilerNoNNBD;
604
+ if (context.fuzz) {
605
+ sourceCompilerNoNNBD =
606
+ new IncrementalCompiler (context.compilerContextNoNNBD);
607
+ IncrementalCompilerResult sourceCompilerNoNNBDResult =
608
+ await sourceCompilerNoNNBD
609
+ .computeDelta (entryPoints: [test.entryPoint]);
610
+ Component componentNoNNBD = sourceCompilerNoNNBDResult.component;
611
+ Uint8List dillDataNoNNBD = await serializeComponent (componentNoNNBD);
612
+ context.fileSystem
613
+ .entityForUri (dillFileNoNNBDUri)
614
+ .writeAsBytesSync (dillDataNoNNBD);
615
+ context.takeErrors ();
616
+ }
617
+ await compileExpression (test, sourceCompiler, sourceCompilerNoNNBD,
618
+ sourceCompilerResult, context);
551
619
552
620
IncrementalCompiler dillCompiler =
553
621
new IncrementalCompiler (context.compilerContext, dillFileUri);
@@ -560,9 +628,23 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
560
628
// Since it compiled successfully from source, the bootstrap-from-Dill
561
629
// should also succeed without errors.
562
630
assert (errors.isEmpty);
631
+
632
+ IncrementalCompiler ? dillCompilerNoNNBD;
633
+ if (context.fuzz) {
634
+ dillCompilerNoNNBD = new IncrementalCompiler (
635
+ context.compilerContextNoNNBD, dillFileNoNNBDUri);
636
+ IncrementalCompilerResult dillCompilerNoNNBDResult =
637
+ await dillCompilerNoNNBD
638
+ .computeDelta (entryPoints: [test.entryPoint]);
639
+ Component componentNoNNBD = dillCompilerNoNNBDResult.component;
640
+ componentNoNNBD.computeCanonicalNames ();
641
+ context.takeErrors ();
642
+ }
643
+
563
644
context.fuzzedLibraries.clear ();
564
645
context.fuzzedLibraries.addAll (beforeFuzzedLibraries);
565
- await compileExpression (test, dillCompiler, dillCompilerResult, context);
646
+ await compileExpression (
647
+ test, dillCompiler, dillCompilerNoNNBD, dillCompilerResult, context);
566
648
}
567
649
return new Result .pass (tests);
568
650
}
@@ -614,17 +696,37 @@ Future<Context> createContext(
614
696
final ProcessedOptions options =
615
697
new ProcessedOptions (options: optionBuilder, inputs: [entryPoint]);
616
698
699
+ final CompilerOptions optionBuilderNoNNBD = new CompilerOptions ()
700
+ ..target = new VmTarget (new TargetFlags ())
701
+ ..verbose = true
702
+ ..omitPlatform = true
703
+ ..fileSystem = fs
704
+ ..sdkSummary = sdkSummary
705
+ ..onDiagnostic = (DiagnosticMessage message) {
706
+ printDiagnosticMessage (message, print);
707
+ errors.add (message);
708
+ }
709
+ ..environmentDefines = const {}
710
+ ..explicitExperimentalFlags = {ExperimentalFlag .nonNullable: false }
711
+ ..allowedExperimentalFlagsForTesting = const AllowedExperimentalFlags ();
712
+
713
+ final ProcessedOptions optionsNoNNBD =
714
+ new ProcessedOptions (options: optionBuilderNoNNBD, inputs: [entryPoint]);
715
+
617
716
final bool updateExpectations = environment["updateExpectations" ] == "true" ;
618
717
619
718
final bool fuzz = environment["fuzz" ] == "true" ;
620
719
621
720
final CompilerContext compilerContext = new CompilerContext (options);
721
+ final CompilerContext compilerContextNoNNBD =
722
+ new CompilerContext (optionsNoNNBD);
622
723
623
724
// Disable colors to ensure that expectation files are the same across
624
725
// platforms and independent of stdin/stderr.
625
726
colors.enableColors = false ;
626
727
627
- return new Context (compilerContext, errors, updateExpectations, fuzz);
728
+ return new Context (
729
+ compilerContext, compilerContextNoNNBD, errors, updateExpectations, fuzz);
628
730
}
629
731
630
732
void main ([List <String > arguments = const []]) =>
0 commit comments