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

Side by Side Diff: dart/tests/try/poi/forget_element_test.dart

Issue 619923004: Forget closure class maps. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 // Test of Compiler.forgetElement. 5 // Test of Compiler.forgetElement.
6 library trydart.forget_element_test; 6 library trydart.forget_element_test;
7 7
8 import 'package:compiler/implementation/elements/elements.dart' show 8 import 'package:compiler/implementation/elements/elements.dart' show
9 AstElement, 9 AstElement,
10 Element, 10 Element,
(...skipping 26 matching lines...) Expand all
37 final int expectedClosureCount; 37 final int expectedClosureCount;
38 38
39 final int expectedMetadataCount; 39 final int expectedMetadataCount;
40 40
41 final int expectedConstantCount; 41 final int expectedConstantCount;
42 42
43 final int expectedInitialValueCount; 43 final int expectedInitialValueCount;
44 44
45 final int expectedInitialDartValueCount; 45 final int expectedInitialDartValueCount;
46 46
47 final int additionalClosureClassMaps;
48
47 ForgetElementTestCase( 49 ForgetElementTestCase(
48 String source, 50 String source,
49 {int closureCount: 0, 51 {int closureCount: 0,
50 int metadataCount: 0, 52 int metadataCount: 0,
51 int constantCount: 0, 53 int constantCount: 0,
52 int initialValueCount: 0, 54 int initialValueCount: 0,
53 int initialDartValueCount: null}) 55 int initialDartValueCount: null,
56 this.additionalClosureClassMaps: 0})
54 : this.expectedClosureCount = closureCount, 57 : this.expectedClosureCount = closureCount,
55 this.expectedMetadataCount = metadataCount, 58 this.expectedMetadataCount = metadataCount,
56 this.expectedConstantCount = constantCount, 59 this.expectedConstantCount = constantCount,
57 this.expectedInitialValueCount = initialValueCount, 60 this.expectedInitialValueCount = initialValueCount,
58 // Sometimes these numbers aren't the same. Appears to happen with 61 // Sometimes these numbers aren't the same. Appears to happen with
59 // non-const fields, because those aren't compile-time constants in the 62 // non-const fields, because those aren't compile-time constants in the
60 // strict language specification sense. 63 // strict language specification sense.
61 this.expectedInitialDartValueCount = (initialDartValueCount == null) 64 this.expectedInitialDartValueCount = (initialDartValueCount == null)
62 ? initialValueCount : initialDartValueCount, 65 ? initialValueCount : initialDartValueCount,
63 super(source); 66 super(source);
(...skipping 22 matching lines...) Expand all
86 // values. 89 // values.
87 Expect.equals( 90 Expect.equals(
88 expectedInitialValueCount, 91 expectedInitialValueCount,
89 elementsWithJsInitialValuesIn(library).length, 92 elementsWithJsInitialValuesIn(library).length,
90 'number of fields with initial values (JS)'); 93 'number of fields with initial values (JS)');
91 Expect.equals( 94 Expect.equals(
92 expectedInitialDartValueCount, 95 expectedInitialDartValueCount,
93 elementsWithDartInitialValuesIn(library).length, 96 elementsWithDartInitialValuesIn(library).length,
94 'number of fields with initial values (Dart)'); 97 'number of fields with initial values (Dart)');
95 98
99 // Check that the compiler has recorded the expected number of closure
100 // class maps. There's always at least one, from main. Each top-level
101 // element also seems to induce one.
102 Expect.equals(
103 expectedClosureCount + additionalClosureClassMaps,
104 closureClassMapsIn(library).length - 1,
105 'closure class map count ${closureClassMapsIn(library)}');
106
107
96 // Forget about all elements. 108 // Forget about all elements.
97 library.forEachLocalMember(compiler.forgetElement); 109 library.forEachLocalMember(compiler.forgetElement);
98 110
99 // Check that all the closures were forgotten. 111 // Check that all the closures were forgotten.
100 Expect.isTrue(closuresInLibrary(library).isEmpty, 'closures'); 112 Expect.isTrue(closuresInLibrary(library).isEmpty, 'closures');
101 113
102 // Check that the metadata annotations were forgotten. 114 // Check that the metadata annotations were forgotten.
103 Expect.isTrue(metadataInLibrary(library).isEmpty, 'metadata'); 115 Expect.isTrue(metadataInLibrary(library).isEmpty, 'metadata');
104 116
105 // Check that the constants were forgotten. 117 // Check that the constants were forgotten.
106 Expect.isTrue(constantsIn(library).isEmpty, 'constants'); 118 Expect.isTrue(constantsIn(library).isEmpty, 'constants');
107 119
108 // Check that initial values were forgotten. 120 // Check that initial values were forgotten.
109 Expect.isTrue( 121 Expect.isTrue(
110 elementsWithJsInitialValuesIn(library).isEmpty, 122 elementsWithJsInitialValuesIn(library).isEmpty,
111 'fields with initial values (JS)'); 123 'fields with initial values (JS)');
112 Expect.isTrue( 124 Expect.isTrue(
113 elementsWithDartInitialValuesIn(library).isEmpty, 125 elementsWithDartInitialValuesIn(library).isEmpty,
114 'fields with initial values (Dart)'); 126 'fields with initial values (Dart)');
127
128 // Check that closure class maps were forgotten.
129 Expect.isTrue(closureClassMapsIn(library).isEmpty, 'closure class maps');
115 }); 130 });
116 131
117 Iterable closuresInLibrary(LibraryElement library) { 132 Iterable closuresInLibrary(LibraryElement library) {
118 return compiler.enqueuer.resolution.universe.allClosures.where( 133 return compiler.enqueuer.resolution.universe.allClosures.where(
119 (LocalFunctionElement closure) => closure.library == library); 134 (LocalFunctionElement closure) => closure.library == library);
120 } 135 }
121 136
122 Iterable metadataInLibrary(LibraryElement library) { 137 Iterable metadataInLibrary(LibraryElement library) {
123 JavaScriptBackend backend = compiler.backend; 138 JavaScriptBackend backend = compiler.backend;
124 return backend.constants.metadataConstantMap.keys.where( 139 return backend.constants.metadataConstantMap.keys.where(
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 } 179 }
165 180
166 Iterable elementsWithDartInitialValuesIn(LibraryElement library) { 181 Iterable elementsWithDartInitialValuesIn(LibraryElement library) {
167 JavaScriptBackend backend = compiler.backend; 182 JavaScriptBackend backend = compiler.backend;
168 DartConstantCompiler dartConstants = 183 DartConstantCompiler dartConstants =
169 backend.constantCompilerTask.dartConstantCompiler; 184 backend.constantCompilerTask.dartConstantCompiler;
170 return dartConstants.initialVariableValues.keys.where( 185 return dartConstants.initialVariableValues.keys.where(
171 (VariableElement element) => element.library == library); 186 (VariableElement element) => element.library == library);
172 } 187 }
173 188
189 Iterable closureClassMapsIn(LibraryElement library) {
190 Map cache = compiler.closureToClassMapper.closureMappingCache;
191 return nodesIn(library).where((node) => cache[node] != null);
192 }
174 } 193 }
175 194
176 class NodeCollector extends tree.Visitor { 195 class NodeCollector extends tree.Visitor {
177 final List<tree.Node> nodes = <tree.Node>[]; 196 final List<tree.Node> nodes = <tree.Node>[];
178 197
179 void visitNode(tree.Node node) { 198 void visitNode(tree.Node node) {
180 nodes.add(node); 199 nodes.add(node);
181 node.visitChildren(this); 200 node.visitChildren(this);
182 } 201 }
183 } 202 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 'main() => (() => (() => const Constant())())(); $CONSTANT_CLASS', 288 'main() => (() => (() => const Constant())())(); $CONSTANT_CLASS',
270 constantCount: 1, 289 constantCount: 1,
271 closureCount: 2), 290 closureCount: 2),
272 291
273 // Test that a constant in a top-level variable initializer is 292 // Test that a constant in a top-level variable initializer is
274 // discarded correctly. 293 // discarded correctly.
275 new ForgetElementTestCase( 294 new ForgetElementTestCase(
276 'main() => x; var x = const Constant(); $CONSTANT_CLASS', 295 'main() => x; var x = const Constant(); $CONSTANT_CLASS',
277 constantCount: 1, 296 constantCount: 1,
278 initialValueCount: 1, 297 initialValueCount: 1,
279 initialDartValueCount: 0), 298 initialDartValueCount: 0,
299 additionalClosureClassMaps: 1),
280 300
281 // Test that a constant in a parameter initializer is discarded 301 // Test that a constant in a parameter initializer is discarded
282 // correctly. 302 // correctly.
283 new ForgetElementTestCase( 303 new ForgetElementTestCase(
284 'main([x = const Constant()]) => x; $CONSTANT_CLASS', 304 'main([x = const Constant()]) => x; $CONSTANT_CLASS',
285 constantCount: 1, 305 constantCount: 1,
286 initialValueCount: 1), 306 initialValueCount: 1),
287 307
288 // Test that a constant in a parameter initializer is discarded 308 // Test that a constant in a parameter initializer is discarded
289 // correctly (nested function). 309 // correctly (nested function).
290 new ForgetElementTestCase( 310 new ForgetElementTestCase(
291 'main() => (([x = const Constant()]) => x)(); $CONSTANT_CLASS', 311 'main() => (([x = const Constant()]) => x)(); $CONSTANT_CLASS',
292 closureCount: 1, 312 closureCount: 1,
293 constantCount: 1, 313 constantCount: 1,
294 initialValueCount: 1), 314 initialValueCount: 1),
295 315
296 // Test that a constant in a parameter initializer is discarded 316 // Test that a constant in a parameter initializer is discarded
297 // correctly (deeply nested function). 317 // correctly (deeply nested function).
298 new ForgetElementTestCase( 318 new ForgetElementTestCase(
299 'main() => (() => (([x = const Constant()]) => x)())();' 319 'main() => (() => (([x = const Constant()]) => x)())();'
300 ' $CONSTANT_CLASS', 320 ' $CONSTANT_CLASS',
301 closureCount: 2, 321 closureCount: 2,
302 constantCount: 1, 322 constantCount: 1,
303 initialValueCount: 1), 323 initialValueCount: 1),
304 324
305 ]..addAll(assertUnimplementedLocalMetadata()); 325 ]..addAll(assertUnimplementedLocalMetadata());
OLDNEW
« no previous file with comments | « dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698