Chromium Code Reviews| 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 7c92668d3bc5630a4107d735214fef475073b9ce..710b4d521005e8670fc73cb839c58deec5eb567d 100644 |
| --- a/pkg/compiler/lib/src/ssa/builder_kernel.dart |
| +++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
| @@ -1942,49 +1942,71 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
| } |
| HInstruction buildIsNode( |
| - ir.Node node, ir.DartType dart_type, HInstruction expression) { |
| - // TODO(sra): Convert the type testing logic here to use ir.DartType. |
| - DartType type = astAdapter.getDartType(dart_type); |
| - |
| - type = localsHandler.substInContext(type).unaliased; |
|
Siggi Cherem (dart-lang)
2016/12/20 22:37:29
Are the kernel type-variables substituted by the t
|
| - |
| - if (type is MethodTypeVariableType) { |
| - return graph.addConstantBool(true, closedWorld); |
| - } |
| - |
| - if (type is MalformedType) { |
| - ErroneousElement element = type.element; |
| - generateTypeError(node, element.message); |
| - return new HIs.compound(type, expression, pop(), commonMasks.boolType); |
| - } |
| - |
| - if (type.isFunctionType) { |
| - List arguments = <HInstruction>[buildFunctionType(type), expression]; |
| - _pushDynamicInvocation(node, commonMasks.boolType, arguments, |
| + ir.Node node, ir.DartType type, HInstruction expression) { |
| + if (type is ir.InvalidType) { |
| + generateTypeError(node, |
| + (astAdapter.getDartType(type).element as ErroneousElement).message); |
|
Siggi Cherem (dart-lang)
2016/12/20 22:37:30
we call astAdapter.getDartType on all branches her
Emily Fortuna
2016/12/22 19:22:12
Done.
|
| + return new HIs.compound(astAdapter.getDartType(type), expression, pop(), |
| + commonMasks.boolType); |
| + } else if (type is ir.FunctionType) { |
|
Siggi Cherem (dart-lang)
2016/12/20 22:37:30
style nit (here and below): I know this comes from
Emily Fortuna
2016/12/22 19:22:12
ah, I didn't know this was the preferred style. Fi
|
| + List arguments = [ |
| + buildFunctionType(astAdapter.getDartType(type)), |
| + expression |
| + ]; |
| + _pushDynamicInvocation(node, null, arguments, |
| selector: new Selector.call( |
| - new PrivateName('_isTest', astAdapter.jsHelperLibrary), |
| + new PrivateName('_isTest', backend.helpers.jsHelperLibrary), |
| CallStructure.ONE_ARG)); |
| - return new HIs.compound(type, expression, pop(), commonMasks.boolType); |
| - } |
| - |
| - if (type.isTypeVariable) { |
| - HInstruction runtimeType = |
| - typeBuilder.addTypeVariableReference(type, sourceElement); |
| + return new HIs.compound(astAdapter.getDartType(type), expression, pop(), |
| + commonMasks.boolType); |
| + } else if (type is ir.TypeParameterType) { |
| + HInstruction runtimeType = typeBuilder.addTypeVariableReference( |
| + astAdapter.getDartType(type), sourceElement); |
| _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType, |
| <HInstruction>[expression, runtimeType], commonMasks.boolType); |
| - return new HIs.variable(type, expression, pop(), commonMasks.boolType); |
| - } |
| - |
| - // TODO(sra): Type with type parameters. |
| - |
| - if (backend.hasDirectCheckFor(type)) { |
| - return new HIs.direct(type, expression, commonMasks.boolType); |
| + return new HIs.variable(astAdapter.getDartType(type), expression, pop(), |
| + commonMasks.boolType); |
| + } else if (_isInterfaceWithNoRawTypes(type)) { |
| + HInstruction representations = |
| + typeBuilder.buildTypeArgumentRepresentations( |
| + astAdapter.getDartType(type), sourceElement); |
| + add(representations); |
| + ClassElement element = astAdapter.getDartType(type).element; |
| + js.Name operator = backend.namer.operatorIs(element); |
| + HInstruction isFieldName = |
| + graph.addConstantStringFromName(operator, closedWorld); |
| + HInstruction asFieldName = |
| + closedWorld.hasAnyStrictSubtype(element) |
| + ? graph.addConstantStringFromName( |
| + backend.namer.substitutionName(element), closedWorld) |
| + : graph.addConstantNull(closedWorld); |
| + List<HInstruction> inputs = <HInstruction>[ |
| + expression, |
| + isFieldName, |
| + representations, |
| + asFieldName |
| + ]; |
| + _pushStaticInvocation( |
| + astAdapter.checkSubtype, inputs, commonMasks.boolType); |
| + return new HIs.compound(astAdapter.getDartType(type), expression, pop(), |
| + commonMasks.boolType); |
| + } else { |
| + if (backend.hasDirectCheckFor(astAdapter.getDartType(type))) { |
| + return new HIs.direct( |
| + astAdapter.getDartType(type), expression, commonMasks.boolType); |
| + } |
| + // The interceptor is not always needed. It is removed by optimization |
| + // when the receiver type or tested type permit. |
| + return new HIs.raw(astAdapter.getDartType(type), expression, |
| + _interceptorFor(expression), commonMasks.boolType); |
| } |
| + } |
| - // The interceptor is not always needed. It is removed by optimization |
| - // when the receiver type or tested type permit. |
| - HInterceptor interceptor = _interceptorFor(expression); |
| - return new HIs.raw(type, expression, interceptor, commonMasks.boolType); |
| + bool _isInterfaceWithNoRawTypes(ir.DartType type) { |
|
Siggi Cherem (dart-lang)
2016/12/20 22:37:30
nit: we might need a different name here. One idea
Emily Fortuna
2016/12/22 19:22:12
Done.
|
| + return type is ir.InterfaceType && |
| + (type as ir.InterfaceType) |
| + .typeArguments |
| + .any((ir.DartType typeArgType) => typeArgType is! ir.DynamicType); |
|
Siggi Cherem (dart-lang)
2016/12/20 22:37:30
I believe we should also exclude a couple other ca
Emily Fortuna
2016/12/22 19:22:12
Done.
|
| } |
| @override |