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

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

Issue 2630633002: dart2js-kernel: special-case InvalidType in 'is' and 'as' (Closed)
Patch Set: format Created 3 years, 11 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_kernel.dart
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 2143a52da0beb781bbdfed381011121a42333100..4e0431ae2cba8cdbb0a18ee579ba955f794fd9c9 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -198,7 +198,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
field.initializer.accept(this);
HInstruction fieldValue = pop();
HInstruction checkInstruction = typeBuilder.potentiallyCheckOrTrustType(
- fieldValue, astAdapter.getDartType(field.type));
+ fieldValue, astAdapter.getDartTypeInvalidNull(field.type));
stack.add(checkInstruction);
} else {
stack.add(graph.addConstantNull(closedWorld));
@@ -962,6 +962,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitAsExpression(ir.AsExpression asExpression) {
asExpression.operand.accept(this);
HInstruction expressionInstruction = pop();
+
+ if (asExpression.type is ir.InvalidType) {
+ generateTypeError(asExpression, 'invalid type');
+ stack.add(expressionInstruction);
+ return;
+ }
+
ResolutionDartType type = astAdapter.getDartType(asExpression.type);
if (type.isMalformed) {
if (type is MalformedType) {
@@ -983,14 +990,17 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
}
- void generateError(ir.Node node, String message, TypeMask typeMask) {
+ void generateError(
+ ir.Node node, ir.Procedure procedure, String message, TypeMask typeMask) {
HInstruction errorMessage =
graph.addConstantString(new DartString.literal(message), closedWorld);
- _pushStaticInvocation(node, [errorMessage], typeMask);
+ // TODO(sra): Assocate source info from [node].
+ _pushStaticInvocation(procedure, [errorMessage], typeMask);
}
void generateTypeError(ir.Node node, String message) {
- generateError(node, message, astAdapter.throwTypeErrorType);
+ generateError(node, astAdapter.throwTypeError, message,
+ astAdapter.throwTypeErrorType);
}
@override
@@ -1320,8 +1330,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
} else {
add(new HStaticStore(
astAdapter.getMember(staticTarget),
- typeBuilder.potentiallyCheckOrTrustType(
- value, astAdapter.getDartType(staticTarget.setterType))));
+ typeBuilder.potentiallyCheckOrTrustType(value,
+ astAdapter.getDartTypeInvalidNull(staticTarget.setterType))));
}
stack.add(value);
}
@@ -1400,7 +1410,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
localsHandler.updateLocal(
local,
typeBuilder.potentiallyCheckOrTrustType(
- value, astAdapter.getDartType(variable.type)));
+ value, astAdapter.getDartTypeInvalidNull(variable.type)));
}
@override
@@ -2134,30 +2144,33 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitIsExpression(ir.IsExpression isExpression) {
isExpression.operand.accept(this);
HInstruction expression = pop();
- push(buildIsNode(isExpression, isExpression.type, expression));
+ pushIsTest(isExpression, isExpression.type, expression);
}
- HInstruction buildIsNode(
- ir.Node node, ir.DartType type, HInstruction expression) {
+ void pushIsTest(ir.Node node, ir.DartType type, HInstruction expression) {
// Note: The call to "unalias" this type like in the original SSA builder is
// unnecessary in kernel because Kernel has no notion of typedef.
// TODO(efortuna): Add test for this.
- ResolutionDartType typeValue =
- localsHandler.substInContext(astAdapter.getDartType(type));
+
if (type is ir.InvalidType) {
- generateTypeError(node, (typeValue.element as ErroneousElement).message);
- return new HIs.compound(
- typeValue, expression, pop(), commonMasks.boolType);
+ // TODO(sra): Make InvalidType carry a message.
+ generateTypeError(node, 'invalid type');
+ pop();
+ stack.add(graph.addConstantBool(true, closedWorld));
+ return;
}
+ ResolutionDartType typeValue =
+ localsHandler.substInContext(astAdapter.getDartType(type));
if (type is ir.FunctionType) {
List arguments = [buildFunctionType(typeValue), expression];
_pushDynamicInvocation(node, null, arguments,
selector: new Selector.call(
new PrivateName('_isTest', backend.helpers.jsHelperLibrary),
CallStructure.ONE_ARG));
- return new HIs.compound(
- typeValue, expression, pop(), commonMasks.boolType);
+ push(
+ new HIs.compound(typeValue, expression, pop(), commonMasks.boolType));
+ return;
}
if (type is ir.TypeParameterType) {
@@ -2165,8 +2178,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
typeBuilder.addTypeVariableReference(typeValue, sourceElement);
_pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType,
<HInstruction>[expression, runtimeType], commonMasks.boolType);
- return new HIs.variable(
- typeValue, expression, pop(), commonMasks.boolType);
+ push(
+ new HIs.variable(typeValue, expression, pop(), commonMasks.boolType));
+ return;
}
if (_isInterfaceWithNoDynamicTypes(type)) {
@@ -2189,17 +2203,20 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
];
_pushStaticInvocation(
astAdapter.checkSubtype, inputs, commonMasks.boolType);
- return new HIs.compound(
- typeValue, expression, pop(), commonMasks.boolType);
+ push(
+ new HIs.compound(typeValue, expression, pop(), commonMasks.boolType));
+ return;
}
if (backend.hasDirectCheckFor(typeValue)) {
- return new HIs.direct(typeValue, expression, commonMasks.boolType);
+ push(new HIs.direct(typeValue, expression, commonMasks.boolType));
+ return;
}
// The interceptor is not always needed. It is removed by optimization
// when the receiver type or tested type permit.
- return new HIs.raw(typeValue, expression, _interceptorFor(expression),
- commonMasks.boolType);
+ push(new HIs.raw(typeValue, expression, _interceptorFor(expression),
+ commonMasks.boolType));
+ return;
}
bool _isInterfaceWithNoDynamicTypes(ir.DartType type) {
@@ -2446,9 +2463,8 @@ class TryCatchFinallyBuilder {
void pushCondition(ir.Catch catchBlock) {
if (catchBlock.guard is! ir.DynamicType) {
- HInstruction condition = kernelBuilder.buildIsNode(
+ kernelBuilder.pushIsTest(
catchBlock.exception, catchBlock.guard, unwrappedException);
- kernelBuilder.push(condition);
} else {
kernelBuilder.stack.add(kernelBuilder.graph
Siggi Cherem (dart-lang) 2017/01/13 16:38:22 actually - should we handle `guard is DynamicType`
sra1 2017/01/13 18:53:11 Done.
.addConstantBool(true, kernelBuilder.closedWorld));
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698