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

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

Issue 2529483002: dart2js/kernel: Implement type literal and JS_INTERCEPTOR_CONSTANT (Closed)
Patch Set: remove comment Created 4 years, 1 month 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698