OLD | NEW |
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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 class InterceptorStubGenerator { | 7 class InterceptorStubGenerator { |
8 final Compiler compiler; | 8 final Compiler compiler; |
9 final Namer namer; | 9 final Namer namer; |
10 final JavaScriptBackend backend; | 10 final JavaScriptBackend backend; |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 return js.statement(r''' | 280 return js.statement(r''' |
281 if (# && !receiver.immutable$list && | 281 if (# && !receiver.immutable$list && |
282 (a0 >>> 0) === a0 && a0 < receiver.length) | 282 (a0 >>> 0) === a0 && a0 < receiver.length) |
283 return receiver[a0] = a1; | 283 return receiver[a0] = a1; |
284 ''', typeCheck); | 284 ''', typeCheck); |
285 } | 285 } |
286 } | 286 } |
287 return null; | 287 return null; |
288 } | 288 } |
289 | 289 |
290 jsAst.Expression generateOneShotInterceptor(String name) { | 290 jsAst.Expression generateOneShotInterceptor(jsAst.Name name) { |
291 Selector selector = backend.oneShotInterceptors[name]; | 291 Selector selector = backend.oneShotInterceptors[name]; |
292 Set<ClassElement> classes = | 292 Set<ClassElement> classes = |
293 backend.getInterceptedClassesOn(selector.name); | 293 backend.getInterceptedClassesOn(selector.name); |
294 String getInterceptorName = namer.nameForGetInterceptor(classes); | 294 jsAst.Name getInterceptorName = namer.nameForGetInterceptor(classes); |
295 | 295 |
296 List<String> parameterNames = <String>[]; | 296 List<String> parameterNames = <String>[]; |
297 parameterNames.add('receiver'); | 297 parameterNames.add('receiver'); |
298 | 298 |
299 if (selector.isSetter) { | 299 if (selector.isSetter) { |
300 parameterNames.add('value'); | 300 parameterNames.add('value'); |
301 } else { | 301 } else { |
302 for (int i = 0; i < selector.argumentCount; i++) { | 302 for (int i = 0; i < selector.argumentCount; i++) { |
303 parameterNames.add('a$i'); | 303 parameterNames.add('a$i'); |
304 } | 304 } |
305 } | 305 } |
306 | 306 |
307 String invocationName = backend.namer.invocationName(selector); | 307 jsAst.Name invocationName = backend.namer.invocationName(selector); |
308 String globalObject = namer.globalObjectFor(backend.interceptorsLibrary); | 308 String globalObject = namer.globalObjectFor(backend.interceptorsLibrary); |
309 | 309 |
310 jsAst.Statement optimizedPath = | 310 jsAst.Statement optimizedPath = |
311 _fastPathForOneShotInterceptor(selector, classes); | 311 _fastPathForOneShotInterceptor(selector, classes); |
312 if (optimizedPath == null) optimizedPath = js.statement(';'); | 312 if (optimizedPath == null) optimizedPath = js.statement(';'); |
313 | 313 |
314 return js( | 314 return js( |
315 'function(#) { #; return #.#(receiver).#(#) }', | 315 'function(#) { #; return #.#(receiver).#(#) }', |
316 [parameterNames, | 316 [parameterNames, |
317 optimizedPath, | 317 optimizedPath, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 | 363 |
364 var map = new jsAst.ObjectInitializer(properties); | 364 var map = new jsAst.ObjectInitializer(properties); |
365 elements.add(map); | 365 elements.add(map); |
366 } | 366 } |
367 } | 367 } |
368 } | 368 } |
369 | 369 |
370 return new jsAst.ArrayInitializer(elements); | 370 return new jsAst.ArrayInitializer(elements); |
371 } | 371 } |
372 } | 372 } |
OLD | NEW |