Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: tests/compiler/dart2js/kernel/closed_world2_test.dart

Issue 2879593004: Reorganize equivalence test helpers (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // Partial test that the closed world computed from [WorldImpact]s derived from 5 // Partial test that the closed world computed from [WorldImpact]s derived from
6 // kernel is equivalent to the original computed from resolution. 6 // kernel is equivalent to the original computed from resolution.
7 library dart2js.kernel.closed_world2_test; 7 library dart2js.kernel.closed_world2_test;
8 8
9 import 'dart:async'; 9 import 'dart:async';
10 10
11 import 'package:async_helper/async_helper.dart'; 11 import 'package:async_helper/async_helper.dart';
12 import 'package:compiler/src/commandline_options.dart'; 12 import 'package:compiler/src/commandline_options.dart';
13 import 'package:compiler/src/common.dart'; 13 import 'package:compiler/src/common.dart';
14 import 'package:compiler/src/common_elements.dart'; 14 import 'package:compiler/src/common_elements.dart';
15 import 'package:compiler/src/common/backend_api.dart';
16 import 'package:compiler/src/common/tasks.dart';
17 import 'package:compiler/src/compiler.dart'; 15 import 'package:compiler/src/compiler.dart';
18 import 'package:compiler/src/deferred_load.dart';
19 import 'package:compiler/src/elements/entities.dart';
20 import 'package:compiler/src/elements/resolution_types.dart'; 16 import 'package:compiler/src/elements/resolution_types.dart';
21 import 'package:compiler/src/elements/types.dart'; 17 import 'package:compiler/src/elements/types.dart';
22 import 'package:compiler/src/enqueue.dart'; 18 import 'package:compiler/src/enqueue.dart';
23 import 'package:compiler/src/js_backend/backend.dart'
24 hide RuntimeTypesNeedBuilderImpl;
25 import 'package:compiler/src/js_backend/backend_impact.dart';
26 import 'package:compiler/src/js_backend/backend_usage.dart'; 19 import 'package:compiler/src/js_backend/backend_usage.dart';
27 import 'package:compiler/src/js_backend/custom_elements_analysis.dart';
28 import 'package:compiler/src/js_backend/native_data.dart';
29 import 'package:compiler/src/js_backend/impact_transformer.dart';
30 import 'package:compiler/src/js_backend/interceptor_data.dart';
31 import 'package:compiler/src/js_backend/lookup_map_analysis.dart';
32 import 'package:compiler/src/js_backend/mirrors_analysis.dart'
33 hide MirrorsResolutionAnalysisImpl;
34 import 'package:compiler/src/js_backend/mirrors_data.dart';
35 import 'package:compiler/src/js_backend/no_such_method_registry.dart';
36 import 'package:compiler/src/js_backend/resolution_listener.dart';
37 import 'package:compiler/src/js_backend/type_variable_handler.dart';
38 import 'package:compiler/src/native/enqueue.dart';
39 import 'package:compiler/src/native/resolver.dart';
40 import 'package:compiler/src/kernel/element_map_impl.dart'; 20 import 'package:compiler/src/kernel/element_map_impl.dart';
41 import 'package:compiler/src/kernel/kernel_strategy.dart'; 21 import 'package:compiler/src/kernel/kernel_strategy.dart';
42 import 'package:compiler/src/library_loader.dart'; 22 import 'package:compiler/src/serialization/equivalence.dart';
43 import 'package:compiler/src/options.dart';
44 import 'package:compiler/src/universe/world_builder.dart'; 23 import 'package:compiler/src/universe/world_builder.dart';
45 import 'package:compiler/src/util/util.dart'; 24 import 'package:compiler/src/util/util.dart';
46 import 'package:compiler/src/world.dart'; 25 import 'package:compiler/src/world.dart';
47 import 'package:expect/expect.dart'; 26 import 'package:expect/expect.dart';
48 import 'package:kernel/ast.dart' as ir;
49 import '../memory_compiler.dart'; 27 import '../memory_compiler.dart';
50 import '../serialization/helper.dart'; 28 import '../serialization/helper.dart';
51 import '../serialization/model_test_helper.dart'; 29 import '../equivalence/check_functions.dart';
52 import '../serialization/test_helper.dart';
53
54 import 'closed_world_test.dart' hide KernelWorkItemBuilder;
55 import 'compiler_helper.dart'; 30 import 'compiler_helper.dart';
56 import 'impact_test.dart'; 31 import 'test_helpers.dart';
57 32
58 const SOURCE = const { 33 const SOURCE = const {
59 'main.dart': ''' 34 'main.dart': '''
60 import 'dart:html'; 35 import 'dart:html';
61 import 'dart:typed_data'; 36 import 'dart:typed_data';
62 import 'package:expect/expect.dart'; 37 import 'package:expect/expect.dart';
63 38
64 class ClassWithSetter { 39 class ClassWithSetter {
65 void set setter(_) {} 40 void set setter(_) {}
66 } 41 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 Compiler compiler = compilers.a; 125 Compiler compiler = compilers.a;
151 compiler.resolutionWorldBuilder.closeWorld(); 126 compiler.resolutionWorldBuilder.closeWorld();
152 ElementEnvironment environment1 = compiler.elementEnvironment; 127 ElementEnvironment environment1 = compiler.elementEnvironment;
153 128
154 Compiler compiler2 = compilers.b; 129 Compiler compiler2 = compilers.b;
155 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; 130 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy;
156 KernelToElementMapImpl elementMap = frontEndStrategy.elementMap; 131 KernelToElementMapImpl elementMap = frontEndStrategy.elementMap;
157 Expect.isFalse(compiler2.compilationFailed); 132 Expect.isFalse(compiler2.compilationFailed);
158 133
159 KernelEquivalence equivalence = new KernelEquivalence(elementMap); 134 KernelEquivalence equivalence = new KernelEquivalence(elementMap);
135 TestStrategy strategy = equivalence.defaultStrategy;
160 136
161 ElementEnvironment environment2 = compiler2.elementEnvironment; 137 ElementEnvironment environment2 = compiler2.elementEnvironment;
162 checkElementEnvironment(environment1, environment2, equivalence); 138 checkElementEnvironment(environment1, environment2, strategy);
163 139
164 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; 140 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution;
165 BackendUsage backendUsage2 = compiler2.backend.backendUsage; 141 BackendUsage backendUsage2 = compiler2.backend.backendUsage;
166 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); 142 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld();
167 143
168 checkNativeClasses(compiler1, compiler2, equivalence); 144 checkNativeClasses(compiler1, compiler2, strategy);
169 145
170 checkBackendUsage(backendUsage1, backendUsage2, equivalence); 146 checkBackendUsage(backendUsage1, backendUsage2, strategy);
171 147
172 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, 148 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2,
173 elementEquivalence: equivalence.entityEquivalence, 149 elementEquivalence: equivalence.entityEquivalence,
174 typeEquivalence: (ResolutionDartType a, DartType b) { 150 typeEquivalence: (ResolutionDartType a, DartType b) {
175 return equivalence.typeEquivalence(unalias(a), b); 151 return equivalence.typeEquivalence(unalias(a), b);
176 }, elementFilter: elementFilter, verbose: arguments.verbose); 152 }, elementFilter: elementFilter, verbose: arguments.verbose);
177 153
178 checkClosedWorlds(closedWorld1, closedWorld2, 154 checkClosedWorlds(closedWorld1, closedWorld2,
179 strategy: equivalence.defaultStrategy, verbose: arguments.verbose); 155 strategy: equivalence.defaultStrategy, verbose: arguments.verbose);
180 156
181 return ResultKind.success; 157 return ResultKind.success;
182 } 158 }
183
184 void checkNativeClasses(
Johnni Winther 2017/05/15 07:43:03 These were changed to used [TestStrategy] instead
185 Compiler compiler1, Compiler compiler2, KernelEquivalence equivalence) {
186 Iterable<ClassEntity> nativeClasses1 = compiler1
187 .backend.nativeResolutionEnqueuerForTesting.nativeClassesForTesting;
188 Iterable<ClassEntity> nativeClasses2 = compiler2
189 .backend.nativeResolutionEnqueuerForTesting.nativeClassesForTesting;
190
191 checkSetEquivalence(compiler1, compiler2, 'nativeClasses', nativeClasses1,
192 nativeClasses2, equivalence.entityEquivalence);
193
194 Iterable<ClassEntity> registeredClasses1 = compiler1
195 .backend.nativeResolutionEnqueuerForTesting.registeredClassesForTesting;
196 Iterable<ClassEntity> registeredClasses2 = compiler2
197 .backend.nativeResolutionEnqueuerForTesting.registeredClassesForTesting;
198
199 checkSetEquivalence(compiler1, compiler2, 'registeredClasses',
200 registeredClasses1, registeredClasses2, equivalence.entityEquivalence);
201 }
202
203 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2,
204 KernelEquivalence equivalence) {
205 checkMapEquivalence(
206 data1,
207 data2,
208 'nativeClassTagInfo',
209 data1.nativeClassTagInfo,
210 data2.nativeClassTagInfo,
211 equivalence.entityEquivalence,
212 (a, b) => a == b);
213 // TODO(johnniwinther): Check the remaining properties.
214 }
215
216 void checkBackendUsage(BackendUsageImpl usage1, BackendUsageImpl usage2,
217 KernelEquivalence equivalence) {
218 checkSetEquivalence(
219 usage1,
220 usage2,
221 'globalClassDependencies',
222 usage1.globalClassDependencies,
223 usage2.globalClassDependencies,
224 equivalence.entityEquivalence);
225 checkSetEquivalence(
226 usage1,
227 usage2,
228 'globalFunctionDependencies',
229 usage1.globalFunctionDependencies,
230 usage2.globalFunctionDependencies,
231 equivalence.entityEquivalence);
232 checkSetEquivalence(
233 usage1,
234 usage2,
235 'helperClassesUsed',
236 usage1.helperClassesUsed,
237 usage2.helperClassesUsed,
238 equivalence.entityEquivalence);
239 checkSetEquivalence(
240 usage1,
241 usage2,
242 'helperFunctionsUsed',
243 usage1.helperFunctionsUsed,
244 usage2.helperFunctionsUsed,
245 equivalence.entityEquivalence);
246 check(
247 usage1,
248 usage2,
249 'needToInitializeIsolateAffinityTag',
250 usage1.needToInitializeIsolateAffinityTag,
251 usage2.needToInitializeIsolateAffinityTag);
252 check(
253 usage1,
254 usage2,
255 'needToInitializeDispatchProperty',
256 usage1.needToInitializeDispatchProperty,
257 usage2.needToInitializeDispatchProperty);
258 check(usage1, usage2, 'requiresPreamble', usage1.requiresPreamble,
259 usage2.requiresPreamble);
260 check(usage1, usage2, 'isInvokeOnUsed', usage1.isInvokeOnUsed,
261 usage2.isInvokeOnUsed);
262 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed,
263 usage2.isRuntimeTypeUsed);
264 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse,
265 usage2.isIsolateInUse);
266 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed,
267 usage2.isFunctionApplyUsed);
268 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed,
269 usage2.isNoSuchMethodUsed);
270 }
271
272 checkElementEnvironment(ElementEnvironment env1, ElementEnvironment env2,
273 KernelEquivalence equivalence) {
274 checkMembers(MemberEntity member1, MemberEntity member2) {
275 Expect.equals(env1.isDeferredLoadLibraryGetter(member1),
276 env2.isDeferredLoadLibraryGetter(member2));
277
278 checkListEquivalence(
279 member1,
280 member2,
281 'metadata',
282 env1.getMemberMetadata(member1),
283 env2.getMemberMetadata(member2),
284 equivalence.defaultStrategy.testConstantValues);
285 }
286
287 checkSetEquivalence(env1, env2, 'libraries', env1.libraries, env2.libraries,
288 equivalence.entityEquivalence,
289 onSameElement: (LibraryEntity lib1, LibraryEntity lib2) {
290 Expect.identical(lib1, env1.lookupLibrary(lib1.canonicalUri));
291 Expect.identical(lib2, env2.lookupLibrary(lib2.canonicalUri));
292
293 List<ClassEntity> classes2 = <ClassEntity>[];
294 env1.forEachClass(lib1, (ClassEntity cls1) {
295 Expect.identical(cls1, env1.lookupClass(lib1, cls1.name));
296
297 String className = cls1.name;
298 ClassEntity cls2 = env2.lookupClass(lib2, className);
299 Expect.isNotNull(cls2, 'Missing class $className in $lib2');
300 Expect.identical(cls2, env2.lookupClass(lib2, cls2.name));
301
302 check(lib1, lib2, 'class:${className}', cls1, cls2,
303 equivalence.entityEquivalence);
304
305 Expect.equals(env1.isGenericClass(cls1), env2.isGenericClass(cls2));
306
307 check(
308 cls1,
309 cls2,
310 'superclass',
311 env1.getSuperClass(cls1, skipUnnamedMixinApplications: false),
312 env2.getSuperClass(cls2, skipUnnamedMixinApplications: false),
313 equivalence.entityEquivalence);
314 check(
315 cls1,
316 cls2,
317 'superclass',
318 env1.getSuperClass(cls1, skipUnnamedMixinApplications: true),
319 env2.getSuperClass(cls2, skipUnnamedMixinApplications: true),
320 equivalence.entityEquivalence);
321
322 List<InterfaceType> supertypes1 = <InterfaceType>[];
323 env1.forEachSupertype(cls1, supertypes1.add);
324 List<InterfaceType> supertypes2 = <InterfaceType>[];
325 env2.forEachSupertype(cls2, supertypes1.add);
326 equivalence.defaultStrategy
327 .testTypeLists(cls1, cls2, 'supertypes', supertypes1, supertypes2);
328
329 List<ClassEntity> mixins1 = <ClassEntity>[];
330 env1.forEachMixin(cls1, mixins1.add);
331 List<ClassEntity> mixins2 = <ClassEntity>[];
332 env2.forEachMixin(cls2, mixins2.add);
333 equivalence.defaultStrategy.testLists(cls1, cls2, 'mixins', mixins1,
334 mixins2, equivalence.entityEquivalence);
335
336 Map<MemberEntity, ClassEntity> members1 = <MemberEntity, ClassEntity>{};
337 Map<MemberEntity, ClassEntity> members2 = <MemberEntity, ClassEntity>{};
338 env1.forEachClassMember(cls1,
339 (ClassEntity declarer1, MemberEntity member1) {
340 if (cls1 == declarer1) {
341 Expect.identical(
342 member1,
343 env1.lookupClassMember(cls1, member1.name,
344 setter: member1.isSetter));
345 }
346 members1[member1] = declarer1;
347 });
348 env2.forEachClassMember(cls2,
349 (ClassEntity declarer2, MemberEntity member2) {
350 if (cls2 == declarer2) {
351 Expect.identical(
352 member2,
353 env2.lookupClassMember(cls2, member2.name,
354 setter: member2.isSetter));
355 }
356 members2[member2] = declarer2;
357 });
358 checkMapEquivalence(cls1, cls2, 'members', members1, members2, (a, b) {
359 bool result = equivalence.entityEquivalence(a, b);
360 if (result) checkMembers(a, b);
361 return result;
362 }, equivalence.entityEquivalence);
363
364 classes2.add(cls2);
365 });
366 env2.forEachClass(lib2, (ClassEntity cls2) {
367 Expect.isTrue(classes2.contains(cls2), "Extra class $cls2 in $lib2");
368 });
369 });
370 // TODO(johnniwinther): Test the remaining properties of [ElementEnvironment].
371 }
OLDNEW
« no previous file with comments | « tests/compiler/dart2js/equivalence/check_helpers.dart ('k') | tests/compiler/dart2js/kernel/closed_world_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698