Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class SsaCodeGeneratorTask extends CompilerTask { | 5 class SsaCodeGeneratorTask extends CompilerTask { |
| 6 SsaCodeGeneratorTask(Compiler compiler) : super(compiler); | 6 SsaCodeGeneratorTask(Compiler compiler) : super(compiler); |
| 7 String get name() => 'SSA code generator'; | 7 String get name() => 'SSA code generator'; |
| 8 | 8 |
| 9 String generate(WorkItem work, HGraph graph) { | 9 String generate(WorkItem work, HGraph graph) { |
| 10 return measure(() { | 10 return measure(() { |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 402 assert(dominatedCount == 3); | 402 assert(dominatedCount == 3); |
| 403 assert(dominated.last().isExitBlock()); | 403 assert(dominated.last().isExitBlock()); |
| 404 visitBasicBlock(dominated[1]); | 404 visitBasicBlock(dominated[1]); |
| 405 visitBasicBlock(dominated[2]); | 405 visitBasicBlock(dominated[2]); |
| 406 } | 406 } |
| 407 } | 407 } |
| 408 | 408 |
| 409 visitInvokeDynamicMethod(HInvokeDynamicMethod node) { | 409 visitInvokeDynamicMethod(HInvokeDynamicMethod node) { |
| 410 use(node.receiver); | 410 use(node.receiver); |
| 411 buffer.add('.'); | 411 buffer.add('.'); |
| 412 buffer.add(compiler.namer.instanceName(node.name)); | 412 // Remove 'this' from the number of arguments. |
| 413 int argumentCount = node.inputs.length - 1; | |
| 414 buffer.add(compiler.namer.instanceMethodName(node.name, argumentCount)); | |
| 413 visitArguments(node.inputs); | 415 visitArguments(node.inputs); |
| 414 compiler.registerDynamicInvocation(node.name); | 416 if (node.inputs[0] is !HForeignNew) { |
|
floitsch
2012/01/24 11:46:03
Add comment that this avoids adding the generative
ngeoffray
2012/01/24 12:09:39
Done.
| |
| 417 compiler.registerDynamicInvocation(node.name, argumentCount); | |
| 418 } | |
| 415 } | 419 } |
| 416 | 420 |
| 417 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { | 421 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { |
| 418 use(node.receiver); | 422 use(node.receiver); |
| 419 buffer.add('.'); | 423 buffer.add('.'); |
| 420 buffer.add(compiler.namer.setterName(node.name)); | 424 buffer.add(compiler.namer.setterName(node.name)); |
| 421 visitArguments(node.inputs); | 425 visitArguments(node.inputs); |
| 422 compiler.registerDynamicSetter(node.name); | 426 compiler.registerDynamicSetter(node.name); |
| 423 } | 427 } |
| 424 | 428 |
| 425 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { | 429 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { |
| 426 use(node.receiver); | 430 use(node.receiver); |
| 427 buffer.add('.'); | 431 buffer.add('.'); |
| 428 buffer.add(compiler.namer.getterName(node.name)); | 432 buffer.add(compiler.namer.getterName(node.name)); |
| 429 visitArguments(node.inputs); | 433 visitArguments(node.inputs); |
| 430 compiler.registerDynamicGetter(node.name); | 434 compiler.registerDynamicGetter(node.name); |
| 431 } | 435 } |
| 432 | 436 |
| 433 visitInvokeClosure(HInvokeClosure node) { | 437 visitInvokeClosure(HInvokeClosure node) { |
| 434 use(node.receiver); | 438 use(node.receiver); |
| 435 buffer.add('.'); | 439 buffer.add('.'); |
| 436 buffer.add(compiler.namer.closureInvocationName()); | 440 buffer.add(compiler.namer.closureInvocationName(node.inputs.length - 1)); |
| 437 visitArguments(node.inputs); | 441 visitArguments(node.inputs); |
| 438 } | 442 } |
| 439 | 443 |
| 440 visitInvokeStatic(HInvokeStatic node) { | 444 visitInvokeStatic(HInvokeStatic node) { |
| 441 use(node.target); | 445 use(node.target); |
| 442 visitArguments(node.inputs); | 446 visitArguments(node.inputs); |
| 443 } | 447 } |
| 444 | 448 |
| 445 visitInvokeSuper(HInvokeSuper node) { | 449 visitInvokeSuper(HInvokeSuper node) { |
| 446 Element superMethod = node.element; | 450 Element superMethod = node.element; |
| 447 Element superClass = superMethod.enclosingElement; | 451 Element superClass = superMethod.enclosingElement; |
| 452 // Remove the element and 'this'. | |
| 453 int argumentCount = node.inputs.length - 2; | |
| 448 String className = compiler.namer.isolatePropertyAccess(superClass); | 454 String className = compiler.namer.isolatePropertyAccess(superClass); |
| 449 String methodName = compiler.namer.instanceName(superMethod.name); | 455 String methodName = compiler.namer.instanceMethodName( |
| 456 superMethod.name, argumentCount); | |
| 450 buffer.add('$className.prototype.$methodName.call'); | 457 buffer.add('$className.prototype.$methodName.call'); |
| 451 visitArguments(node.inputs); | 458 visitArguments(node.inputs); |
| 452 } | 459 } |
| 453 | 460 |
| 454 visitForeign(HForeign node) { | 461 visitForeign(HForeign node) { |
| 455 String code = '${node.code}'; | 462 String code = '${node.code}'; |
| 456 List<HInstruction> inputs = node.inputs; | 463 List<HInstruction> inputs = node.inputs; |
| 457 for (int i = 0; i < inputs.length; i++) { | 464 for (int i = 0; i < inputs.length; i++) { |
| 458 HInstruction input = inputs[i]; | 465 HInstruction input = inputs[i]; |
| 459 String name; | 466 String name; |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1021 startBailoutSwitch(); | 1028 startBailoutSwitch(); |
| 1022 } | 1029 } |
| 1023 } | 1030 } |
| 1024 | 1031 |
| 1025 void endElse(HIf node) { | 1032 void endElse(HIf node) { |
| 1026 if (node.elseBlock.hasBailouts()) { | 1033 if (node.elseBlock.hasBailouts()) { |
| 1027 endBailoutSwitch(); | 1034 endBailoutSwitch(); |
| 1028 } | 1035 } |
| 1029 } | 1036 } |
| 1030 } | 1037 } |
| OLD | NEW |