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 dart2js.js_emitter.full_emitter.nsm_emitter; | 5 library dart2js.js_emitter.full_emitter.nsm_emitter; |
6 | 6 |
7 import '../../elements/entities.dart'; | 7 import '../../elements/entities.dart'; |
8 import '../../js/js.dart' as jsAst; | 8 import '../../js/js.dart' as jsAst; |
9 import '../../js/js.dart' show js; | 9 import '../../js/js.dart' show js; |
10 import '../../js_backend/js_backend.dart' show GetterName, SetterName; | 10 import '../../js_backend/js_backend.dart' show GetterName, SetterName; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 sorted.map((selector) => selector.invocationMirrorMemberName); | 173 sorted.map((selector) => selector.invocationMirrorMemberName); |
174 } | 174 } |
175 } | 175 } |
176 // Startup code that loops over the method names and puts handlers on the | 176 // Startup code that loops over the method names and puts handlers on the |
177 // Object class to catch noSuchMethod invocations. | 177 // Object class to catch noSuchMethod invocations. |
178 ClassEntity objectClass = closedWorld.commonElements.objectClass; | 178 ClassEntity objectClass = closedWorld.commonElements.objectClass; |
179 jsAst.Expression createInvocationMirror = backend.emitter | 179 jsAst.Expression createInvocationMirror = backend.emitter |
180 .staticFunctionAccess( | 180 .staticFunctionAccess( |
181 closedWorld.commonElements.createInvocationMirror); | 181 closedWorld.commonElements.createInvocationMirror); |
182 if (useDiffEncoding) { | 182 if (useDiffEncoding) { |
183 statements.add(js.statement( | 183 statements.add(js.statement('''{ |
184 '''{ | |
185 var objectClassObject = processedClasses.collected[#objectClass], | 184 var objectClassObject = processedClasses.collected[#objectClass], |
186 nameSequences = #diffEncoding.split("."), | 185 nameSequences = #diffEncoding.split("."), |
187 shortNames = []; | 186 shortNames = []; |
188 if (objectClassObject instanceof Array) | 187 if (objectClassObject instanceof Array) |
189 objectClassObject = objectClassObject[1]; | 188 objectClassObject = objectClassObject[1]; |
190 for (var j = 0; j < nameSequences.length; ++j) { | 189 for (var j = 0; j < nameSequences.length; ++j) { |
191 var sequence = nameSequences[j].split(","), | 190 var sequence = nameSequences[j].split(","), |
192 nameNumber = 0; | 191 nameNumber = 0; |
193 // If we are loading a deferred library the object class will not be | 192 // If we are loading a deferred library the object class will not be |
194 // in the collectedClasses so objectClassObject is undefined, and we | 193 // in the collectedClasses so objectClassObject is undefined, and we |
(...skipping 19 matching lines...) Expand all Loading... |
214 remaining = (remaining / 88) | 0) { | 213 remaining = (remaining / 88) | 0) { |
215 codes.unshift(${$HASH} + remaining % 88); | 214 codes.unshift(${$HASH} + remaining % 88); |
216 } | 215 } |
217 shortNames.push( | 216 shortNames.push( |
218 String.fromCharCode.apply(String, codes)); | 217 String.fromCharCode.apply(String, codes)); |
219 } | 218 } |
220 if (sequence.length > 1) { | 219 if (sequence.length > 1) { |
221 Array.prototype.push.apply(shortNames, sequence.shift()); | 220 Array.prototype.push.apply(shortNames, sequence.shift()); |
222 } | 221 } |
223 } | 222 } |
224 }''', | 223 }''', { |
225 { | 224 'objectClass': js.quoteName(namer.className(objectClass)), |
226 'objectClass': js.quoteName(namer.className(objectClass)), | 225 'diffEncoding': sortedShorts |
227 'diffEncoding': sortedShorts | 226 })); |
228 })); | |
229 } else { | 227 } else { |
230 // No useDiffEncoding version. | 228 // No useDiffEncoding version. |
231 statements.add(js.statement( | 229 statements.add(js.statement( |
232 'var objectClassObject = processedClasses.collected[#objectClass],' | 230 'var objectClassObject = processedClasses.collected[#objectClass],' |
233 ' shortNames = #diffEncoding.split(",")', | 231 ' shortNames = #diffEncoding.split(",")', |
234 { | 232 { |
235 'objectClass': js.quoteName(namer.className(objectClass)), | 233 'objectClass': js.quoteName(namer.className(objectClass)), |
236 'diffEncoding': sortedShorts | 234 'diffEncoding': sortedShorts |
237 })); | 235 })); |
238 if (!minify) { | 236 if (!minify) { |
239 statements.add(js.statement('var longNames = #longs.split(",")', | 237 statements.add(js.statement('var longNames = #longs.split(",")', |
240 {'longs': js.string(sortedLongs.join(','))})); | 238 {'longs': js.string(sortedLongs.join(','))})); |
241 } | 239 } |
242 statements.add(js.statement('if (objectClassObject instanceof Array)' | 240 statements.add(js.statement('if (objectClassObject instanceof Array)' |
243 ' objectClassObject = objectClassObject[1];')); | 241 ' objectClassObject = objectClassObject[1];')); |
244 } | 242 } |
245 | 243 |
246 dynamic isIntercepted = // jsAst.Expression or bool. | 244 dynamic isIntercepted = // jsAst.Expression or bool. |
247 interceptedSelectors.isEmpty | 245 interceptedSelectors.isEmpty |
248 ? false | 246 ? false |
249 : ordinarySelectors.isEmpty | 247 : ordinarySelectors.isEmpty |
250 ? true | 248 ? true |
251 : js('j < #', js.number(interceptedSelectors.length)); | 249 : js('j < #', js.number(interceptedSelectors.length)); |
252 | 250 |
253 statements.add(js.statement( | 251 statements.add(js.statement(''' |
254 ''' | |
255 // If we are loading a deferred library the object class will not be in | 252 // If we are loading a deferred library the object class will not be in |
256 // the collectedClasses so objectClassObject is undefined, and we skip | 253 // the collectedClasses so objectClassObject is undefined, and we skip |
257 // setting up the names. | 254 // setting up the names. |
258 if (objectClassObject) { | 255 if (objectClassObject) { |
259 for (var j = 0; j < shortNames.length; j++) { | 256 for (var j = 0; j < shortNames.length; j++) { |
260 var type = 0; | 257 var type = 0; |
261 var shortName = shortNames[j]; | 258 var shortName = shortNames[j]; |
262 if (shortName.indexOf("${namer.getterPrefix}") == 0) type = 1; | 259 if (shortName.indexOf("${namer.getterPrefix}") == 0) type = 1; |
263 if (shortName.indexOf("${namer.setterPrefix}") == 0) type = 2; | 260 if (shortName.indexOf("${namer.setterPrefix}") == 0) type = 2; |
264 // Generate call to: | 261 // Generate call to: |
(...skipping 26 matching lines...) Expand all Loading... |
291 // argument. We could pass anything in place of [this]. | 288 // argument. We could pass anything in place of [this]. |
292 this, | 289 this, |
293 #createInvocationMirror(name, shortName, type, | 290 #createInvocationMirror(name, shortName, type, |
294 // Create proper Array with all arguments. | 291 // Create proper Array with all arguments. |
295 Array.prototype.slice.call(arguments, 0), | 292 Array.prototype.slice.call(arguments, 0), |
296 [])); | 293 [])); |
297 } | 294 } |
298 })(#names[j], shortName, type); | 295 })(#names[j], shortName, type); |
299 } | 296 } |
300 } | 297 } |
301 }''', | 298 }''', { |
302 { | 299 'noSuchMethodName': namer.noSuchMethodName, |
303 'noSuchMethodName': namer.noSuchMethodName, | 300 'createInvocationMirror': createInvocationMirror, |
304 'createInvocationMirror': createInvocationMirror, | 301 'names': minify ? 'shortNames' : 'longNames', |
305 'names': minify ? 'shortNames' : 'longNames', | 302 'isIntercepted': isIntercepted |
306 'isIntercepted': isIntercepted | 303 })); |
307 })); | |
308 | 304 |
309 return statements; | 305 return statements; |
310 } | 306 } |
311 } | 307 } |
312 | 308 |
313 /// When pretty printed, this node computes a diff-encoded string for the list | 309 /// When pretty printed, this node computes a diff-encoded string for the list |
314 /// of given names. | 310 /// of given names. |
315 /// | 311 /// |
316 /// See [buildTrivialNsmHandlers]. | 312 /// See [buildTrivialNsmHandlers]. |
317 class _DiffEncodedListOfNames extends jsAst.DeferredString | 313 class _DiffEncodedListOfNames extends jsAst.DeferredString |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 } | 401 } |
406 | 402 |
407 String get value { | 403 String get value { |
408 if (_cachedValue == null) { | 404 if (_cachedValue == null) { |
409 _cachedValue = _computeDiffEncoding(); | 405 _cachedValue = _computeDiffEncoding(); |
410 } | 406 } |
411 | 407 |
412 return _cachedValue; | 408 return _cachedValue; |
413 } | 409 } |
414 } | 410 } |
OLD | NEW |