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

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

Issue 2404123002: Build CFG for various JS() foreign methods (Closed)
Patch Set: format 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 | « pkg/compiler/lib/src/ssa/builder_kernel.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index cf58dce460c029741be525f2d27f1f1e3a639014..8710f840ec55c9777f40d99953f7f0c12b6635c2 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:js_runtime/shared/embedded_names.dart';
import 'package:kernel/ast.dart' as ir;
import '../constants/expressions.dart';
@@ -11,11 +12,12 @@ import '../compiler.dart';
import '../constants/values.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
+import '../js/js.dart' as js;
import '../js_backend/backend_helpers.dart';
import '../js_backend/js_backend.dart';
import '../kernel/kernel.dart';
import '../kernel/kernel_debug.dart';
-import '../native/native.dart' show NativeBehavior, TypeLookup;
+import '../native/native.dart' as native;
import '../resolution/tree_elements.dart';
import '../tree/tree.dart' as ast;
import '../types/masks.dart';
@@ -241,6 +243,10 @@ class KernelAstAdapter {
return TypeMaskFactory.inferredTypeForSelector(selector, mask, _compiler);
}
+ TypeMask typeFromNativeBehavior(native.NativeBehavior nativeBehavior) {
+ return TypeMaskFactory.fromNativeBehavior(nativeBehavior, _compiler);
+ }
+
ConstantValue getConstantFor(ir.Node node) {
ConstantValue constantValue =
_backend.constants.getConstantValueForNode(getNode(node), elements);
@@ -309,6 +315,45 @@ class KernelAstAdapter {
ir.Class get objectClass => kernel.classes[_compiler.coreClasses.objectClass];
+ ir.Procedure get currentIsolate =>
+ kernel.functions[_backend.helpers.currentIsolate];
+
+ bool isInForeignLibrary(ir.Member member) =>
+ _backend.isForeign(getElement(member));
+
+ native.NativeBehavior getNativeBehavior(ir.Node node) {
+ return elements.getNativeData(getNode(node));
+ }
+
+ js.Name getNameForJsGetName(ir.Node argument, ConstantValue constant) {
+ int index = _extractEnumIndexFromConstantValue(
+ constant, _backend.helpers.jsGetNameEnum);
+ if (index == null) return null;
+ return _backend.namer
+ .getNameForJsGetName(getNode(argument), JsGetName.values[index]);
+ }
+
+ js.Template getJsBuiltinTemplate(ConstantValue constant) {
+ int index = _extractEnumIndexFromConstantValue(
+ constant, _backend.helpers.jsBuiltinEnum);
+ if (index == null) return null;
+ return _backend.emitter.builtinTemplateFor(JsBuiltin.values[index]);
+ }
+
+ int _extractEnumIndexFromConstantValue(
+ ConstantValue constant, Element classElement) {
+ if (constant is ConstructedConstantValue) {
+ if (constant.type.element == classElement) {
+ assert(constant.fields.length == 1);
+ ConstantValue indexConstant = constant.fields.values.single;
+ if (indexConstant is IntConstantValue) {
+ return indexConstant.primitiveValue;
+ }
+ }
+ }
+ return null;
+ }
+
DartType getDartType(ir.DartType type) {
return type.accept(_typeConverter);
}
@@ -382,10 +427,10 @@ class KernelAstAdapter {
}
/// Looks up [typeName] for use in the spec-string of a `JS` called.
- // TODO(johnniwinther): Use this in [NativeBehavior] instead of calling the
+ // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling the
// `ForeignResolver`.
// TODO(johnniwinther): Cache the result to avoid redundant lookups?
- TypeLookup _typeLookup({bool resolveAsRaw: true}) {
+ native.TypeLookup _typeLookup({bool resolveAsRaw: true}) {
return (String typeName) {
DartType findIn(Uri uri) {
LibraryElement library = _compiler.libraryLoader.lookupLibrary(uri);
@@ -417,30 +462,30 @@ class KernelAstAdapter {
return node.arguments.positional[index].accept(new Stringifier());
}
- /// Computes the [NativeBehavior] for a call to the [JS] function.
+ /// Computes the [native.NativeBehavior] for a call to the [JS] function.
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
+ native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
if (node.arguments.positional.length < 2 ||
node.arguments.named.isNotEmpty) {
reporter.reportErrorMessage(
CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS);
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
String specString = _getStringArgument(node, 0);
if (specString == null) {
reporter.reportErrorMessage(
CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST);
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
String codeString = _getStringArgument(node, 1);
if (codeString == null) {
reporter.reportErrorMessage(
CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND);
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
- return NativeBehavior.ofJsCall(
+ return native.NativeBehavior.ofJsCall(
specString,
codeString,
_typeLookup(resolveAsRaw: true),
@@ -449,26 +494,27 @@ class KernelAstAdapter {
_compiler.coreTypes);
}
- /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN] function.
+ /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN] function.
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node) {
+ native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
+ ir.StaticInvocation node) {
if (node.arguments.positional.length < 1) {
reporter.internalError(
CURRENT_ELEMENT_SPANNABLE, "JS builtin expression has no type.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
if (node.arguments.positional.length < 2) {
reporter.internalError(
CURRENT_ELEMENT_SPANNABLE, "JS builtin is missing name.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
String specString = _getStringArgument(node, 0);
if (specString == null) {
reporter.internalError(
CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
- return NativeBehavior.ofJsBuiltinCall(
+ return native.NativeBehavior.ofJsBuiltinCall(
specString,
_typeLookup(resolveAsRaw: true),
CURRENT_ELEMENT_SPANNABLE,
@@ -476,34 +522,34 @@ class KernelAstAdapter {
_compiler.coreTypes);
}
- /// Computes the [NativeBehavior] for a call to the [JS_EMBEDDED_GLOBAL]
+ /// Computes the [native.NativeBehavior] for a call to the [JS_EMBEDDED_GLOBAL]
/// function.
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+ native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
ir.StaticInvocation node) {
if (node.arguments.positional.length < 1) {
reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
"JS embedded global expression has no type.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
if (node.arguments.positional.length < 2) {
reporter.internalError(
CURRENT_ELEMENT_SPANNABLE, "JS embedded global is missing name.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
if (node.arguments.positional.length > 2 ||
node.arguments.named.isNotEmpty) {
reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
"JS embedded global has more than 2 arguments.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
String specString = _getStringArgument(node, 0);
if (specString == null) {
reporter.internalError(
CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
- return new NativeBehavior();
+ return new native.NativeBehavior();
}
- return NativeBehavior.ofJsEmbeddedGlobalCall(
+ return native.NativeBehavior.ofJsEmbeddedGlobalCall(
specString,
_typeLookup(resolveAsRaw: true),
CURRENT_ELEMENT_SPANNABLE,
@@ -528,28 +574,28 @@ class KernelAstAdapter {
/// Computes the native behavior for reading the native [field].
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) {
+ native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) {
DartType type = getDartType(field.type);
List<ConstantExpression> metadata = getMetadata(field.annotations);
- return NativeBehavior.ofFieldLoad(CURRENT_ELEMENT_SPANNABLE, type, metadata,
- _typeLookup(resolveAsRaw: false), _compiler,
+ return native.NativeBehavior.ofFieldLoad(CURRENT_ELEMENT_SPANNABLE, type,
+ metadata, _typeLookup(resolveAsRaw: false), _compiler,
isJsInterop: false);
}
/// Computes the native behavior for writing to the native [field].
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
+ native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
DartType type = getDartType(field.type);
- return NativeBehavior.ofFieldStore(type, _compiler.resolution);
+ return native.NativeBehavior.ofFieldStore(type, _compiler.resolution);
}
/// Computes the native behavior for calling [procedure].
// TODO(johnniwinther): Cache this for later use.
- NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) {
+ native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) {
DartType type = getFunctionType(procedure.function);
List<ConstantExpression> metadata = getMetadata(procedure.annotations);
- return NativeBehavior.ofMethod(CURRENT_ELEMENT_SPANNABLE, type, metadata,
- _typeLookup(resolveAsRaw: false), _compiler,
+ return native.NativeBehavior.ofMethod(CURRENT_ELEMENT_SPANNABLE, type,
+ metadata, _typeLookup(resolveAsRaw: false), _compiler,
isJsInterop: false);
}
}
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder_kernel.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698