| Index: dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| index a0df3633e7c96c59ff7c62d9097470995719c6a2..4bbbd968398778ced44f4470657381d22c3cfe17 100644
|
| --- a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| +++ b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| @@ -1885,6 +1885,19 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
|
| original, typeVariable);
|
| } else if (type.kind == TypeKind.FUNCTION) {
|
| + // HERE
|
| + String name = kind == HTypeConversion.CAST_TYPE_CHECK
|
| + ? '_asCheck' : '_assertCheck';
|
| +
|
| + List arguments = [buildFunctionType(type), original];
|
| + pushInvokeDynamic(
|
| + null,
|
| + new Selector.call(name, compiler.jsHelperLibrary, 1),
|
| + arguments);
|
| +
|
| + return new HTypeConversion(type, kind, original.instructionType, pop());
|
| +/*
|
| +
|
| if (backend.rti.isSimpleFunctionType(type)) {
|
| return original.convertType(compiler, type, kind);
|
| }
|
| @@ -1906,6 +1919,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| } else {
|
| return new HTypeConversion(type, kind, subtype, original);
|
| }
|
| +*/
|
| } else {
|
| return original.convertType(compiler, type, kind);
|
| }
|
| @@ -2014,7 +2028,9 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| }
|
|
|
| HInstruction attachPosition(HInstruction target, Node node) {
|
| - target.sourcePosition = sourceFileLocationForBeginToken(node);
|
| + if (node != null) {
|
| + target.sourcePosition = sourceFileLocationForBeginToken(node);
|
| + }
|
| return target;
|
| }
|
|
|
| @@ -2916,9 +2932,39 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| return buildLiteralList(inputs);
|
| }
|
|
|
| + HInstruction buildFunctionType(FunctionType type) {
|
| + List<HInstruction> typeVariables = <HInstruction>[];
|
| + bool hasDirectTypeVariables =
|
| + !currentElement.enclosingElement.isClosure() &&
|
| + currentElement.isInstanceMember();
|
| +
|
| + type.forEachTypeVariable((TypeVariableType variable) {
|
| + if (hasDirectTypeVariables) {
|
| + HInstruction receiver = localsHandler.readThis();
|
| + push(new HReadTypeVariable(variable, receiver));
|
| + } else {
|
| + push(
|
| + new HReadTypeVariable.noReceiver(
|
| + variable, addTypeVariableReference(variable)));
|
| + }
|
| + typeVariables.add(pop());
|
| + });
|
| + push(new HFunctionType(typeVariables, type));
|
| + return pop();
|
| + }
|
| +
|
| HInstruction buildIsNode(Node node, DartType type, HInstruction expression) {
|
| type = type.unalias(compiler);
|
| if (type.kind == TypeKind.FUNCTION) {
|
| + // HERE
|
| + List arguments = [buildFunctionType(type), expression];
|
| + pushInvokeDynamic(
|
| + node, new Selector.call('_isTest', compiler.jsHelperLibrary, 1),
|
| + arguments);
|
| +
|
| + return new HIs.compound(type, expression, pop());
|
| +
|
| +/*
|
| if (backend.rti.isSimpleFunctionType(type)) {
|
| // TODO(johnniwinther): Avoid interceptor if unneeded.
|
| return new HIs.raw(type, expression, invokeInterceptor(expression));
|
| @@ -2960,6 +3006,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| pushInvokeStatic(node, checkFunctionSubtype, inputs, HType.BOOLEAN);
|
| HInstruction call = pop();
|
| return new HIs.compound(type, expression, call);
|
| +*/
|
| } else if (type.kind == TypeKind.TYPE_VARIABLE) {
|
| HInstruction runtimeType = addTypeVariableReference(type);
|
| Element helper = backend.getCheckSubtypeOfRuntimeType();
|
|
|