Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Assigns JavaScript identifiers to Dart variables, class-names and members. | 8 * Assigns JavaScript identifiers to Dart variables, class-names and members. |
| 9 */ | 9 */ |
| 10 class Namer { | 10 class Namer { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 /** | 23 /** |
| 24 * Map from top-level or static elements to their unique identifiers provided | 24 * Map from top-level or static elements to their unique identifiers provided |
| 25 * by [getName]. | 25 * by [getName]. |
| 26 * | 26 * |
| 27 * Invariant: Keys must be declaration elements. | 27 * Invariant: Keys must be declaration elements. |
| 28 */ | 28 */ |
| 29 final Map<Element, String> globals; | 29 final Map<Element, String> globals; |
| 30 final Map<String, int> usedGlobals; | 30 final Map<String, int> usedGlobals; |
| 31 final Map<String, LibraryElement> shortPrivateNameOwners; | 31 final Map<String, LibraryElement> shortPrivateNameOwners; |
| 32 | 32 |
| 33 /// A cache of names used for bailout methods. We make sure two | |
|
karlklose
2012/11/16 09:31:17
I think you should /**...*/ here.
ngeoffray
2012/11/16 10:37:56
Done.
| |
| 34 /// bailout methods cannot have the same name because if one is | |
|
karlklose
2012/11/16 09:31:17
I find "because if one is defined in a class that
ngeoffray
2012/11/16 10:37:56
Done.
| |
| 35 /// defined in a class that is a subclass of the other, we would | |
| 36 /// resolve to the wrong bailout method at runtime. To make it | |
| 37 /// simple, we don't keep track of inheritance and always avoid | |
| 38 /// similar names. | |
| 39 final Set<String> usedBailoutNames; | |
| 40 final Map<Element, String> bailoutNames; | |
| 41 | |
| 33 final Map<Constant, String> constantNames; | 42 final Map<Constant, String> constantNames; |
| 34 | 43 |
| 35 Namer(this.compiler) | 44 Namer(this.compiler) |
| 36 : globals = new Map<Element, String>(), | 45 : globals = new Map<Element, String>(), |
| 37 usedGlobals = new Map<String, int>(), | 46 usedGlobals = new Map<String, int>(), |
| 38 shortPrivateNameOwners = new Map<String, LibraryElement>(), | 47 shortPrivateNameOwners = new Map<String, LibraryElement>(), |
| 48 bailoutNames = new Map<Element, String>(), | |
| 49 usedBailoutNames = new Set<String>(), | |
| 39 constantNames = new Map<Constant, String>(); | 50 constantNames = new Map<Constant, String>(); |
| 40 | 51 |
| 41 final String CURRENT_ISOLATE = r'$'; | 52 final String CURRENT_ISOLATE = r'$'; |
| 42 final String ISOLATE = 'Isolate'; | 53 final String ISOLATE = 'Isolate'; |
| 43 final String ISOLATE_PROPERTIES = r"$isolateProperties"; | 54 final String ISOLATE_PROPERTIES = r"$isolateProperties"; |
| 44 /** Some closures must contain their name. The name is stored in | 55 /** Some closures must contain their name. The name is stored in |
| 45 * [STATIC_CLOSURE_NAME_NAME]. */ | 56 * [STATIC_CLOSURE_NAME_NAME]. */ |
|
karlklose
2012/11/16 09:31:17
Not your change, but break before "*/".
ngeoffray
2012/11/16 10:37:56
Done.
| |
| 46 final String STATIC_CLOSURE_NAME_NAME = r'$name'; | 57 final String STATIC_CLOSURE_NAME_NAME = r'$name'; |
| 47 static const SourceString CLOSURE_INVOCATION_NAME = | 58 static const SourceString CLOSURE_INVOCATION_NAME = |
| 48 Compiler.CALL_OPERATOR_NAME; | 59 Compiler.CALL_OPERATOR_NAME; |
| 49 | 60 |
| 50 String constantName(Constant constant) { | 61 String constantName(Constant constant) { |
| 51 // In the current implementation it doesn't make sense to give names to | 62 // In the current implementation it doesn't make sense to give names to |
| 52 // function constants since the function-implementation itself serves as | 63 // function constants since the function-implementation itself serves as |
| 53 // constant and can be accessed directly. | 64 // constant and can be accessed directly. |
| 54 assert(!constant.isFunction()); | 65 assert(!constant.isFunction()); |
| 55 String result = constantNames[constant]; | 66 String result = constantNames[constant]; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 230 } else if (identical(element.kind, ElementKind.LIBRARY)) { | 241 } else if (identical(element.kind, ElementKind.LIBRARY)) { |
| 231 name = LIBRARY_PREFIX; | 242 name = LIBRARY_PREFIX; |
| 232 } else { | 243 } else { |
| 233 name = element.name.slowToString(); | 244 name = element.name.slowToString(); |
| 234 } | 245 } |
| 235 // Prefix the name with '$' if it is reserved. | 246 // Prefix the name with '$' if it is reserved. |
| 236 return safeName(name); | 247 return safeName(name); |
| 237 } | 248 } |
| 238 | 249 |
| 239 String getBailoutName(Element element) { | 250 String getBailoutName(Element element) { |
| 240 return '${getName(element)}\$bailout'; | 251 String name = bailoutNames[element]; |
| 252 if (name != null) return name; | |
| 253 String candidate = '${getName(element)}\$bailout'; | |
| 254 name = candidate; | |
| 255 int i = 0; | |
| 256 while (usedBailoutNames.contains(name)) name = '$candidate${i++}'; | |
|
karlklose
2012/11/16 09:31:17
Should we have a UniqueElementNameGenerator abstra
| |
| 257 bailoutNames[element] = name; | |
| 258 usedBailoutNames.add(name); | |
| 259 return name; | |
| 241 } | 260 } |
| 242 | 261 |
| 243 /** | 262 /** |
| 244 * Returns a preferred JS-id for the given element. The returned id is | 263 * Returns a preferred JS-id for the given element. The returned id is |
| 245 * guaranteed to be a valid JS-id. Globals and static fields are furthermore | 264 * guaranteed to be a valid JS-id. Globals and static fields are furthermore |
| 246 * guaranteed to be unique. | 265 * guaranteed to be unique. |
| 247 * | 266 * |
| 248 * For accessing statics consider calling | 267 * For accessing statics consider calling |
| 249 * [isolateAccess]/[isolateBailoutAccess] or [isolatePropertyAccess] instead. | 268 * [isolateAccess]/[isolateBailoutAccess] or [isolatePropertyAccess] instead. |
| 250 */ | 269 */ |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 } | 345 } |
| 327 | 346 |
| 328 String safeName(String name) { | 347 String safeName(String name) { |
| 329 if (jsReserved.contains(name) || name.startsWith('\$')) { | 348 if (jsReserved.contains(name) || name.startsWith('\$')) { |
| 330 name = "\$$name"; | 349 name = "\$$name"; |
| 331 assert(!jsReserved.contains(name)); | 350 assert(!jsReserved.contains(name)); |
| 332 } | 351 } |
| 333 return name; | 352 return name; |
| 334 } | 353 } |
| 335 } | 354 } |
| OLD | NEW |