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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart

Issue 22849007: Enable unique global renaming in dart2dart minification. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of dart_backend; 5 part of dart_backend;
6 6
7 Function get _compareNodes => 7 Function get _compareNodes =>
8 compareBy((n) => n.getBeginToken().charOffset); 8 compareBy((n) => n.getBeginToken().charOffset);
9 9
10 typedef String _Renamer(Renamable renamable); 10 typedef String _Renamer(Renamable renamable);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 60
61 /** 61 /**
62 * Renames only top-level elements that would let to ambiguity if not renamed. 62 * Renames only top-level elements that would let to ambiguity if not renamed.
63 */ 63 */
64 void renamePlaceholders( 64 void renamePlaceholders(
65 Compiler compiler, 65 Compiler compiler,
66 PlaceholderCollector placeholderCollector, 66 PlaceholderCollector placeholderCollector,
67 Map<Node, String> renames, 67 Map<Node, String> renames,
68 Map<LibraryElement, String> imports, 68 Map<LibraryElement, String> imports,
69 Set<String> fixedMemberNames, 69 Set<String> fixedMemberNames,
70 bool cutDeclarationTypes) { 70 bool cutDeclarationTypes,
71 {uniqueGlobalNaming: false}) {
71 final Map<LibraryElement, Map<String, String>> renamed 72 final Map<LibraryElement, Map<String, String>> renamed
72 = new Map<LibraryElement, Map<String, String>>(); 73 = new Map<LibraryElement, Map<String, String>>();
73 74
74 renameNodes(Iterable<Node> nodes, renamer) { 75 renameNodes(Iterable<Node> nodes, renamer) {
75 for (Node node in sorted(nodes, _compareNodes)) { 76 for (Node node in sorted(nodes, _compareNodes)) {
76 renames[node] = renamer(node); 77 renames[node] = renamer(node);
77 } 78 }
78 } 79 }
79 80
80 sortedForEach(Map<Element, dynamic> map, f) { 81 sortedForEach(Map<Element, dynamic> map, f) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); 172 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']);
172 forbiddenIdentifiers.addAll(Keyword.keywords.keys); 173 forbiddenIdentifiers.addAll(Keyword.keywords.keys);
173 forbiddenIdentifiers.addAll(fixedMemberNames); 174 forbiddenIdentifiers.addAll(fixedMemberNames);
174 generateUniqueName = (_) => 175 generateUniqueName = (_) =>
175 generator.generate((name) => 176 generator.generate((name) =>
176 forbiddenIdentifiers.contains(name) 177 forbiddenIdentifiers.contains(name)
177 || allNamedParameterIdentifiers.contains(name)); 178 || allNamedParameterIdentifiers.contains(name));
178 rename = makeRenamer(generateUniqueName); 179 rename = makeRenamer(generateUniqueName);
179 renameElement = makeElementRenamer(rename, generateUniqueName); 180 renameElement = makeElementRenamer(rename, generateUniqueName);
180 181
181 // Build a sorted (by usage) list of local nodes that will be renamed to 182 List<Set<Node>> allLocals = new List<Set<Node>>();
182 // the same identifier. So the top-used local variables in all functions 183 // If we are using the mirror_helper library we need all names to be
183 // will be renamed first and will all share the same new identifier. 184 // globally unique.
184 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); 185 if(uniqueGlobalNaming) {
ahe 2013/08/16 18:39:26 Missing space after if.
zarah 2013/08/28 10:19:29 Done.
185 for (var functionScope in placeholderCollector.functionScopes.values) { 186 for (var functionScope in placeholderCollector.functionScopes.values) {
186 // Add current sorted local identifiers to the whole sorted list 187 functionScope.localPlaceholders.forEach(
187 // of all local identifiers for all functions. 188 (ph) => allLocals.add(new Set<Node>()..addAll(ph.nodes)));
ahe 2013/08/16 18:39:26 ph.nodes.toSet()?
zarah 2013/08/28 10:19:29 Done.
188 List<LocalPlaceholder> currentSortedPlaceholders =
189 sorted(functionScope.localPlaceholders,
190 compareBy((LocalPlaceholder ph) => -ph.nodes.length));
191 List<Set<Node>> currentSortedNodes =
192 currentSortedPlaceholders.map((ph) => ph.nodes).toList();
193 // Make room in all sorted locals list for new stuff.
194 while (currentSortedNodes.length > allSortedLocals.length) {
195 allSortedLocals.add(new Set<Node>());
196 } 189 }
197 for (int i = 0; i < currentSortedNodes.length; i++) { 190 } else {
198 allSortedLocals[i].addAll(currentSortedNodes[i]); 191 // Build a sorted (by usage) list of local nodes that will be renamed to
192 // the same identifier. So the top-used local variables in all functions
193 // will be renamed first and will all share the same new identifier.
194 for (var functionScope in placeholderCollector.functionScopes.values) {
195 // Add current sorted local identifiers to the whole sorted list
196 // of all local identifiers for all functions.
197 List<LocalPlaceholder> currentSortedPlaceholders =
198 sorted(functionScope.localPlaceholders,
199 compareBy((LocalPlaceholder ph) => -ph.nodes.length));
200 List<Set<Node>> currentSortedNodes =
201 currentSortedPlaceholders.map((ph) => ph.nodes).toList();
202 // Make room in all sorted locals list for new stuff.
203 while (currentSortedNodes.length > allLocals.length) {
204 allLocals.add(new Set<Node>());
205 }
206 for (int i = 0; i < currentSortedNodes.length; i++) {
207 allLocals[i].addAll(currentSortedNodes[i]);
208 }
199 } 209 }
200 } 210 }
201 211
202 // Rename elements, members and locals together based on their usage count, 212 // Rename elements, members and locals together based on their usage count,
203 // otherwise when we rename elements first there will be no good identifiers 213 // otherwise when we rename elements first there will be no good identifiers
204 // left for members even if they are used often. 214 // left for members even if they are used often.
205 String elementRenamer(ElementRenamable elementRenamable) => 215 String elementRenamer(ElementRenamable elementRenamable) =>
206 renameElement(elementRenamable.element); 216 renameElement(elementRenamable.element);
207 String memberRenamer(MemberRenamable memberRenamable) => 217 String memberRenamer(MemberRenamable memberRenamable) =>
208 generator.generate(forbiddenIdentifiers.contains); 218 generator.generate(forbiddenIdentifiers.contains);
209 Function localRenamer = generateUniqueName; 219 Function localRenamer = generateUniqueName;
210 List<Renamable> renamables = []; 220 List<Renamable> renamables = [];
211 placeholderCollector.elementNodes.forEach( 221 placeholderCollector.elementNodes.forEach(
212 (Element element, Set<Node> nodes) { 222 (Element element, Set<Node> nodes) {
213 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); 223 renamables.add(new ElementRenamable(element, nodes, elementRenamer));
214 }); 224 });
215 placeholderCollector.memberPlaceholders.forEach( 225 placeholderCollector.memberPlaceholders.forEach(
216 (String memberName, Set<Identifier> identifiers) { 226 (String memberName, Set<Identifier> identifiers) {
217 renamables.add( 227 renamables.add(
218 new MemberRenamable(memberName, identifiers, memberRenamer)); 228 new MemberRenamable(memberName, identifiers, memberRenamer));
219 }); 229 });
220 for (Set<Node> localIdentifiers in allSortedLocals) { 230 for (Set<Node> localIdentifiers in allLocals) {
221 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); 231 renamables.add(new LocalRenamable(localIdentifiers, localRenamer));
222 } 232 }
223 renamables.sort((Renamable renamable1, Renamable renamable2) => 233 renamables.sort((Renamable renamable1, Renamable renamable2) =>
224 renamable1.compareTo(renamable2)); 234 renamable1.compareTo(renamable2));
225 for (Renamable renamable in renamables) { 235 for (Renamable renamable in renamables) {
226 String newName = renamable.rename(); 236 String newName = renamable.rename();
227 renameNodes(renamable.nodes, (_) => newName); 237 renameNodes(renamable.nodes, (_) => newName);
228 } 238 }
229 } else { 239 } else {
230 // Never rename anything to 'main'. 240 // Never rename anything to 'main'.
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 index ~/= firstCharAlphabet.length; 357 index ~/= firstCharAlphabet.length;
348 int length = otherCharsAlphabet.length; 358 int length = otherCharsAlphabet.length;
349 while (index >= length) { 359 while (index >= length) {
350 resultBuilder.write(otherCharsAlphabet[index % length]); 360 resultBuilder.write(otherCharsAlphabet[index % length]);
351 index ~/= length; 361 index ~/= length;
352 } 362 }
353 resultBuilder.write(otherCharsAlphabet[index]); 363 resultBuilder.write(otherCharsAlphabet[index]);
354 return resultBuilder.toString(); 364 return resultBuilder.toString();
355 } 365 }
356 } 366 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698