| Index: tests/compiler/dart2js/serialization/model_test_helper.dart
|
| diff --git a/tests/compiler/dart2js/serialization/model_test_helper.dart b/tests/compiler/dart2js/serialization/model_test_helper.dart
|
| index ef923035d4cbfb605dd824b4805eb167b554a23f..6952d35db7d9a05a79a2332db027e39f61a27433 100644
|
| --- a/tests/compiler/dart2js/serialization/model_test_helper.dart
|
| +++ b/tests/compiler/dart2js/serialization/model_test_helper.dart
|
| @@ -38,19 +38,18 @@ main(List<String> args) {
|
| await serializeDartCore(arguments: arguments);
|
| if (arguments.filename != null) {
|
| Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
|
| - SerializationResult result = await measure(
|
| - '${entryPoint}', 'serialize', () {
|
| - return serialize(
|
| - entryPoint,
|
| + SerializationResult result =
|
| + await measure('${entryPoint}', 'serialize', () {
|
| + return serialize(entryPoint,
|
| memorySourceFiles: serializedData.toMemorySourceFiles(),
|
| resolutionInputs: serializedData.toUris(),
|
| dataUri: Uri.parse('memory:test.data'));
|
| });
|
| await checkModels(entryPoint,
|
| - sourceFiles: serializedData.toMemorySourceFiles(
|
| - result.serializedData.toMemorySourceFiles()),
|
| - resolutionInputs: serializedData.toUris(
|
| - result.serializedData.toUris()));
|
| + sourceFiles: serializedData
|
| + .toMemorySourceFiles(result.serializedData.toMemorySourceFiles()),
|
| + resolutionInputs:
|
| + serializedData.toUris(result.serializedData.toUris()));
|
| } else {
|
| Uri entryPoint = Uri.parse('memory:main.dart');
|
| await arguments.forEachTest(serializedData, TESTS, checkModels);
|
| @@ -59,33 +58,30 @@ main(List<String> args) {
|
| });
|
| }
|
|
|
| -Future checkModels(
|
| - Uri entryPoint,
|
| +Future checkModels(Uri entryPoint,
|
| {Map<String, String> sourceFiles: const <String, String>{},
|
| - List<Uri> resolutionInputs,
|
| - int index,
|
| - Test test,
|
| - bool verbose: false}) async {
|
| + List<Uri> resolutionInputs,
|
| + int index,
|
| + Test test,
|
| + bool verbose: false}) async {
|
| String testDescription = test != null ? test.name : '${entryPoint}';
|
| String id = index != null ? '$index: ' : '';
|
| String title = '${id}${testDescription}';
|
| - Compiler compilerNormal = await measure(
|
| - title, 'compile normal', () async {
|
| + Compiler compilerNormal = await measure(title, 'compile normal', () async {
|
| Compiler compilerNormal = compilerFor(
|
| - memorySourceFiles: sourceFiles,
|
| - options: [Flags.analyzeOnly]);
|
| + memorySourceFiles: sourceFiles, options: [Flags.analyzeOnly]);
|
| compilerNormal.resolution.retainCachesForTesting = true;
|
| await compilerNormal.run(entryPoint);
|
| compilerNormal.phase = Compiler.PHASE_DONE_RESOLVING;
|
| compilerNormal.world.populate();
|
| compilerNormal.backend.onResolutionComplete();
|
| - compilerNormal.deferredLoadTask.onResolutionComplete(
|
| - compilerNormal.mainFunction);
|
| + compilerNormal.deferredLoadTask
|
| + .onResolutionComplete(compilerNormal.mainFunction);
|
| return compilerNormal;
|
| });
|
|
|
| - Compiler compilerDeserialized = await measure(
|
| - title, 'compile deserialized', () async {
|
| + Compiler compilerDeserialized =
|
| + await measure(title, 'compile deserialized', () async {
|
| Compiler compilerDeserialized = compilerFor(
|
| memorySourceFiles: sourceFiles,
|
| resolutionInputs: resolutionInputs,
|
| @@ -95,15 +91,13 @@ Future checkModels(
|
| compilerDeserialized.phase = Compiler.PHASE_DONE_RESOLVING;
|
| compilerDeserialized.world.populate();
|
| compilerDeserialized.backend.onResolutionComplete();
|
| - compilerDeserialized.deferredLoadTask.onResolutionComplete(
|
| - compilerDeserialized.mainFunction);
|
| + compilerDeserialized.deferredLoadTask
|
| + .onResolutionComplete(compilerDeserialized.mainFunction);
|
| return compilerDeserialized;
|
| });
|
|
|
| return measure(title, 'check models', () async {
|
| - checkAllImpacts(
|
| - compilerNormal, compilerDeserialized,
|
| - verbose: verbose);
|
| + checkAllImpacts(compilerNormal, compilerDeserialized, verbose: verbose);
|
|
|
| checkSets(
|
| compilerNormal.resolverWorld.directlyInstantiatedClasses,
|
| @@ -130,32 +124,34 @@ Future checkModels(
|
| compilerNormal.enqueuer.resolution.processedElements,
|
| compilerDeserialized.enqueuer.resolution.processedElements,
|
| "Processed element mismatch",
|
| - areElementsEquivalent,
|
| - onSameElement: (a, b) {
|
| - checkElements(
|
| - compilerNormal, compilerDeserialized, a, b, verbose: verbose);
|
| - },
|
| - verbose: verbose);
|
| + areElementsEquivalent, onSameElement: (a, b) {
|
| + checkElements(compilerNormal, compilerDeserialized, a, b,
|
| + verbose: verbose);
|
| + }, verbose: verbose);
|
|
|
| checkClassHierarchyNodes(
|
| compilerNormal,
|
| compilerDeserialized,
|
| - compilerNormal.world.getClassHierarchyNode(
|
| - compilerNormal.coreClasses.objectClass),
|
| + compilerNormal.world
|
| + .getClassHierarchyNode(compilerNormal.coreClasses.objectClass),
|
| compilerDeserialized.world.getClassHierarchyNode(
|
| compilerDeserialized.coreClasses.objectClass),
|
| verbose: verbose);
|
|
|
| - Expect.equals(compilerNormal.enabledInvokeOn,
|
| + Expect.equals(
|
| + compilerNormal.enabledInvokeOn,
|
| compilerDeserialized.enabledInvokeOn,
|
| "Compiler.enabledInvokeOn mismatch");
|
| - Expect.equals(compilerNormal.enabledFunctionApply,
|
| + Expect.equals(
|
| + compilerNormal.enabledFunctionApply,
|
| compilerDeserialized.enabledFunctionApply,
|
| "Compiler.enabledFunctionApply mismatch");
|
| - Expect.equals(compilerNormal.enabledRuntimeType,
|
| + Expect.equals(
|
| + compilerNormal.enabledRuntimeType,
|
| compilerDeserialized.enabledRuntimeType,
|
| "Compiler.enabledRuntimeType mismatch");
|
| - Expect.equals(compilerNormal.hasIsolateSupport,
|
| + Expect.equals(
|
| + compilerNormal.hasIsolateSupport,
|
| compilerDeserialized.hasIsolateSupport,
|
| "Compiler.hasIsolateSupport mismatch");
|
| Expect.equals(
|
| @@ -175,57 +171,56 @@ Future checkModels(
|
| failOnUnfound: false,
|
| failOnExtra: false,
|
| onSameElement: (ConstantValue value1, ConstantValue value2) {
|
| - OutputUnit outputUnit1 = constants1[value1];
|
| - OutputUnit outputUnit2 = constants2[value2];
|
| - checkOutputUnits(outputUnit1, outputUnit2,
|
| - 'for ${value1.toStructuredText()} '
|
| - 'vs ${value2.toStructuredText()}');
|
| - },
|
| - onUnfoundElement: (ConstantValue value1) {
|
| - OutputUnit outputUnit1 = constants1[value1];
|
| - Expect.isTrue(outputUnit1.isMainOutput,
|
| - "Missing deferred constant: ${value1.toStructuredText()}");
|
| - },
|
| - onExtraElement: (ConstantValue value2) {
|
| - OutputUnit outputUnit2 = constants2[value2];
|
| - Expect.isTrue(outputUnit2.isMainOutput,
|
| - "Extra deferred constant: ${value2.toStructuredText()}");
|
| - },
|
| - elementToString: (a) {
|
| - return '${a.toStructuredText()} -> ${constants1[a]}/${constants2[a]}';
|
| - });
|
| + OutputUnit outputUnit1 = constants1[value1];
|
| + OutputUnit outputUnit2 = constants2[value2];
|
| + checkOutputUnits(
|
| + outputUnit1,
|
| + outputUnit2,
|
| + 'for ${value1.toStructuredText()} '
|
| + 'vs ${value2.toStructuredText()}');
|
| + }, onUnfoundElement: (ConstantValue value1) {
|
| + OutputUnit outputUnit1 = constants1[value1];
|
| + Expect.isTrue(outputUnit1.isMainOutput,
|
| + "Missing deferred constant: ${value1.toStructuredText()}");
|
| + }, onExtraElement: (ConstantValue value2) {
|
| + OutputUnit outputUnit2 = constants2[value2];
|
| + Expect.isTrue(outputUnit2.isMainOutput,
|
| + "Extra deferred constant: ${value2.toStructuredText()}");
|
| + }, elementToString: (a) {
|
| + return '${a.toStructuredText()} -> ${constants1[a]}/${constants2[a]}';
|
| + });
|
| });
|
| }
|
|
|
| void checkElements(
|
| - Compiler compiler1, Compiler compiler2,
|
| - Element element1, Element element2,
|
| + Compiler compiler1, Compiler compiler2, Element element1, Element element2,
|
| {bool verbose: false}) {
|
| if (element1.isFunction ||
|
| element1.isConstructor ||
|
| (element1.isField && element1.isInstanceMember)) {
|
| AstElement astElement1 = element1;
|
| AstElement astElement2 = element2;
|
| - ClosureClassMap closureData1 =
|
| - compiler1.closureToClassMapper.computeClosureToClassMapping(
|
| - astElement1.resolvedAst);
|
| - ClosureClassMap closureData2 =
|
| - compiler2.closureToClassMapper.computeClosureToClassMapping(
|
| - astElement2.resolvedAst);
|
| + ClosureClassMap closureData1 = compiler1.closureToClassMapper
|
| + .computeClosureToClassMapping(astElement1.resolvedAst);
|
| + ClosureClassMap closureData2 = compiler2.closureToClassMapper
|
| + .computeClosureToClassMapping(astElement2.resolvedAst);
|
|
|
| - checkElementIdentities(closureData1, closureData2,
|
| + checkElementIdentities(
|
| + closureData1,
|
| + closureData2,
|
| '$element1.closureElement',
|
| - closureData1.closureElement, closureData2.closureElement);
|
| - checkElementIdentities(closureData1, closureData2,
|
| + closureData1.closureElement,
|
| + closureData2.closureElement);
|
| + checkElementIdentities(
|
| + closureData1,
|
| + closureData2,
|
| '$element1.closureClassElement',
|
| - closureData1.closureClassElement, closureData2.closureClassElement);
|
| - checkElementIdentities(closureData1, closureData2,
|
| - '$element1.callElement',
|
| + closureData1.closureClassElement,
|
| + closureData2.closureClassElement);
|
| + checkElementIdentities(closureData1, closureData2, '$element1.callElement',
|
| closureData1.callElement, closureData2.callElement);
|
| - check(closureData1, closureData2,
|
| - '$element1.thisLocal',
|
| - closureData1.thisLocal, closureData2.thisLocal,
|
| - areLocalsEquivalent);
|
| + check(closureData1, closureData2, '$element1.thisLocal',
|
| + closureData1.thisLocal, closureData2.thisLocal, areLocalsEquivalent);
|
| checkMaps(
|
| closureData1.freeVariableMap,
|
| closureData2.freeVariableMap,
|
| @@ -250,24 +245,16 @@ void checkElements(
|
| if (element1 is MemberElement && element2 is MemberElement) {
|
| MemberElement member1 = element1.implementation;
|
| MemberElement member2 = element2.implementation;
|
| - checkSets(
|
| - member1.nestedClosures,
|
| - member2.nestedClosures,
|
| - "$member1.nestedClosures",
|
| - areElementsEquivalent,
|
| - verbose: verbose,
|
| + checkSets(member1.nestedClosures, member2.nestedClosures,
|
| + "$member1.nestedClosures", areElementsEquivalent, verbose: verbose,
|
| onSameElement: (a, b) {
|
| - LocalFunctionElement localFunction1 = a.expression;
|
| - LocalFunctionElement localFunction2 = b.expression;
|
| - checkElementIdentities(
|
| - localFunction1, localFunction2,
|
| - 'enclosingClass',
|
| - localFunction1.enclosingClass, localFunction2.enclosingClass);
|
| - testResolvedAstEquivalence(
|
| - localFunction1.resolvedAst,
|
| - localFunction2.resolvedAst,
|
| - const CheckStrategy());
|
| - });
|
| + LocalFunctionElement localFunction1 = a.expression;
|
| + LocalFunctionElement localFunction2 = b.expression;
|
| + checkElementIdentities(localFunction1, localFunction2, 'enclosingClass',
|
| + localFunction1.enclosingClass, localFunction2.enclosingClass);
|
| + testResolvedAstEquivalence(localFunction1.resolvedAst,
|
| + localFunction2.resolvedAst, const CheckStrategy());
|
| + });
|
| }
|
| }
|
| JavaScriptBackend backend1 = compiler1.backend;
|
| @@ -280,30 +267,24 @@ void checkElements(
|
| checkElementOutputUnits(compiler1, compiler2, element1, element2);
|
| }
|
|
|
| -void checkMixinUses(
|
| - Compiler compiler1, Compiler compiler2,
|
| - ClassElement class1, ClassElement class2,
|
| +void checkMixinUses(Compiler compiler1, Compiler compiler2, ClassElement class1,
|
| + ClassElement class2,
|
| {bool verbose: false}) {
|
| -
|
| checkSets(
|
| compiler1.world.mixinUsesOf(class1),
|
| compiler2.world.mixinUsesOf(class2),
|
| "Mixin uses of $class1 vs $class2",
|
| areElementsEquivalent,
|
| verbose: verbose);
|
| -
|
| }
|
|
|
| -void checkClassHierarchyNodes(
|
| - Compiler compiler1,
|
| - Compiler compiler2,
|
| +void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2,
|
| ClassHierarchyNode node1, ClassHierarchyNode node2,
|
| {bool verbose: false}) {
|
| if (verbose) {
|
| print('Checking $node1 vs $node2');
|
| }
|
| - Expect.isTrue(
|
| - areElementsEquivalent(node1.cls, node2.cls),
|
| + Expect.isTrue(areElementsEquivalent(node1.cls, node2.cls),
|
| "Element identity mismatch for ${node1.cls} vs ${node2.cls}.");
|
| Expect.equals(
|
| node1.isDirectlyInstantiated,
|
| @@ -321,8 +302,8 @@ void checkClassHierarchyNodes(
|
| bool found = false;
|
| for (ClassHierarchyNode other in node2.directSubclasses) {
|
| if (areElementsEquivalent(child.cls, other.cls)) {
|
| - checkClassHierarchyNodes(compiler1, compiler2,
|
| - child, other, verbose: verbose);
|
| + checkClassHierarchyNodes(compiler1, compiler2, child, other,
|
| + verbose: verbose);
|
| found = true;
|
| break;
|
| }
|
| @@ -331,14 +312,15 @@ void checkClassHierarchyNodes(
|
| if (child.isInstantiated) {
|
| print('Missing subclass ${child.cls} of ${node1.cls} '
|
| 'in ${node2.directSubclasses}');
|
| - print(compiler1.world.dump(
|
| - verbose ? compiler1.coreClasses.objectClass : node1.cls));
|
| - print(compiler2.world.dump(
|
| - verbose ? compiler2.coreClasses.objectClass : node2.cls));
|
| + print(compiler1.world
|
| + .dump(verbose ? compiler1.coreClasses.objectClass : node1.cls));
|
| + print(compiler2.world
|
| + .dump(verbose ? compiler2.coreClasses.objectClass : node2.cls));
|
| }
|
| - Expect.isFalse(child.isInstantiated,
|
| + Expect.isFalse(
|
| + child.isInstantiated,
|
| 'Missing subclass ${child.cls} of ${node1.cls} in '
|
| - '${node2.directSubclasses}');
|
| + '${node2.directSubclasses}');
|
| }
|
| }
|
| checkMixinUses(compiler1, compiler2, node1.cls, node2.cls, verbose: verbose);
|
| @@ -361,7 +343,7 @@ bool areCapturedVariablesEquivalent(CapturedVariable a, CapturedVariable b) {
|
| if (a == null || b == null) return false;
|
| if (a is ClosureFieldElement && b is ClosureFieldElement) {
|
| return areElementsEquivalent(a.closureClass, b.closureClass) &&
|
| - areLocalsEquivalent(a.local, b.local);
|
| + areLocalsEquivalent(a.local, b.local);
|
| } else if (a is BoxFieldElement && b is BoxFieldElement) {
|
| return areElementsEquivalent(a.variableElement, b.variableElement) &&
|
| areLocalsEquivalent(a.box, b.box);
|
| @@ -375,13 +357,14 @@ bool areClosureScopesEquivalent(ClosureScope a, ClosureScope b) {
|
| if (!areLocalsEquivalent(a.boxElement, b.boxElement)) {
|
| return false;
|
| }
|
| - checkMaps(a.capturedVariables, b.capturedVariables,
|
| + checkMaps(
|
| + a.capturedVariables,
|
| + b.capturedVariables,
|
| 'ClosureScope.capturedVariables',
|
| areLocalsEquivalent,
|
| areElementsEquivalent);
|
| checkSets(a.boxedLoopVariables, b.boxedLoopVariables,
|
| - 'ClosureScope.boxedLoopVariables',
|
| - areElementsEquivalent);
|
| + 'ClosureScope.boxedLoopVariables', areElementsEquivalent);
|
| return true;
|
| }
|
|
|
| @@ -393,8 +376,7 @@ String nodeToString(Node node) {
|
| return '(${node.runtimeType}) $text';
|
| }
|
|
|
| -void checkElementOutputUnits(
|
| - Compiler compiler1, Compiler compiler2,
|
| +void checkElementOutputUnits(Compiler compiler1, Compiler compiler2,
|
| Element element1, Element element2) {
|
| OutputUnit outputUnit1 =
|
| compiler1.deferredLoadTask.getOutputUnitForElementForTesting(element1);
|
| @@ -406,11 +388,13 @@ void checkElementOutputUnits(
|
| void checkOutputUnits(
|
| OutputUnit outputUnit1, OutputUnit outputUnit2, String message) {
|
| if (outputUnit1 == null && outputUnit2 == null) return;
|
| - check(outputUnit1, outputUnit2,
|
| - 'OutputUnit.isMainOutput $message',
|
| + check(outputUnit1, outputUnit2, 'OutputUnit.isMainOutput $message',
|
| outputUnit1.isMainOutput, outputUnit2.isMainOutput);
|
| - checkSetEquivalence(outputUnit1, outputUnit2,
|
| + checkSetEquivalence(
|
| + outputUnit1,
|
| + outputUnit2,
|
| 'OutputUnit.imports $message',
|
| - outputUnit1.imports, outputUnit2.imports,
|
| + outputUnit1.imports,
|
| + outputUnit2.imports,
|
| (a, b) => areElementsEquivalent(a.declaration, b.declaration));
|
| }
|
|
|