| 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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 /// This class should morph into something that makes it easy to build | 7 /// This class should morph into something that makes it easy to build |
| 8 /// JavaScript representations of libraries, class-sides, and instance-sides. | 8 /// JavaScript representations of libraries, class-sides, and instance-sides. |
| 9 /// Initially, it is just a placeholder for code that is moved from | 9 /// Initially, it is just a placeholder for code that is moved from |
| 10 /// [CodeEmitterTask]. | 10 /// [CodeEmitterTask]. |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 // N+2. (Optional parameter count << 1) + | 384 // N+2. (Optional parameter count << 1) + |
| 385 // (parameters.optionalParametersAreNamed ? 1 : 0). | 385 // (parameters.optionalParametersAreNamed ? 1 : 0). |
| 386 // N+3. Index to function type in constant pool. | 386 // N+3. Index to function type in constant pool. |
| 387 // N+4. First default argument. | 387 // N+4. First default argument. |
| 388 // ... | 388 // ... |
| 389 // O. First parameter name (if needed for reflection or Function.apply). | 389 // O. First parameter name (if needed for reflection or Function.apply). |
| 390 // ... | 390 // ... |
| 391 // P. Unmangled name (if reflectable). | 391 // P. Unmangled name (if reflectable). |
| 392 // P+1. First metadata (if reflectable). | 392 // P+1. First metadata (if reflectable). |
| 393 // ... | 393 // ... |
| 394 // TODO(ahe): Consider one of the parameter counts can be replaced by the |
| 395 // length property of the JavaScript function object. |
| 394 | 396 |
| 395 List expressions = []; | 397 List expressions = []; |
| 396 | 398 |
| 397 String callSelectorString = 'null'; | 399 String callSelectorString = 'null'; |
| 398 if (member.isFunction()) { | 400 if (member.isFunction()) { |
| 399 Selector callSelector = | 401 Selector callSelector = |
| 400 new Selector.fromElement(member, compiler).toCallSelector(); | 402 new Selector.fromElement(member, compiler).toCallSelector(); |
| 401 callSelectorString = '"${namer.invocationName(callSelector)}"'; | 403 callSelectorString = '"${namer.invocationName(callSelector)}"'; |
| 402 } | 404 } |
| 403 | 405 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 414 // TODO(ahe): Remove comments from output. | 416 // TODO(ahe): Remove comments from output. |
| 415 List tearOffInfo = | 417 List tearOffInfo = |
| 416 [new jsAst.LiteralString('$callSelectorString /* tearOffInfo */')]; | 418 [new jsAst.LiteralString('$callSelectorString /* tearOffInfo */')]; |
| 417 | 419 |
| 418 if (needsStubs || canTearOff) { | 420 if (needsStubs || canTearOff) { |
| 419 addParameterStubs(member, (Selector selector, jsAst.Fun function) { | 421 addParameterStubs(member, (Selector selector, jsAst.Fun function) { |
| 420 expressions.add(function); | 422 expressions.add(function); |
| 421 if (member.isInstanceMember()) { | 423 if (member.isInstanceMember()) { |
| 422 Set invokedSelectors = | 424 Set invokedSelectors = |
| 423 compiler.codegenWorld.invokedNames[member.name]; | 425 compiler.codegenWorld.invokedNames[member.name]; |
| 424 if (invokedSelectors != null && invokedSelectors.contains(selector)) { | 426 //if (invokedSelectors != null && invokedSelectors.contains(selector))
{ |
| 425 expressions.add(js.string(namer.invocationName(selector))); | 427 expressions.add(js.string(namer.invocationName(selector))); |
| 426 } else { | 428 //} else { |
| 427 // Don't add a stub for calling this as a regular instance method, | 429 // // Don't add a stub for calling this as a regular instance method, |
| 428 // we only need the "call" stub for implicit closures of this | 430 // // we only need the "call" stub for implicit closures of this |
| 429 // method. | 431 // // method. |
| 430 expressions.add("null"); | 432 // expressions.add("null"); |
| 431 } | 433 //} |
| 432 } else { | 434 } else { |
| 433 // Static methods don't need "named" stubs as the default arguments | 435 // Static methods don't need "named" stubs as the default arguments |
| 434 // are inlined at call sites. But static methods might need "call" | 436 // are inlined at call sites. But static methods might need "call" |
| 435 // stubs for implicit closures. | 437 // stubs for implicit closures. |
| 436 expressions.add("null"); | 438 expressions.add("null"); |
| 437 // TOOD(ahe): Since we know when reading static data versus instance | 439 // TOOD(ahe): Since we know when reading static data versus instance |
| 438 // data, we can eliminate this element. | 440 // data, we can eliminate this element. |
| 439 } | 441 } |
| 440 Set<Selector> callSelectors = compiler.codegenWorld.invokedNames[ | 442 Set<Selector> callSelectors = compiler.codegenWorld.invokedNames[ |
| 441 namer.closureInvocationSelectorName]; | 443 namer.closureInvocationSelectorName]; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 expressions.add(js.string(member.name)); | 505 expressions.add(js.string(member.name)); |
| 504 } | 506 } |
| 505 | 507 |
| 506 builder.addProperty(name, js.toExpression(expressions)); | 508 builder.addProperty(name, js.toExpression(expressions)); |
| 507 } | 509 } |
| 508 | 510 |
| 509 void addMemberField(VariableElement member, ClassBuilder builder) { | 511 void addMemberField(VariableElement member, ClassBuilder builder) { |
| 510 // For now, do nothing. | 512 // For now, do nothing. |
| 511 } | 513 } |
| 512 } | 514 } |
| OLD | NEW |