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

Unified Diff: pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart

Issue 3002313002: Use KernelTypeGraphBuilder in KernelInferrerEngine (Closed)
Patch Set: Updated cf. comments. Created 3 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
diff --git a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
index ef8b455a7738552dd70c70d7e074e9c993aee4ea..86dc99775d3ff94d191d69fdd9e2c21b35406e11 100644
--- a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
@@ -4,11 +4,18 @@
import 'package:kernel/ast.dart' as ir;
+import '../closure.dart';
+import '../common.dart';
+import '../common_elements.dart';
import '../compiler.dart';
import '../constants/values.dart';
import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../kernel/element_map.dart';
+import '../js_model/locals.dart';
import '../types/types.dart';
import '../world.dart';
+import 'builder_kernel.dart';
import 'inferrer_engine.dart';
import 'type_graph_inferrer.dart';
import 'type_graph_nodes.dart';
@@ -16,16 +23,25 @@ import 'type_system.dart';
class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> {
final Compiler _compiler;
+ final KernelToElementMapForBuilding _elementMap;
+ final GlobalLocalsMap _globalLocalsMap;
+ final ClosureDataLookup<ir.Node> _closureDataLookup;
- KernelTypeGraphInferrer(this._compiler, ClosedWorld closedWorld,
- ClosedWorldRefiner closedWorldRefiner, {bool disableTypeInference: false})
+ KernelTypeGraphInferrer(
+ this._compiler,
+ this._elementMap,
+ this._globalLocalsMap,
+ this._closureDataLookup,
+ ClosedWorld closedWorld,
+ ClosedWorldRefiner closedWorldRefiner,
+ {bool disableTypeInference: false})
: super(closedWorld, closedWorldRefiner,
disableTypeInference: disableTypeInference);
@override
InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) {
- return new KernelInferrerEngine(
- _compiler, closedWorld, closedWorldRefiner, main);
+ return new KernelInferrerEngine(_compiler, _elementMap, _globalLocalsMap,
+ _closureDataLookup, closedWorld, closedWorldRefiner, main);
}
@override
@@ -61,10 +77,25 @@ class KernelGlobalTypeInferenceResults
}
class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
- KernelInferrerEngine(Compiler compiler, ClosedWorld closedWorld,
- ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement)
- : super(compiler, closedWorld, closedWorldRefiner, mainElement,
- const KernelTypeSystemStrategy());
+ final KernelToElementMapForBuilding _elementMap;
+ final GlobalLocalsMap _globalLocalsMap;
+ final ClosureDataLookup<ir.Node> _closureDataLookup;
+
+ KernelInferrerEngine(
+ Compiler compiler,
+ this._elementMap,
+ this._globalLocalsMap,
+ this._closureDataLookup,
+ ClosedWorld closedWorld,
+ ClosedWorldRefiner closedWorldRefiner,
+ FunctionEntity mainElement)
+ : super(
+ compiler,
+ closedWorld,
+ closedWorldRefiner,
+ mainElement,
+ new KernelTypeSystemStrategy(
+ _elementMap, _globalLocalsMap, _closureDataLookup));
@override
ConstantValue getFieldConstant(FieldEntity field) {
@@ -81,8 +112,9 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
@override
TypeInformation computeMemberTypeInformation(
MemberEntity member, ir.Node body) {
- throw new UnimplementedError(
- 'KernelInferrerEngine.computeMemberTypeInformation');
+ KernelTypeGraphBuilder visitor =
+ new KernelTypeGraphBuilder(member, compiler, _elementMap, this);
+ return visitor.run();
}
@override
@@ -97,12 +129,45 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
@override
ir.Node computeMemberBody(MemberEntity member) {
- throw new UnimplementedError('KernelInferrerEngine.computeMemberBody');
+ MemberDefinition definition = _elementMap.getMemberDefinition(member);
+ switch (definition.kind) {
+ case MemberKind.regular:
+ ir.Member node = definition.node;
+ if (node is ir.Field) {
+ return node.initializer;
+ } else if (node is ir.Procedure) {
+ return node.function;
+ }
+ break;
+ case MemberKind.constructor:
+ case MemberKind.constructorBody:
+ ir.Member node = definition.node;
+ if (node is ir.Constructor) {
+ return node.function;
+ } else if (node is ir.Procedure) {
+ return node.function;
+ }
+ break;
+ case MemberKind.closureCall:
+ ir.Member node = definition.node;
+ if (node is ir.FunctionDeclaration) {
+ return node.function;
+ } else if (node is ir.FunctionExpression) {
+ return node.function;
+ }
+ break;
+ case MemberKind.closureField:
+ break;
+ }
+ failedAt(member, 'Unexpected member definition: $definition.');
+ return null;
}
@override
int computeMemberSize(MemberEntity member) {
- throw new UnimplementedError('KernelInferrerEngine.computeMemberSize');
+ // TODO(johnniwinther): Find an ordering that can be shared between the
+ // front ends.
+ return 0;
}
@override
@@ -112,7 +177,14 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
}
class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
- const KernelTypeSystemStrategy();
+ KernelToElementMapForBuilding _elementMap;
+ GlobalLocalsMap _globalLocalsMap;
+ ClosureDataLookup<ir.Node> _closureDataLookup;
+
+ KernelTypeSystemStrategy(
+ this._elementMap, this._globalLocalsMap, this._closureDataLookup);
+
+ ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
@override
bool checkClassEntity(ClassEntity cls) => true;
@@ -137,13 +209,62 @@ class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
@override
ParameterTypeInformation createParameterTypeInformation(
Local parameter, TypeSystem<ir.Node> types) {
- throw new UnimplementedError(
- 'KernelTypeSystemStrategy.createParameterTypeInformation');
+ MemberEntity context = parameter.memberContext;
+ KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(context);
+ ir.FunctionNode functionNode =
+ localsMap.getFunctionNodeForParameter(parameter);
+ DartType type =
+ _elementMap.getDartType(localsMap.getParameterType(parameter));
+ MemberEntity member;
+ bool isClosure = false;
+ if (functionNode.parent is ir.Member) {
+ member = _elementMap.getMember(functionNode.parent);
+ } else if (functionNode.parent is ir.FunctionExpression ||
+ functionNode.parent is ir.FunctionDeclaration) {
+ ClosureRepresentationInfo info =
+ _closureDataLookup.getClosureInfo(functionNode.parent);
+ member = info.callMethod;
+ isClosure = true;
+ }
+ MemberTypeInformation memberTypeInformation =
+ types.getInferredTypeOfMember(member);
+ if (isClosure) {
+ return new ParameterTypeInformation.localFunction(
+ memberTypeInformation, parameter, type, member);
+ } else if (member.isInstanceMember) {
+ return new ParameterTypeInformation.instanceMember(memberTypeInformation,
+ parameter, type, member, new ParameterAssignments());
+ } else {
+ return new ParameterTypeInformation.static(
+ memberTypeInformation, parameter, type, member);
+ }
}
@override
MemberTypeInformation createMemberTypeInformation(MemberEntity member) {
- throw new UnimplementedError(
- 'KernelTypeSystemStrategy.createParameterTypeInformation');
+ if (member.isField) {
+ FieldEntity field = member;
+ DartType type = _elementEnvironment.getFieldType(field);
+ return new FieldTypeInformation(field, type);
+ } else if (member.isGetter) {
+ FunctionEntity getter = member;
+ DartType type = _elementEnvironment.getFunctionType(getter);
+ return new GetterTypeInformation(getter, type);
+ } else if (member.isSetter) {
+ FunctionEntity setter = member;
+ return new SetterTypeInformation(setter);
+ } else if (member.isFunction) {
+ FunctionEntity method = member;
+ DartType type = _elementEnvironment.getFunctionType(method);
+ return new MethodTypeInformation(method, type);
+ } else {
+ ConstructorEntity constructor = member;
+ if (constructor.isFactoryConstructor) {
+ DartType type = _elementEnvironment.getFunctionType(constructor);
+ return new FactoryConstructorTypeInformation(constructor, type);
+ } else {
+ return new GenerativeConstructorTypeInformation(constructor);
+ }
+ }
}
}
« no previous file with comments | « pkg/compiler/lib/src/inferrer/inferrer_engine.dart ('k') | pkg/compiler/lib/src/inferrer/locals_handler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698