Chromium Code Reviews| 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; |