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

Unified Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2981543002: Handle type variable test and typed list literal. (Closed)
Patch Set: Updated cf. comment Created 3 years, 5 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/graph_builder.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/builder_kernel.dart
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 383276378fa7dccd62be7239094d34665964a70a..abaf5a9526baa3d838a6fa4cbbd38d3bc8a8e1e7 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -117,7 +117,7 @@ class KernelSsaGraphBuilder extends ir.Visitor
this.sourceInformationBuilder,
this.functionNode) {
this.loopHandler = new KernelLoopHandler(this);
- typeBuilder = new KernelTypeBuilder(_elementMap, this);
+ typeBuilder = new TypeBuilder(this);
graph.element = targetElement;
graph.sourceInformation =
sourceInformationBuilder.buildVariableDeclaration();
@@ -1945,9 +1945,7 @@ class KernelSsaGraphBuilder extends ir.Visitor
/// Set the runtime type information if necessary.
HInstruction _setListRuntimeTypeInfoIfNeeded(
- HInstruction object, ir.ListLiteral listLiteral) {
- InterfaceType type = localsHandler.substInContext(_commonElements
- .listType(_elementMap.getDartType(listLiteral.typeArgument)));
+ HInstruction object, InterfaceType type) {
if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) {
return object;
}
@@ -1975,8 +1973,9 @@ class KernelSsaGraphBuilder extends ir.Visitor
listInstruction =
new HLiteralList(elements, commonMasks.extendableArrayType);
add(listInstruction);
- listInstruction =
- _setListRuntimeTypeInfoIfNeeded(listInstruction, listLiteral);
+ InterfaceType type = localsHandler.substInContext(_commonElements
+ .listType(_elementMap.getDartType(listLiteral.typeArgument)));
+ listInstruction = _setListRuntimeTypeInfoIfNeeded(listInstruction, type);
}
TypeMask type = _typeInferenceMap.typeOfListLiteral(
@@ -2359,6 +2358,7 @@ class KernelSsaGraphBuilder extends ir.Visitor
List<HInstruction> arguments =
_visitArgumentsForStaticTarget(target.function, invocation.arguments);
+ // TODO(johnniwinther): Move factory calls to a helper function?
if (function is ConstructorEntity && function.isFactoryConstructor) {
if (function.isExternal && function.isFromEnvironmentConstructor) {
if (invocation.isConst) {
@@ -2376,12 +2376,34 @@ class KernelSsaGraphBuilder extends ir.Visitor
// Factory constructors take type parameters; other static methods ignore
// them.
+
if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) {
_addTypeArguments(arguments, invocation.arguments);
}
- }
- _pushStaticInvocation(function, arguments, typeMask);
+ _pushStaticInvocation(function, arguments, typeMask);
+
+ bool isFixedListConstructorCall = false;
+ bool isGrowableListConstructorCall = false;
+ if (commonElements.isUnnamedListConstructor(function) &&
+ invocation.arguments.named.isEmpty) {
+ isFixedListConstructorCall =
+ invocation.arguments.positional.length == 1;
+ isGrowableListConstructorCall = invocation.arguments.positional.isEmpty;
+ }
+ bool isJSArrayTypedConstructor =
+ function == commonElements.jsArrayTypedConstructor;
+ if (rtiNeed.classNeedsRti(commonElements.listClass) &&
+ (isFixedListConstructorCall ||
+ isGrowableListConstructorCall ||
+ isJSArrayTypedConstructor)) {
+ InterfaceType type = _elementMap.createInterfaceType(
+ target.enclosingClass, invocation.arguments.types);
+ stack.add(_setListRuntimeTypeInfoIfNeeded(pop(), type));
+ }
+ } else {
+ _pushStaticInvocation(function, arguments, typeMask);
+ }
}
void handleInvokeStaticForeign(
@@ -3502,14 +3524,3 @@ class TryCatchFinallyBuilder {
kernelBuilder.inTryStatement = previouslyInTryStatement;
}
}
-
-class KernelTypeBuilder extends TypeBuilder {
- KernelToElementMapForBuilding _elementMap;
-
- KernelTypeBuilder(this._elementMap, GraphBuilder builder) : super(builder);
-
- @override
- InterfaceType getThisType(ClassEntity cls) {
- return _elementMap.elementEnvironment.getThisType(cls);
- }
-}
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/graph_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698