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

Unified Diff: sdk/lib/_internal/compiler/implementation/deferred_load.dart

Issue 232563006: Insert checks before deferred calls and accesses. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 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: sdk/lib/_internal/compiler/implementation/deferred_load.dart
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 294fb34711d5617e3d287a62db580380720d297f..241e06fb4222ec04f5920bd41089ca7b2e785120 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -12,11 +12,15 @@ import 'dart2jslib.dart' show
ConstructedConstant,
MessageKind,
StringConstant,
- invariant;
+ invariant,
+ Backend;
import 'dart_backend/dart_backend.dart' show
DartBackend;
+import 'js_backend/js_backend.dart' show
+ JavaScriptBackend;
+
import 'elements/elements.dart' show
Element,
ClassElement,
@@ -43,6 +47,8 @@ import 'tree/tree.dart' show
LiteralString,
LiteralDartString;
+import 'tree/tree.dart' as ast;
+
import 'resolution/resolution.dart' show
TreeElements;
@@ -175,6 +181,11 @@ class DeferredLoadTask extends CompilerTask {
return outputUnitForElement(element) != mainOutputUnit;
}
+ /// Returns true if e1 and e2 are in the same output unit.
+ bool inSameOutputUnit(Element e1, Element e2) {
+ return outputUnitForElement(e1) == outputUnitForElement(e2);
+ }
+
/// Mark that [import] is part of the [OutputputUnit] for [element].
///
/// [element] can be either a [Constant] or an [Element].
@@ -252,10 +263,12 @@ class DeferredLoadTask extends CompilerTask {
/// Returns a [Link] of every [Import] that imports [element] into [library].
Link<Import> _getImports(Element element, LibraryElement library) {
- if (!element.isTopLevel()) {
+ if (element.isMember()) {
element = element.getEnclosingClass();
}
-
+ if (element.isAccessor()) {
+ element = (element as FunctionElement).abstractField;
+ }
return library.getImportsFor(element);
}
@@ -777,6 +790,10 @@ class DeferredLoadTask extends CompilerTask {
}
});
}
+ Backend backend = compiler.backend;
+ if (splitProgram && backend is JavaScriptBackend) {
+ backend.registerCheckDeferredIsLoaded(compiler.globalDependencies);
+ }
if (splitProgram && backend is DartBackend) {
// TODO(sigurdm): Implement deferred loading for dart2dart.
splitProgram = false;
@@ -785,4 +802,34 @@ class DeferredLoadTask extends CompilerTask {
MessageKind.DEFERRED_LIBRARY_DART_2_DART);
}
}
+
+ /// Returns the prefixElement associated with the first prefix of [send] in
+ /// the context of [elements] if the prefix of the send resolves to a deferred
+ /// import. Otherwise returns null.
+ PrefixElement deferredPrefixElement(ast.Send send, TreeElements elements) {
+ Element element = elements[send];
+ if (element != null && element.isDeferredLoaderGetter()) return null;
+ ast.Node firstNode(ast.Node node) {
+ if (node is! ast.Send) {
+ return node;
+ } else {
+ ast.Send send = node;
+ ast.Node receiver = send.receiver;
+ ast.Node receiverFirst = firstNode(receiver);
+ if (receiverFirst != null) {
+ return receiverFirst;
+ } else {
+ return firstNode(send.selector);
+ }
+ }
+ }
+ ast.Node first = firstNode(send);
+ if (first is! ast.Identifier) return null;
Johnni Winther 2014/04/11 07:34:54 Change to: astNode identifier = first.asIdentifier
sigurdm 2014/04/11 09:11:38 Done.
+ Element maybePrefix = elements[first.asIdentifier()];
+ if (maybePrefix != null && maybePrefix.isPrefix() && (maybePrefix as
Johnni Winther 2014/04/11 07:34:54 Change to: if (maybePrefix != null && maybePrefix.
sigurdm 2014/04/11 09:11:38 Done.
+ PrefixElement).isDeferred) {
+ return maybePrefix;
+ }
+ return null;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698