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

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

Issue 1976213002: Adjusts dart2js backend to handle method type arguments. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Made MethodTypeVariableType malformed, eliminated malformMethodTypeVariableType Created 4 years, 7 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/ssa/builder.dart
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 1a754fd18f29628daabe4c52d8651e26dd3bbd0d..1740338b4d33aeaab31424c029d95085f7f477e0 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -2587,13 +2587,17 @@ class SsaBuilder extends ast.Visitor
"${localsHandler.contextClass}.");
}
- /// Build a [HTypeConversion] for convertion [original] to type [type].
+ /// Build a [HTypeConversion] for converting [original] to type [type].
///
/// Invariant: [type] must be valid in the context.
/// See [LocalsHandler.substInContext].
HInstruction buildTypeConversion(
HInstruction original, DartType type, int kind) {
if (type == null) return original;
+ // GENERIC_METHODS: The following statement was added for parsing and
+ // ignoring method type variables; must be generalized for full support of
+ // generic methods.
+ type = type.dynamifyMethodTypeVariableType;
type = type.unaliased;
assert(assertTypeInContext(type, original));
if (type.isInterfaceType && !type.treatAsRaw) {
@@ -3814,8 +3818,15 @@ class SsaBuilder extends ast.Visitor
void visitAs(ast.Send node, ast.Node expression, DartType type, _) {
HInstruction expressionInstruction = visitAndPop(expression);
if (type.isMalformed) {
- ErroneousElement element = type.element;
- generateTypeError(node, element.message);
+ String message;
+ if (type is MalformedType) {
+ ErroneousElement element = type.element;
+ message = element.message;
+ } else {
+ assert(type is MethodTypeVariableType);
+ message = "Method type variables are not reified.";
+ }
+ generateTypeError(node, message);
} else {
HInstruction converted = buildTypeConversion(expressionInstruction,
localsHandler.substInContext(type), HTypeConversion.CAST_TYPE_CHECK);
@@ -3841,7 +3852,20 @@ class SsaBuilder extends ast.Visitor
HInstruction buildIsNode(
ast.Node node, DartType type, HInstruction expression) {
type = localsHandler.substInContext(type).unaliased;
- if (type.isFunctionType) {
+ if (type.isMalformed) {
+ String message;
+ if (type is MethodTypeVariableType) {
+ message = "Method type variables are not reified, "
+ "so they cannot be tested with an `is` expression.";
+ } else {
+ assert(type is MalformedType);
+ ErroneousElement element = type.element;
+ message = element.message;
+ }
+ generateTypeError(node, message);
+ HInstruction call = pop();
+ return new HIs.compound(type, expression, call, backend.boolType);
+ } else if (type.isFunctionType) {
List arguments = [buildFunctionType(type), expression];
pushInvokeDynamic(
node,
@@ -3876,11 +3900,6 @@ class SsaBuilder extends ast.Visitor
pushInvokeStatic(node, helper, inputs, typeMask: backend.boolType);
HInstruction call = pop();
return new HIs.compound(type, expression, call, backend.boolType);
- } else if (type.isMalformed) {
- ErroneousElement element = type.element;
- generateTypeError(node, element.message);
- HInstruction call = pop();
- return new HIs.compound(type, expression, call, backend.boolType);
} else {
if (backend.hasDirectCheckFor(type)) {
return new HIs.direct(type, expression, backend.boolType);
@@ -5346,12 +5365,19 @@ class SsaBuilder extends ast.Visitor
/// Generate the literal for [typeVariable] in the current context.
void generateTypeVariableLiteral(
ast.Send node, TypeVariableType typeVariable) {
- DartType type = localsHandler.substInContext(typeVariable);
- HInstruction value = analyzeTypeArgument(type,
- sourceInformation: sourceInformationBuilder.buildGet(node));
- pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
- typeMask: backend.stringType);
- pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
+ // GENERIC_METHODS: This provides thin support for method type variables
+ // by treating them as malformed when evaluated as a literal. For full
+ // support of generic methods this must be revised.
+ if (typeVariable is MethodTypeVariableType) {
+ generateTypeError(node, "Method type variables are not reified");
+ } else {
+ DartType type = localsHandler.substInContext(typeVariable);
+ HInstruction value = analyzeTypeArgument(type,
+ sourceInformation: sourceInformationBuilder.buildGet(node));
+ pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
+ typeMask: backend.stringType);
+ pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
+ }
}
/// Generate a call to a type literal.

Powered by Google App Engine
This is Rietveld 408576698