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 8ea98e335a3eec3d501e1e4f38c27686efc71c92..b5a458c26db567032d40e9211aa509d3b8752ee9 100644 |
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart |
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
@@ -9,7 +9,12 @@ import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
import '../common/names.dart'; |
import '../common/tasks.dart' show CompilerTask; |
import '../compiler.dart'; |
-import '../constants/values.dart' show StringConstantValue; |
+import '../constants/values.dart' |
+ show |
+ ConstantValue, |
+ InterceptorConstantValue, |
+ StringConstantValue, |
+ TypeConstantValue; |
import '../dart_types.dart'; |
import '../elements/elements.dart'; |
import '../io/source_information.dart'; |
@@ -868,6 +873,24 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
} |
@override |
+ void visitTypeLiteral(ir.TypeLiteral typeLiteral) { |
+ ir.DartType type = typeLiteral.type; |
+ if (type is ir.InterfaceType) { |
+ ConstantValue constant = astAdapter.getConstantForType(type); |
+ stack.add(graph.addConstant(constant, compiler)); |
+ return; |
+ } |
+ if (type is ir.TypeParameterType) { |
+ // TODO(27394): Load type parameter from current 'this' object. |
+ defaultExpression(typeLiteral); |
+ return; |
+ } |
+ // TODO(27394): 'dynamic' and function types observed. Where are they from? |
+ defaultExpression(typeLiteral); |
+ return; |
+ } |
+ |
+ @override |
void visitStaticGet(ir.StaticGet staticGet) { |
ir.Member staticTarget = staticGet.target; |
if (staticTarget is ir.Procedure && |
@@ -1311,7 +1334,30 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
} |
void handleJsInterceptorConstant(ir.StaticInvocation invocation) { |
- unhandledForeign(invocation); |
+ // Single argument must be a TypeConstant which is converted into a |
+ // InterceptorConstant. |
+ if (_unexpectedForeignArguments(invocation, 1, 1)) { |
+ stack.add(graph.addConstantNull(compiler)); // Result expected on stack. |
+ return; |
+ } |
+ ir.Expression argument = invocation.arguments.positional.single; |
+ argument.accept(this); |
+ HInstruction argumentInstruction = pop(); |
+ if (argumentInstruction is HConstant) { |
+ ConstantValue argumentConstant = argumentInstruction.constant; |
+ if (argumentConstant is TypeConstantValue) { |
+ // TODO(sra): Check that type is a subclass of [Interceptor]. |
+ ConstantValue constant = |
+ new InterceptorConstantValue(argumentConstant.representedType); |
+ HInstruction instruction = graph.addConstant(constant, compiler); |
+ stack.add(instruction); |
+ return; |
+ } |
+ } |
+ |
+ compiler.reporter.reportErrorMessage(astAdapter.getNode(invocation), |
+ MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
+ stack.add(graph.addConstantNull(compiler)); |
} |
void handleForeignJs(ir.StaticInvocation invocation) { |