| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart._js_names; | 5 library dart._js_names; |
| 6 | 6 |
| 7 import 'dart:_js_embedded_names' | 7 import 'dart:_js_embedded_names' |
| 8 show JsGetName, MANGLED_GLOBAL_NAMES, MANGLED_NAMES; | 8 show JsGetName, MANGLED_GLOBAL_NAMES, MANGLED_NAMES; |
| 9 | 9 |
| 10 import 'dart:_foreign_helper' show JS, JS_EMBEDDED_GLOBAL, JS_GET_NAME; | 10 import 'dart:_foreign_helper' show JS, JS_EMBEDDED_GLOBAL, JS_GET_NAME; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 /// values are the "reflective" names. | 44 /// values are the "reflective" names. |
| 45 class _LazyMangledNamesMap { | 45 class _LazyMangledNamesMap { |
| 46 /// [_jsMangledNames] is a JavaScript object literal. | 46 /// [_jsMangledNames] is a JavaScript object literal. |
| 47 var _jsMangledNames; | 47 var _jsMangledNames; |
| 48 | 48 |
| 49 _LazyMangledNamesMap(this._jsMangledNames); | 49 _LazyMangledNamesMap(this._jsMangledNames); |
| 50 | 50 |
| 51 String operator [](String key) { | 51 String operator [](String key) { |
| 52 var result = JS('var', '#[#]', _jsMangledNames, key); | 52 var result = JS('var', '#[#]', _jsMangledNames, key); |
| 53 // Filter out all non-string values to protect against polution from | 53 // Filter out all non-string values to protect against polution from |
| 54 // anciliary fields in [_jsMangledNames]. | 54 // ancilliary fields in [_jsMangledNames]. |
| 55 bool filter = JS('bool', 'typeof # !== "string"', result); | 55 bool filter = JS('bool', 'typeof # !== "string"', result); |
| 56 // To ensure that the inferrer sees that result is a String, we explicitly | 56 // To ensure that the inferrer sees that result is a String, we explicitly |
| 57 // give it a better type here. | 57 // give it a better type here. |
| 58 return filter ? null : JS('String', '#', result); | 58 return filter ? null : JS('String', '#', result); |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 | 61 |
| 62 /// Extends [_LazyMangledNamesMap] with additional support for adding mappings | 62 /// Extends [_LazyMangledNamesMap] with additional support for adding mappings |
| 63 /// from mangled setter names to their reflective counterpart by rewriting a | 63 /// from mangled setter names to their reflective counterpart by rewriting a |
| 64 /// corresponding entry for a getter name, if it exists. | 64 /// corresponding entry for a getter name, if it exists. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 98 |
| 99 _LazyReflectiveNamesMap(this._jsMangledNames, this._isInstance); | 99 _LazyReflectiveNamesMap(this._jsMangledNames, this._isInstance); |
| 100 | 100 |
| 101 Map<String, String> _updateReflectiveNames() { | 101 Map<String, String> _updateReflectiveNames() { |
| 102 preserveNames(); | 102 preserveNames(); |
| 103 Map<String, String> result = <String, String>{}; | 103 Map<String, String> result = <String, String>{}; |
| 104 List keys = JS('List', 'Object.keys(#)', _jsMangledNames); | 104 List keys = JS('List', 'Object.keys(#)', _jsMangledNames); |
| 105 for (String key in keys) { | 105 for (String key in keys) { |
| 106 var reflectiveName = JS('var', '#[#]', _jsMangledNames, key); | 106 var reflectiveName = JS('var', '#[#]', _jsMangledNames, key); |
| 107 // Filter out all non-string values to protect against polution from | 107 // Filter out all non-string values to protect against polution from |
| 108 // anciliary fields in [_jsMangledNames]. | 108 // ancilliary fields in [_jsMangledNames]. |
| 109 bool filter = JS('bool', 'typeof # !== "string"', reflectiveName); | 109 bool filter = JS('bool', 'typeof # !== "string"', reflectiveName); |
| 110 if (filter) continue; | 110 if (filter) continue; |
| 111 result[reflectiveName] = JS('String', '#', key); | 111 result[reflectiveName] = JS('String', '#', key); |
| 112 | 112 |
| 113 String getterPrefix = JS_GET_NAME(JsGetName.GETTER_PREFIX); | 113 String getterPrefix = JS_GET_NAME(JsGetName.GETTER_PREFIX); |
| 114 if (_isInstance && key.startsWith(getterPrefix)) { | 114 if (_isInstance && key.startsWith(getterPrefix)) { |
| 115 int getterPrefixLength = getterPrefix.length; | 115 int getterPrefixLength = getterPrefix.length; |
| 116 String setterPrefix = JS_GET_NAME(JsGetName.SETTER_PREFIX); | 116 String setterPrefix = JS_GET_NAME(JsGetName.SETTER_PREFIX); |
| 117 result['$reflectiveName='] = | 117 result['$reflectiveName='] = |
| 118 '$setterPrefix${key.substring(getterPrefixLength)}'; | 118 '$setterPrefix${key.substring(getterPrefixLength)}'; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 'String', | 160 'String', |
| 161 r''' | 161 r''' |
| 162 (function(str, names) { | 162 (function(str, names) { |
| 163 return str.replace( | 163 return str.replace( |
| 164 /[^<,> ]+/g, | 164 /[^<,> ]+/g, |
| 165 function(m) { return names[m] || m; }); | 165 function(m) { return names[m] || m; }); |
| 166 })(#, #)''', | 166 })(#, #)''', |
| 167 str, | 167 str, |
| 168 JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES)); | 168 JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES)); |
| 169 } | 169 } |
| OLD | NEW |