Skip to content

Commit 9a74bce

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[dart2js] Support new method invocation encoding in static type visitor
This is the first part of using the new encodings of MethodInvocation, PropertyGet and PropertySet in dart2js. In this CL the new visitors are implemented in static_type.dart. This change is done by refactoring the existing implementation into helpers and new registration methods that can be used by both the old and the new encoding but lends itself to take advance of the new encoding. The new encoding is not enabled until all of dart2js has been migrated to the new encoding. The refactoring is intentionally not changing the outcome of the static_type.dart to make it easier to detect accidental regressions introduced by the migration. Change-Id: I93d2033969c33d4c7a5957ad7a6c0b1cdf47fe6f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/184220 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Mayank Patke <[email protected]>
1 parent 348c704 commit 9a74bce

File tree

5 files changed

+597
-206
lines changed

5 files changed

+597
-206
lines changed

pkg/compiler/lib/src/ir/impact.dart

Lines changed: 93 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:front_end/src/api_unstable/dart2js.dart'
6-
show operatorFromString;
7-
85
import 'package:kernel/ast.dart' as ir;
96
import 'package:kernel/class_hierarchy.dart' as ir;
107
import 'package:kernel/type_environment.dart' as ir;
@@ -255,13 +252,19 @@ abstract class ImpactBuilderBase extends StaticTypeVisitor
255252
}
256253

257254
@override
258-
void handleStaticGet(ir.StaticGet node, ir.DartType resultType) {
259-
ir.Member target = node.target;
260-
if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
261-
registerStaticTearOff(target, getDeferredImport(node));
262-
} else {
263-
registerStaticGet(target, getDeferredImport(node));
264-
}
255+
void handleStaticGet(
256+
ir.Expression node, ir.Member target, ir.DartType resultType) {
257+
assert(!(target is ir.Procedure && target.kind == ir.ProcedureKind.Method),
258+
"Static tear off registered as static get: $node");
259+
registerStaticGet(target, getDeferredImport(node));
260+
}
261+
262+
@override
263+
void handleStaticTearOff(
264+
ir.Expression node, ir.Member target, ir.DartType resultType) {
265+
assert(target is ir.Procedure && target.kind == ir.ProcedureKind.Method,
266+
"Static get registered as static tear off: $node");
267+
registerStaticTearOff(target, getDeferredImport(node));
265268
}
266269

267270
@override
@@ -520,71 +523,103 @@ abstract class ImpactBuilderBase extends StaticTypeVisitor
520523
}
521524

522525
@override
523-
void handleMethodInvocation(
524-
ir.MethodInvocation node,
526+
void handleDynamicInvocation(
527+
ir.InvocationExpression node,
528+
ir.DartType receiverType,
529+
ArgumentTypes argumentTypes,
530+
ir.DartType returnType) {
531+
int positionArguments = node.arguments.positional.length;
532+
List<String> namedArguments = _getNamedArguments(node.arguments);
533+
List<ir.DartType> typeArguments = node.arguments.types;
534+
ClassRelation relation = computeClassRelationFromType(receiverType);
535+
registerDynamicInvocation(receiverType, relation, node.name,
536+
positionArguments, namedArguments, typeArguments);
537+
}
538+
539+
@override
540+
void handleFunctionInvocation(
541+
ir.InvocationExpression node,
525542
ir.DartType receiverType,
526543
ArgumentTypes argumentTypes,
527544
ir.DartType returnType) {
528545
int positionArguments = node.arguments.positional.length;
529546
List<String> namedArguments = _getNamedArguments(node.arguments);
530547
List<ir.DartType> typeArguments = node.arguments.types;
531-
ir.Expression receiver = node.receiver;
532-
if (receiver is ir.VariableGet &&
533-
receiver.variable.isFinal &&
534-
receiver.variable.parent is ir.FunctionDeclaration) {
535-
registerLocalFunctionInvocation(receiver.variable.parent,
548+
registerFunctionInvocation(
549+
receiverType, positionArguments, namedArguments, typeArguments);
550+
}
551+
552+
@override
553+
void handleInstanceInvocation(
554+
ir.InvocationExpression node,
555+
ir.DartType receiverType,
556+
ir.Member interfaceTarget,
557+
ArgumentTypes argumentTypes) {
558+
int positionArguments = node.arguments.positional.length;
559+
List<String> namedArguments = _getNamedArguments(node.arguments);
560+
List<ir.DartType> typeArguments = node.arguments.types;
561+
ClassRelation relation = computeClassRelationFromType(receiverType);
562+
563+
if (interfaceTarget is ir.Field ||
564+
interfaceTarget is ir.Procedure &&
565+
interfaceTarget.kind == ir.ProcedureKind.Getter) {
566+
registerInstanceInvocation(receiverType, relation, interfaceTarget,
536567
positionArguments, namedArguments, typeArguments);
568+
registerFunctionInvocation(interfaceTarget.getterType, positionArguments,
569+
namedArguments, typeArguments);
537570
} else {
538-
ClassRelation relation = computeClassRelationFromType(receiverType);
539-
540-
ir.Member interfaceTarget = node.interfaceTarget;
541-
if (interfaceTarget == null) {
542-
registerDynamicInvocation(receiverType, relation, node.name,
543-
positionArguments, namedArguments, typeArguments);
544-
// TODO(johnniwinther): Avoid treating a known function call as a
545-
// dynamic call when CFE provides a way to distinguish the two.
546-
if (operatorFromString(node.name.text) == null &&
547-
receiverType is ir.DynamicType) {
548-
// We might implicitly call a getter that returns a function.
549-
registerFunctionInvocation(const ir.DynamicType(), positionArguments,
550-
namedArguments, typeArguments);
551-
}
552-
} else {
553-
if (interfaceTarget is ir.Field ||
554-
interfaceTarget is ir.Procedure &&
555-
interfaceTarget.kind == ir.ProcedureKind.Getter) {
556-
registerInstanceInvocation(receiverType, relation, interfaceTarget,
557-
positionArguments, namedArguments, typeArguments);
558-
registerFunctionInvocation(interfaceTarget.getterType,
559-
positionArguments, namedArguments, typeArguments);
560-
} else {
561-
registerInstanceInvocation(receiverType, relation, interfaceTarget,
562-
positionArguments, namedArguments, typeArguments);
563-
}
564-
}
571+
registerInstanceInvocation(receiverType, relation, interfaceTarget,
572+
positionArguments, namedArguments, typeArguments);
565573
}
566574
}
567575

568576
@override
569-
void handlePropertyGet(
570-
ir.PropertyGet node, ir.DartType receiverType, ir.DartType resultType) {
577+
void handleLocalFunctionInvocation(
578+
ir.InvocationExpression node,
579+
ir.FunctionDeclaration function,
580+
ArgumentTypes argumentTypes,
581+
ir.DartType returnType) {
582+
int positionArguments = node.arguments.positional.length;
583+
List<String> namedArguments = _getNamedArguments(node.arguments);
584+
List<ir.DartType> typeArguments = node.arguments.types;
585+
registerLocalFunctionInvocation(
586+
function, positionArguments, namedArguments, typeArguments);
587+
}
588+
589+
@override
590+
void handleEqualsCall(ir.Expression left, ir.DartType leftType,
591+
ir.Expression right, ir.DartType rightType, ir.Member interfaceTarget) {
592+
ClassRelation relation = computeClassRelationFromType(leftType);
593+
registerInstanceInvocation(leftType, relation, interfaceTarget, 1,
594+
const <String>[], const <ir.DartType>[]);
595+
}
596+
597+
@override
598+
void handleDynamicGet(ir.Expression node, ir.DartType receiverType,
599+
ir.Name name, ir.DartType resultType) {
571600
ClassRelation relation = computeClassRelationFromType(receiverType);
572-
if (node.interfaceTarget != null) {
573-
registerInstanceGet(receiverType, relation, node.interfaceTarget);
574-
} else {
575-
registerDynamicGet(receiverType, relation, node.name);
576-
}
601+
registerDynamicGet(receiverType, relation, name);
577602
}
578603

579604
@override
580-
void handlePropertySet(
581-
ir.PropertySet node, ir.DartType receiverType, ir.DartType valueType) {
605+
void handleInstanceGet(ir.Expression node, ir.DartType receiverType,
606+
ir.Member interfaceTarget, ir.DartType resultType) {
582607
ClassRelation relation = computeClassRelationFromType(receiverType);
583-
if (node.interfaceTarget != null) {
584-
registerInstanceSet(receiverType, relation, node.interfaceTarget);
585-
} else {
586-
registerDynamicSet(receiverType, relation, node.name);
587-
}
608+
registerInstanceGet(receiverType, relation, interfaceTarget);
609+
}
610+
611+
@override
612+
void handleDynamicSet(ir.Expression node, ir.DartType receiverType,
613+
ir.Name name, ir.DartType valueType) {
614+
ClassRelation relation = computeClassRelationFromType(receiverType);
615+
registerDynamicSet(receiverType, relation, name);
616+
}
617+
618+
@override
619+
void handleInstanceSet(ir.Expression node, ir.DartType receiverType,
620+
ir.Member interfaceTarget, ir.DartType valueType) {
621+
ClassRelation relation = computeClassRelationFromType(receiverType);
622+
registerInstanceSet(receiverType, relation, interfaceTarget);
588623
}
589624

590625
@override

0 commit comments

Comments
 (0)