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

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/builder.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/ssa/builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 1b78e3ce6328526839e14962ad4058196994b10a..04739e4baa6277c1b6bbd45470d85a7694369f81 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1172,11 +1172,8 @@ class SsaBuilder extends ResolvedVisitor {
bool meetsHardConstraints() {
// Don't inline from one output unit to another. If something is deferred
// it is to save space in the loading code.
- var getOutputUnit = compiler.deferredLoadTask.outputUnitForElement;
- if (getOutputUnit(element) !=
- getOutputUnit(compiler.currentElement)) {
- return false;
- }
+ if (!compiler.deferredLoadTask
+ .inSameOutputUnit(element,compiler.currentElement)) return false;
Johnni Winther 2014/04/11 07:34:54 Add { } around `return false;`.
sigurdm 2014/04/11 09:11:38 Done.
if (compiler.disableInlining) return false;
assert(selector != null
@@ -2929,6 +2926,26 @@ class SsaBuilder extends ResolvedVisitor {
pushInvokeDynamic(send, selector, [receiver]);
}
+ /// Inserts a call to checkDeferredIsLoaded if the send has a prefix that
+ /// resolves to a deferred library.
+ void generateIsDeferredLoadedCheckIfNeeded(ast.Send node){
+ if (elements[node] != null) {
Johnni Winther 2014/04/11 07:34:54 Is this needed or just an optimization?
sigurdm 2014/04/11 09:11:38 Not needed - I think it was a temporary fix I forg
+ var deferredTask = compiler.deferredLoadTask;
+ PrefixElement prefixElement =
+ deferredTask.deferredPrefixElement(node, elements);
+ if (prefixElement != null) {
+ String loadId =
+ deferredTask.importDeferName[prefixElement.deferredImport];
+ HInstruction loadIdConstant = addConstantString(loadId);
+ String uri = prefixElement.deferredImport.uri.dartString.slowToString();
+ HInstruction uriConstant = addConstantString(uri);
+ Element helper = backend.getCheckDeferredIsLoaded();
+ pushInvokeStatic(node, helper, [loadIdConstant, uriConstant]);
+ pop();
+ }
+ }
+ }
+
void generateGetter(ast.Send send, Element element) {
if (element != null && element.isForeign(compiler)) {
visitForeignGetter(send);
@@ -3909,6 +3926,8 @@ class SsaBuilder extends ResolvedVisitor {
handleNewSend(ast.NewExpression node) {
ast.Send send = node.send;
+ generateIsDeferredLoadedCheckIfNeeded(send);
+
bool isFixedList = false;
bool isFixedListConstructorCall =
Elements.isFixedListConstructorCall(elements[send], send, compiler);
@@ -4160,6 +4179,7 @@ class SsaBuilder extends ResolvedVisitor {
return;
}
invariant(element, !element.isGenerativeConstructor());
+ generateIsDeferredLoadedCheckIfNeeded(node);
if (element.isFunction()) {
var inputs = <HInstruction>[];
// TODO(5347): Try to avoid the need for calling [implementation] before
@@ -4235,6 +4255,7 @@ class SsaBuilder extends ResolvedVisitor {
}
visitGetterSend(ast.Send node) {
+ generateIsDeferredLoadedCheckIfNeeded(node);
generateGetter(node, elements[node]);
}
@@ -4503,6 +4524,7 @@ class SsaBuilder extends ResolvedVisitor {
}
visitSendSet(ast.SendSet node) {
+ generateIsDeferredLoadedCheckIfNeeded(node);
Element element = elements[node];
if (!Elements.isUnresolved(element) && element.impliesType()) {
ast.Identifier selector = node.selector;

Powered by Google App Engine
This is Rietveld 408576698