Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(789)

Side by Side Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 2320583002: Introduce OpenWorld. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 import 'dart:collection'; 5 import 'dart:collection';
6 6
7 import 'package:js_runtime/shared/embedded_names.dart'; 7 import 'package:js_runtime/shared/embedded_names.dart';
8 8
9 import '../closure.dart'; 9 import '../closure.dart';
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 * 547 *
548 * However, inlining can only be performed when the target function can be 548 * However, inlining can only be performed when the target function can be
549 * resolved statically. The defaults can therefore be included at this point. 549 * resolved statically. The defaults can therefore be included at this point.
550 * 550 *
551 * The [providedArguments] list contains first all positional arguments, then 551 * The [providedArguments] list contains first all positional arguments, then
552 * the provided named arguments (the named arguments that are defined in the 552 * the provided named arguments (the named arguments that are defined in the
553 * [selector]) in a specific order (see [addDynamicSendArgumentsToList]). 553 * [selector]) in a specific order (see [addDynamicSendArgumentsToList]).
554 */ 554 */
555 List<HInstruction> completeDynamicSendArgumentsList(Selector selector, 555 List<HInstruction> completeDynamicSendArgumentsList(Selector selector,
556 FunctionElement function, List<HInstruction> providedArguments) { 556 FunctionElement function, List<HInstruction> providedArguments) {
557 assert(selector.applies(function, compiler.closedWorld)); 557 assert(selector.applies(function, backend));
558 FunctionSignature signature = function.functionSignature; 558 FunctionSignature signature = function.functionSignature;
559 List<HInstruction> compiledArguments = new List<HInstruction>( 559 List<HInstruction> compiledArguments = new List<HInstruction>(
560 signature.parameterCount + 1); // Plus one for receiver. 560 signature.parameterCount + 1); // Plus one for receiver.
561 561
562 compiledArguments[0] = providedArguments[0]; // Receiver. 562 compiledArguments[0] = providedArguments[0]; // Receiver.
563 int index = 1; 563 int index = 1;
564 for (; index <= signature.requiredParameterCount; index++) { 564 for (; index <= signature.requiredParameterCount; index++) {
565 compiledArguments[index] = providedArguments[index]; 565 compiledArguments[index] = providedArguments[index];
566 } 566 }
567 if (!signature.optionalParametersAreNamed) { 567 if (!signature.optionalParametersAreNamed) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 bool meetsHardConstraints() { 641 bool meetsHardConstraints() {
642 if (compiler.options.disableInlining) return false; 642 if (compiler.options.disableInlining) return false;
643 643
644 assert(invariant( 644 assert(invariant(
645 currentNode != null ? currentNode : element, 645 currentNode != null ? currentNode : element,
646 selector != null || 646 selector != null ||
647 Elements.isStaticOrTopLevel(element) || 647 Elements.isStaticOrTopLevel(element) ||
648 element.isGenerativeConstructorBody, 648 element.isGenerativeConstructorBody,
649 message: "Missing selector for inlining of $element.")); 649 message: "Missing selector for inlining of $element."));
650 if (selector != null) { 650 if (selector != null) {
651 if (!selector.applies(function, compiler.closedWorld)) return false; 651 if (!selector.applies(function, backend)) return false;
652 if (mask != null && 652 if (mask != null &&
653 !mask.canHit(function, selector, compiler.closedWorld)) { 653 !mask.canHit(function, selector, compiler.closedWorld)) {
654 return false; 654 return false;
655 } 655 }
656 } 656 }
657 657
658 if (backend.isJsInterop(element)) return false; 658 if (backend.isJsInterop(element)) return false;
659 659
660 // Don't inline operator== methods if the parameter can be null. 660 // Don't inline operator== methods if the parameter can be null.
661 if (element.name == '==') { 661 if (element.name == '==') {
(...skipping 3018 matching lines...) Expand 10 before | Expand all | Expand 10 after
3680 push(buildInvokeSuper(Selectors.noSuchMethod_, element, inputs)); 3680 push(buildInvokeSuper(Selectors.noSuchMethod_, element, inputs));
3681 } 3681 }
3682 3682
3683 /// Generate a call to a super method or constructor. 3683 /// Generate a call to a super method or constructor.
3684 void generateSuperInvoke(ast.Send node, FunctionElement function, 3684 void generateSuperInvoke(ast.Send node, FunctionElement function,
3685 SourceInformation sourceInformation) { 3685 SourceInformation sourceInformation) {
3686 // TODO(5347): Try to avoid the need for calling [implementation] before 3686 // TODO(5347): Try to avoid the need for calling [implementation] before
3687 // calling [makeStaticArgumentList]. 3687 // calling [makeStaticArgumentList].
3688 Selector selector = elements.getSelector(node); 3688 Selector selector = elements.getSelector(node);
3689 assert(invariant( 3689 assert(invariant(
3690 node, selector.applies(function.implementation, compiler.closedWorld), 3690 node, selector.applies(function.implementation, backend),
3691 message: "$selector does not apply to ${function.implementation}")); 3691 message: "$selector does not apply to ${function.implementation}"));
3692 List<HInstruction> inputs = makeStaticArgumentList( 3692 List<HInstruction> inputs = makeStaticArgumentList(
3693 selector.callStructure, node.arguments, function.implementation); 3693 selector.callStructure, node.arguments, function.implementation);
3694 push(buildInvokeSuper(selector, function, inputs, sourceInformation)); 3694 push(buildInvokeSuper(selector, function, inputs, sourceInformation));
3695 } 3695 }
3696 3696
3697 /// Access the value from the super [element]. 3697 /// Access the value from the super [element].
3698 void handleSuperGet(ast.Send node, Element element) { 3698 void handleSuperGet(ast.Send node, Element element) {
3699 Selector selector = elements.getSelector(node); 3699 Selector selector = elements.getSelector(node);
3700 SourceInformation sourceInformation = 3700 SourceInformation sourceInformation =
(...skipping 1235 matching lines...) Expand 10 before | Expand all | Expand 10 after
4936 sourceInformation: 4936 sourceInformation:
4937 sourceInformationBuilder.buildGeneric(node.assignmentOperator)); 4937 sourceInformationBuilder.buildGeneric(node.assignmentOperator));
4938 } 4938 }
4939 4939
4940 void handleSuperSendSet(ast.SendSet node) { 4940 void handleSuperSendSet(ast.SendSet node) {
4941 Element element = elements[node]; 4941 Element element = elements[node];
4942 List<HInstruction> setterInputs = <HInstruction>[]; 4942 List<HInstruction> setterInputs = <HInstruction>[];
4943 void generateSuperSendSet() { 4943 void generateSuperSendSet() {
4944 Selector setterSelector = elements.getSelector(node); 4944 Selector setterSelector = elements.getSelector(node);
4945 if (Elements.isUnresolved(element) || 4945 if (Elements.isUnresolved(element) ||
4946 !setterSelector.applies(element, compiler.closedWorld)) { 4946 !setterSelector.applies(element, compiler.backend)) {
4947 generateSuperNoSuchMethodSend(node, setterSelector, setterInputs); 4947 generateSuperNoSuchMethodSend(node, setterSelector, setterInputs);
4948 pop(); 4948 pop();
4949 } else { 4949 } else {
4950 add(buildInvokeSuper(setterSelector, element, setterInputs)); 4950 add(buildInvokeSuper(setterSelector, element, setterInputs));
4951 } 4951 }
4952 } 4952 }
4953 4953
4954 if (identical(node.assignmentOperator.source, '=')) { 4954 if (identical(node.assignmentOperator.source, '=')) {
4955 addDynamicSendArgumentsToList(node, setterInputs); 4955 addDynamicSendArgumentsToList(node, setterInputs);
4956 generateSuperSendSet(); 4956 generateSuperSendSet();
(...skipping 2601 matching lines...) Expand 10 before | Expand all | Expand 10 after
7558 const _LoopTypeVisitor(); 7558 const _LoopTypeVisitor();
7559 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP; 7559 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP;
7560 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP; 7560 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP;
7561 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP; 7561 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP;
7562 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP; 7562 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP;
7563 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 7563 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
7564 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 7564 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
7565 int visitSwitchStatement(ast.SwitchStatement node) => 7565 int visitSwitchStatement(ast.SwitchStatement node) =>
7566 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; 7566 HLoopBlockInformation.SWITCH_CONTINUE_LOOP;
7567 } 7567 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698