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 9a4484a4a14530e25aab862dfd945f8e3baeafaa..8beea7d8d82123a0d9532ad08befbc572ba9bab1 100644 |
--- a/tests/compiler/dart2js/serialization/model_test_helper.dart |
+++ b/tests/compiler/dart2js/serialization/model_test_helper.dart |
@@ -13,13 +13,16 @@ import 'package:compiler/src/commandline_options.dart'; |
import 'package:compiler/src/common.dart'; |
import 'package:compiler/src/constants/values.dart'; |
import 'package:compiler/src/compiler.dart'; |
+import 'package:compiler/src/dart_types.dart'; |
import 'package:compiler/src/deferred_load.dart'; |
import 'package:compiler/src/elements/elements.dart'; |
+import 'package:compiler/src/enqueue.dart'; |
import 'package:compiler/src/filenames.dart'; |
import 'package:compiler/src/js_backend/js_backend.dart'; |
import 'package:compiler/src/serialization/equivalence.dart'; |
import 'package:compiler/src/tree/nodes.dart'; |
import 'package:compiler/src/universe/class_set.dart'; |
+import 'package:compiler/src/world.dart' show ClosedWorld; |
import '../memory_compiler.dart'; |
import 'helper.dart'; |
import 'test_data.dart'; |
@@ -36,8 +39,8 @@ main(List<String> args) { |
Arguments arguments = new Arguments.from(args); |
SerializedData serializedData = |
await serializeDartCore(arguments: arguments); |
- if (arguments.filename != null) { |
- Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename)); |
+ if (arguments.uri != null) { |
+ Uri entryPoint = arguments.uri; |
SerializationResult result = |
await measure('${entryPoint}', 'serialize', () { |
return serialize(entryPoint, |
@@ -90,97 +93,121 @@ Future checkModels(Uri entryPoint, |
return measure(title, 'check models', () async { |
checkAllImpacts(compilerNormal, compilerDeserialized, verbose: verbose); |
- |
- checkSets( |
- compilerNormal.resolverWorld.directlyInstantiatedClasses, |
- compilerDeserialized.resolverWorld.directlyInstantiatedClasses, |
- "Directly instantiated classes mismatch", |
- areElementsEquivalent, |
+ checkResolutionEnqueuers(compilerNormal.enqueuer.resolution, |
+ compilerDeserialized.enqueuer.resolution, |
verbose: verbose); |
- |
- checkSets( |
- compilerNormal.resolverWorld.instantiatedTypes, |
- compilerDeserialized.resolverWorld.instantiatedTypes, |
- "Instantiated types mismatch", |
- areTypesEquivalent, |
+ checkClosedWorlds( |
+ compilerNormal.closedWorld, compilerDeserialized.closedWorld, |
verbose: verbose); |
+ checkBackendInfo(compilerNormal, compilerDeserialized, verbose: verbose); |
+ }); |
+} |
- checkSets( |
- compilerNormal.resolverWorld.isChecks, |
- compilerDeserialized.resolverWorld.isChecks, |
- "Is-check mismatch", |
- areTypesEquivalent, |
- verbose: verbose); |
+void checkResolutionEnqueuers( |
+ ResolutionEnqueuer enqueuer1, ResolutionEnqueuer enqueuer2, |
+ {bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
+ bool elementFilter(Element element), |
+ bool verbose: false}) { |
+ Iterable<Element> processedElements1 = enqueuer1.processedElements; |
+ Iterable<Element> processedElements2 = enqueuer2.processedElements; |
+ if (elementFilter != null) { |
+ processedElements1 = processedElements1.where(elementFilter); |
+ processedElements2 = processedElements2.where(elementFilter); |
+ } |
- checkSets( |
- compilerNormal.enqueuer.resolution.processedElements, |
- compilerDeserialized.enqueuer.resolution.processedElements, |
- "Processed element mismatch", |
- areElementsEquivalent, onSameElement: (a, b) { |
- checkElements(compilerNormal, compilerDeserialized, a, b, |
- verbose: verbose); |
- }, verbose: verbose); |
+ checkSets(processedElements1, processedElements2, |
+ "Processed element mismatch", areElementsEquivalent, |
+ verbose: verbose); |
- checkClassHierarchyNodes( |
- compilerNormal, |
- compilerDeserialized, |
- compilerNormal.closedWorld |
- .getClassHierarchyNode(compilerNormal.coreClasses.objectClass), |
- compilerDeserialized.closedWorld.getClassHierarchyNode( |
- compilerDeserialized.coreClasses.objectClass), |
- verbose: verbose); |
+ checkSets( |
+ enqueuer1.universe.directlyInstantiatedClasses, |
+ enqueuer2.universe.directlyInstantiatedClasses, |
+ "Directly instantiated classes mismatch", |
+ areElementsEquivalent, |
+ verbose: verbose); |
- Expect.equals( |
- compilerNormal.enabledInvokeOn, |
- compilerDeserialized.enabledInvokeOn, |
- "Compiler.enabledInvokeOn mismatch"); |
- Expect.equals( |
- compilerNormal.enabledFunctionApply, |
- compilerDeserialized.enabledFunctionApply, |
- "Compiler.enabledFunctionApply mismatch"); |
- Expect.equals( |
- compilerNormal.enabledRuntimeType, |
- compilerDeserialized.enabledRuntimeType, |
- "Compiler.enabledRuntimeType mismatch"); |
- Expect.equals( |
- compilerNormal.hasIsolateSupport, |
- compilerDeserialized.hasIsolateSupport, |
- "Compiler.hasIsolateSupport mismatch"); |
- Expect.equals( |
- compilerNormal.deferredLoadTask.isProgramSplit, |
- compilerDeserialized.deferredLoadTask.isProgramSplit, |
- "isProgramSplit mismatch"); |
+ checkSets( |
+ enqueuer1.universe.instantiatedTypes, |
+ enqueuer2.universe.instantiatedTypes, |
+ "Instantiated types mismatch", |
+ typeEquivalence, |
+ verbose: verbose); |
- Map<ConstantValue, OutputUnit> constants1 = |
- compilerNormal.deferredLoadTask.outputUnitForConstantsForTesting; |
- Map<ConstantValue, OutputUnit> constants2 = |
- compilerDeserialized.deferredLoadTask.outputUnitForConstantsForTesting; |
- checkSets( |
- constants1.keys, |
- constants2.keys, |
- 'deferredLoadTask._outputUnitForConstants.keys', |
- areConstantValuesEquivalent, |
- 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]}'; |
- }); |
+ checkSets(enqueuer1.universe.isChecks, enqueuer2.universe.isChecks, |
+ "Is-check mismatch", typeEquivalence, |
+ verbose: verbose); |
+ |
+ JavaScriptBackend backend1 = enqueuer1.backend; |
+ JavaScriptBackend backend2 = enqueuer2.backend; |
+ Expect.equals(backend1.hasInvokeOnSupport, |
+ backend2.hasInvokeOnSupport, "Compiler.enabledInvokeOn mismatch"); |
+ Expect.equals( |
+ enqueuer1.universe.hasFunctionApplySupport, |
+ enqueuer2.universe.hasFunctionApplySupport, |
+ "ResolutionEnqueuer.universe.hasFunctionApplySupport mismatch"); |
+ Expect.equals( |
+ enqueuer1.universe.hasRuntimeTypeSupport, |
+ enqueuer2.universe.hasRuntimeTypeSupport, |
+ "ResolutionEnqueuer.universe.hasRuntimeTypeSupport mismatch"); |
+ Expect.equals( |
+ enqueuer1.universe.hasIsolateSupport, |
+ enqueuer2.universe.hasIsolateSupport, |
+ "ResolutionEnqueuer.universe.hasIsolateSupport mismatch"); |
+} |
+ |
+void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, |
+ {bool verbose: false}) { |
+ checkClassHierarchyNodes( |
+ closedWorld1, |
+ closedWorld2, |
+ closedWorld1.getClassHierarchyNode(closedWorld1.coreClasses.objectClass), |
+ closedWorld2.getClassHierarchyNode(closedWorld2.coreClasses.objectClass), |
+ verbose: verbose); |
+} |
+ |
+void checkBackendInfo(Compiler compilerNormal, Compiler compilerDeserialized, |
+ {bool verbose: false}) { |
+ checkSets( |
+ compilerNormal.enqueuer.resolution.processedElements, |
+ compilerDeserialized.enqueuer.resolution.processedElements, |
+ "Processed element mismatch", |
+ areElementsEquivalent, onSameElement: (a, b) { |
+ checkElements(compilerNormal, compilerDeserialized, a, b, verbose: verbose); |
+ }, verbose: verbose); |
+ Expect.equals( |
+ compilerNormal.deferredLoadTask.isProgramSplit, |
+ compilerDeserialized.deferredLoadTask.isProgramSplit, |
+ "isProgramSplit mismatch"); |
+ |
+ Map<ConstantValue, OutputUnit> constants1 = |
+ compilerNormal.deferredLoadTask.outputUnitForConstantsForTesting; |
+ Map<ConstantValue, OutputUnit> constants2 = |
+ compilerDeserialized.deferredLoadTask.outputUnitForConstantsForTesting; |
+ checkSets( |
+ constants1.keys, |
+ constants2.keys, |
+ 'deferredLoadTask._outputUnitForConstants.keys', |
+ areConstantValuesEquivalent, |
+ 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]}'; |
}); |
} |
@@ -260,19 +287,19 @@ void checkElements( |
checkElementOutputUnits(compiler1, compiler2, element1, element2); |
} |
-void checkMixinUses(Compiler compiler1, Compiler compiler2, ClassElement class1, |
- ClassElement class2, |
+void checkMixinUses(ClosedWorld closedWorld1, ClosedWorld closedWorld2, |
+ ClassElement class1, ClassElement class2, |
{bool verbose: false}) { |
- checkSets( |
- compiler1.closedWorld.mixinUsesOf(class1), |
- compiler2.closedWorld.mixinUsesOf(class2), |
- "Mixin uses of $class1 vs $class2", |
- areElementsEquivalent, |
+ checkSets(closedWorld1.mixinUsesOf(class1), closedWorld2.mixinUsesOf(class2), |
+ "Mixin uses of $class1 vs $class2", areElementsEquivalent, |
verbose: verbose); |
} |
-void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2, |
- ClassHierarchyNode node1, ClassHierarchyNode node2, |
+void checkClassHierarchyNodes( |
+ ClosedWorld closedWorld1, |
+ ClosedWorld closedWorld2, |
+ ClassHierarchyNode node1, |
+ ClassHierarchyNode node2, |
{bool verbose: false}) { |
if (verbose) { |
print('Checking $node1 vs $node2'); |
@@ -295,7 +322,7 @@ void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2, |
bool found = false; |
for (ClassHierarchyNode other in node2.directSubclasses) { |
if (areElementsEquivalent(child.cls, other.cls)) { |
- checkClassHierarchyNodes(compiler1, compiler2, child, other, |
+ checkClassHierarchyNodes(closedWorld1, closedWorld2, child, other, |
verbose: verbose); |
found = true; |
break; |
@@ -305,10 +332,10 @@ void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2, |
if (child.isInstantiated) { |
print('Missing subclass ${child.cls} of ${node1.cls} ' |
'in ${node2.directSubclasses}'); |
- print(compiler1.closedWorld |
- .dump(verbose ? compiler1.coreClasses.objectClass : node1.cls)); |
- print(compiler2.closedWorld |
- .dump(verbose ? compiler2.coreClasses.objectClass : node2.cls)); |
+ print(closedWorld1 |
+ .dump(verbose ? closedWorld1.coreClasses.objectClass : node1.cls)); |
+ print(closedWorld2 |
+ .dump(verbose ? closedWorld2.coreClasses.objectClass : node2.cls)); |
} |
Expect.isFalse( |
child.isInstantiated, |
@@ -316,7 +343,8 @@ void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2, |
'${node2.directSubclasses}'); |
} |
} |
- checkMixinUses(compiler1, compiler2, node1.cls, node2.cls, verbose: verbose); |
+ checkMixinUses(closedWorld1, closedWorld2, node1.cls, node2.cls, |
+ verbose: verbose); |
} |
bool areLocalsEquivalent(Local a, Local b) { |