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

Unified Diff: pkg/compiler/lib/src/js_emitter/native_emitter.dart

Issue 1318043005: Support user generated custom native JS classes. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: about to land Created 5 years, 2 months 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
Index: pkg/compiler/lib/src/js_emitter/native_emitter.dart
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index d78ac6d1d7d0cae8889863f683ba4a5ef091adc7..9f873350492e6acf125516f74c61cb330a94d541 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -134,8 +134,9 @@ class NativeEmitter {
} else if (extensionPoints.containsKey(cls)) {
needed = true;
}
- if (cls.isNative &&
- native.nativeTagsForcedNonLeaf(classElement)) {
+ if (classElement.isJsInterop) {
+ needed = true; // TODO(jacobr): we don't need all interop classes.
+ } else if (cls.isNative && native.nativeTagsForcedNonLeaf(classElement)) {
needed = true;
nonLeafClasses.add(cls);
}
@@ -154,6 +155,7 @@ class NativeEmitter {
for (Class cls in classes) {
if (!cls.isNative) continue;
+ if (cls.element.isJsInterop) continue;
List<String> nativeTags = native.nativeTagsOfClass(cls.element);
if (nonLeafClasses.contains(cls) ||
@@ -294,7 +296,7 @@ class NativeEmitter {
// The target JS function may check arguments.length so we need to
// make sure not to pass any unspecified optional arguments to it.
// For example, for the following Dart method:
- // foo([x, y, z]);
+ // foo({x, y, z});
// The call:
// foo(y: 1)
// must be turned into a JS call to:
@@ -319,9 +321,20 @@ class NativeEmitter {
} else {
// Native methods that are not intercepted must be static.
assert(invariant(member, member.isStatic));
- receiver = js('this');
arguments = argumentsBuffer.sublist(0,
indexOfLastOptionalArgumentInParameters + 1);
+ if (member.isJsInterop) {
+ // fixedBackendPath is allowed to have the form foo.bar.baz for
+ // interop. This template is uncached to avoid possibly running out of
+ // memory when Dart2Js is run in server mode. In reality the risk of
+ // caching these templates causing an issue is very low as each class
+ // and library that uses typed JavaScript interop will create only 1
+ // unique template.
+ receiver = js.uncachedExpressionTemplate(
+ backend.namer.fixedBackendPath(member)).instantiate([]);
+ } else {
+ receiver = js('this');
+ }
}
statements.add(
js.statement('return #.#(#)', [receiver, target, arguments]));

Powered by Google App Engine
This is Rietveld 408576698