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..938aa9369eb110b6f2370291c245616a2c4f8625 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| @@ -1172,9 +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)) { |
| + if (!compiler.deferredLoadTask |
| + .inSameOutputUnit(element,compiler.currentElement)) { |
| return false; |
| } |
| if (compiler.disableInlining) return false; |
| @@ -2929,6 +2928,24 @@ 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){ |
|
floitsch
2014/04/14 12:04:08
space before the trailing "{".
sigurdm
2014/04/22 11:22:48
Done.
|
| + var deferredTask = compiler.deferredLoadTask; |
|
floitsch
2014/04/14 12:04:08
use type.
sigurdm
2014/04/22 11:22:48
Done.
|
| + 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; |