dart2js/kernel: Implement type literal (constant) and JS_INTERCEPTOR_CONSTANT

R=sigmund@google.com

Review URL: https://codereview.chromium.org/2529483002 .
This commit is contained in:
Stephen Adams 2016-11-22 14:44:30 -08:00
parent 4e762c8dbf
commit 9e80530980
2 changed files with 53 additions and 2 deletions

View file

@ -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';
@ -867,6 +872,24 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
mapEntry.key.accept(this);
}
@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;
@ -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) {

View file

@ -255,6 +255,11 @@ class KernelAstAdapter {
return constantValue;
}
ConstantValue getConstantForType(ir.DartType irType) {
DartType type = getDartType(irType);
return _backend.constantSystem.createType(_compiler, type.asRaw());
}
bool isIntercepted(ir.Node node) {
Selector selector = getSelector(node);
return _backend.isInterceptedSelector(selector);