| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:collection'; | 5 import 'dart:collection'; |
| 6 | 6 |
| 7 import 'package:js_runtime/shared/embedded_names.dart'; | 7 import 'package:js_runtime/shared/embedded_names.dart'; |
| 8 | 8 |
| 9 import '../closure.dart'; | 9 import '../closure.dart'; |
| 10 import '../common.dart'; | 10 import '../common.dart'; |
| (...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 | 1004 |
| 1005 // Build the initializers in the context of the new constructor. | 1005 // Build the initializers in the context of the new constructor. |
| 1006 ResolvedAst oldResolvedAst = resolvedAst; | 1006 ResolvedAst oldResolvedAst = resolvedAst; |
| 1007 resolvedAst = callee.resolvedAst; | 1007 resolvedAst = callee.resolvedAst; |
| 1008 final oldElementInferenceResults = elementInferenceResults; | 1008 final oldElementInferenceResults = elementInferenceResults; |
| 1009 elementInferenceResults = globalInferenceResults.resultOfMember(callee); | 1009 elementInferenceResults = globalInferenceResults.resultOfMember(callee); |
| 1010 ScopeInfo oldScopeInfo = localsHandler.scopeInfo; | 1010 ScopeInfo oldScopeInfo = localsHandler.scopeInfo; |
| 1011 ScopeInfo newScopeInfo = closureDataLookup.getScopeInfo(callee); | 1011 ScopeInfo newScopeInfo = closureDataLookup.getScopeInfo(callee); |
| 1012 localsHandler.scopeInfo = newScopeInfo; | 1012 localsHandler.scopeInfo = newScopeInfo; |
| 1013 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 1013 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 1014 localsHandler.enterScope(closureDataLookup.getClosureScope(callee), | 1014 localsHandler.enterScope(closureDataLookup.getCapturedScope(callee), |
| 1015 forGenerativeConstructorBody: callee.isGenerativeConstructorBody); | 1015 forGenerativeConstructorBody: callee.isGenerativeConstructorBody); |
| 1016 } | 1016 } |
| 1017 buildInitializers(callee, constructorResolvedAsts, fieldValues); | 1017 buildInitializers(callee, constructorResolvedAsts, fieldValues); |
| 1018 localsHandler.scopeInfo = oldScopeInfo; | 1018 localsHandler.scopeInfo = oldScopeInfo; |
| 1019 resolvedAst = oldResolvedAst; | 1019 resolvedAst = oldResolvedAst; |
| 1020 elementInferenceResults = oldElementInferenceResults; | 1020 elementInferenceResults = oldElementInferenceResults; |
| 1021 }); | 1021 }); |
| 1022 } | 1022 } |
| 1023 | 1023 |
| 1024 void buildInitializers( | 1024 void buildInitializers( |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1359 // If [parameter] is boxed, it will be a field in the box passed as the | 1359 // If [parameter] is boxed, it will be a field in the box passed as the |
| 1360 // last parameter. So no need to directly pass it. | 1360 // last parameter. So no need to directly pass it. |
| 1361 if (!localsHandler.isBoxed(parameter)) { | 1361 if (!localsHandler.isBoxed(parameter)) { |
| 1362 bodyCallInputs.add(localsHandler.readLocal(parameter)); | 1362 bodyCallInputs.add(localsHandler.readLocal(parameter)); |
| 1363 } | 1363 } |
| 1364 }); | 1364 }); |
| 1365 | 1365 |
| 1366 // If there are locals that escape (ie mutated in closures), we | 1366 // If there are locals that escape (ie mutated in closures), we |
| 1367 // pass the box to the constructor. | 1367 // pass the box to the constructor. |
| 1368 // The box must be passed before any type variable. | 1368 // The box must be passed before any type variable. |
| 1369 ClosureScope scopeData = closureDataLookup.getClosureScope(constructor); | 1369 CapturedScope scopeData = closureDataLookup.getCapturedScope(constructor); |
| 1370 if (scopeData.requiresContextBox) { | 1370 if (scopeData.requiresContextBox) { |
| 1371 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 1371 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
| 1372 } | 1372 } |
| 1373 | 1373 |
| 1374 // Type variables arguments must come after the box (if there is one). | 1374 // Type variables arguments must come after the box (if there is one). |
| 1375 ClassElement currentClass = constructor.enclosingClass; | 1375 ClassElement currentClass = constructor.enclosingClass; |
| 1376 if (rtiNeed.classNeedsRti(currentClass)) { | 1376 if (rtiNeed.classNeedsRti(currentClass)) { |
| 1377 // If [currentClass] needs RTI, we add the type variables as | 1377 // If [currentClass] needs RTI, we add the type variables as |
| 1378 // parameters of the generative constructor body. | 1378 // parameters of the generative constructor body. |
| 1379 currentClass.typeVariables.forEach((_argument) { | 1379 currentClass.typeVariables.forEach((_argument) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 element.functionSignature.orderedForEachParameter((_parameter) { | 1420 element.functionSignature.orderedForEachParameter((_parameter) { |
| 1421 ParameterElement parameter = _parameter; | 1421 ParameterElement parameter = _parameter; |
| 1422 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( | 1422 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( |
| 1423 parameter, globalInferenceResults); | 1423 parameter, globalInferenceResults); |
| 1424 }); | 1424 }); |
| 1425 } | 1425 } |
| 1426 | 1426 |
| 1427 localsHandler.startFunction( | 1427 localsHandler.startFunction( |
| 1428 element, | 1428 element, |
| 1429 closureDataLookup.getScopeInfo(element), | 1429 closureDataLookup.getScopeInfo(element), |
| 1430 closureDataLookup.getClosureScope(element), | 1430 closureDataLookup.getCapturedScope(element), |
| 1431 parameters, | 1431 parameters, |
| 1432 isGenerativeConstructorBody: element.isGenerativeConstructorBody); | 1432 isGenerativeConstructorBody: element.isGenerativeConstructorBody); |
| 1433 close(new HGoto()).addSuccessor(block); | 1433 close(new HGoto()).addSuccessor(block); |
| 1434 | 1434 |
| 1435 open(block); | 1435 open(block); |
| 1436 | 1436 |
| 1437 // Add the type parameters of the class as parameters of this method. This | 1437 // Add the type parameters of the class as parameters of this method. This |
| 1438 // must be done before adding the normal parameters, because their types | 1438 // must be done before adding the normal parameters, because their types |
| 1439 // may contain references to type variables. | 1439 // may contain references to type variables. |
| 1440 ClassElement cls = element.enclosingClass; | 1440 ClassElement cls = element.enclosingClass; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1454 FunctionSignature signature = functionElement.functionSignature; | 1454 FunctionSignature signature = functionElement.functionSignature; |
| 1455 | 1455 |
| 1456 // Put the type checks in the first successor of the entry, | 1456 // Put the type checks in the first successor of the entry, |
| 1457 // because that is where the type guards will also be inserted. | 1457 // because that is where the type guards will also be inserted. |
| 1458 // This way we ensure that a type guard will dominate the type | 1458 // This way we ensure that a type guard will dominate the type |
| 1459 // check. | 1459 // check. |
| 1460 signature.orderedForEachParameter((_parameterElement) { | 1460 signature.orderedForEachParameter((_parameterElement) { |
| 1461 ParameterElement parameterElement = _parameterElement; | 1461 ParameterElement parameterElement = _parameterElement; |
| 1462 if (element.isGenerativeConstructorBody) { | 1462 if (element.isGenerativeConstructorBody) { |
| 1463 if (closureDataLookup | 1463 if (closureDataLookup |
| 1464 .getClosureScope(element) | 1464 .getCapturedScope(element) |
| 1465 .isBoxed(parameterElement)) { | 1465 .isBoxed(parameterElement)) { |
| 1466 // The parameter will be a field in the box passed as the | 1466 // The parameter will be a field in the box passed as the |
| 1467 // last parameter. So no need to have it. | 1467 // last parameter. So no need to have it. |
| 1468 return; | 1468 return; |
| 1469 } | 1469 } |
| 1470 } | 1470 } |
| 1471 HInstruction newParameter = | 1471 HInstruction newParameter = |
| 1472 localsHandler.directLocals[parameterElement]; | 1472 localsHandler.directLocals[parameterElement]; |
| 1473 if (!element.isConstructor || | 1473 if (!element.isConstructor || |
| 1474 !(element as ConstructorElement).isRedirectingFactory) { | 1474 !(element as ConstructorElement).isRedirectingFactory) { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1698 pop(); | 1698 pop(); |
| 1699 } | 1699 } |
| 1700 } | 1700 } |
| 1701 | 1701 |
| 1702 void buildBody() { | 1702 void buildBody() { |
| 1703 visit(node.body); | 1703 visit(node.body); |
| 1704 } | 1704 } |
| 1705 | 1705 |
| 1706 loopHandler.handleLoop( | 1706 loopHandler.handleLoop( |
| 1707 node, | 1707 node, |
| 1708 closureDataLookup.getLoopClosureScope(node), | 1708 closureDataLookup.getCapturedLoopScope(node), |
| 1709 elements.getTargetDefinition(node), | 1709 elements.getTargetDefinition(node), |
| 1710 buildInitializer, | 1710 buildInitializer, |
| 1711 buildCondition, | 1711 buildCondition, |
| 1712 buildUpdate, | 1712 buildUpdate, |
| 1713 buildBody); | 1713 buildBody); |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 visitWhile(ast.While node) { | 1716 visitWhile(ast.While node) { |
| 1717 assert(isReachable); | 1717 assert(isReachable); |
| 1718 HInstruction buildCondition() { | 1718 HInstruction buildCondition() { |
| 1719 visit(node.condition); | 1719 visit(node.condition); |
| 1720 return popBoolified(); | 1720 return popBoolified(); |
| 1721 } | 1721 } |
| 1722 | 1722 |
| 1723 loopHandler.handleLoop(node, closureDataLookup.getLoopClosureScope(node), | 1723 loopHandler.handleLoop(node, closureDataLookup.getCapturedLoopScope(node), |
| 1724 elements.getTargetDefinition(node), () {}, buildCondition, () {}, () { | 1724 elements.getTargetDefinition(node), () {}, buildCondition, () {}, () { |
| 1725 visit(node.body); | 1725 visit(node.body); |
| 1726 }); | 1726 }); |
| 1727 } | 1727 } |
| 1728 | 1728 |
| 1729 visitDoWhile(ast.DoWhile node) { | 1729 visitDoWhile(ast.DoWhile node) { |
| 1730 assert(isReachable); | 1730 assert(isReachable); |
| 1731 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); | 1731 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); |
| 1732 var loopClosureInfo = closureDataLookup.getLoopClosureScope(node); | 1732 var loopClosureInfo = closureDataLookup.getCapturedLoopScope(node); |
| 1733 localsHandler.startLoop(loopClosureInfo); | 1733 localsHandler.startLoop(loopClosureInfo); |
| 1734 loopDepth++; | 1734 loopDepth++; |
| 1735 JumpTarget target = elements.getTargetDefinition(node); | 1735 JumpTarget target = elements.getTargetDefinition(node); |
| 1736 JumpHandler jumpHandler = loopHandler.beginLoopHeader(node, target); | 1736 JumpHandler jumpHandler = loopHandler.beginLoopHeader(node, target); |
| 1737 HLoopInformation loopInfo = current.loopInformation; | 1737 HLoopInformation loopInfo = current.loopInformation; |
| 1738 HBasicBlock loopEntryBlock = current; | 1738 HBasicBlock loopEntryBlock = current; |
| 1739 HBasicBlock bodyEntryBlock = current; | 1739 HBasicBlock bodyEntryBlock = current; |
| 1740 bool hasContinues = target != null && target.isContinueTarget; | 1740 bool hasContinues = target != null && target.isContinueTarget; |
| 1741 if (hasContinues) { | 1741 if (hasContinues) { |
| 1742 // Add extra block to hang labels on. | 1742 // Add extra block to hang labels on. |
| (...skipping 3689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5432 pop(); // Pop the value pushed by the setter call. | 5432 pop(); // Pop the value pushed by the setter call. |
| 5433 | 5433 |
| 5434 visit(node.body); | 5434 visit(node.body); |
| 5435 } | 5435 } |
| 5436 | 5436 |
| 5437 void buildUpdate() {} | 5437 void buildUpdate() {} |
| 5438 | 5438 |
| 5439 buildProtectedByFinally(() { | 5439 buildProtectedByFinally(() { |
| 5440 loopHandler.handleLoop( | 5440 loopHandler.handleLoop( |
| 5441 node, | 5441 node, |
| 5442 closureDataLookup.getLoopClosureScope(node), | 5442 closureDataLookup.getCapturedLoopScope(node), |
| 5443 elements.getTargetDefinition(node), | 5443 elements.getTargetDefinition(node), |
| 5444 buildInitializer, | 5444 buildInitializer, |
| 5445 buildCondition, | 5445 buildCondition, |
| 5446 buildUpdate, | 5446 buildUpdate, |
| 5447 buildBody); | 5447 buildBody); |
| 5448 }, () { | 5448 }, () { |
| 5449 pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]); | 5449 pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]); |
| 5450 push(new HAwait(pop(), | 5450 push(new HAwait(pop(), |
| 5451 new TypeMask.subclass(commonElements.objectClass, closedWorld))); | 5451 new TypeMask.subclass(commonElements.objectClass, closedWorld))); |
| 5452 pop(); | 5452 pop(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5505 void buildBody() { | 5505 void buildBody() { |
| 5506 Selector call = Selectors.current; | 5506 Selector call = Selectors.current; |
| 5507 TypeMask mask = elementInferenceResults.typeOfIteratorCurrent(node); | 5507 TypeMask mask = elementInferenceResults.typeOfIteratorCurrent(node); |
| 5508 pushInvokeDynamic(node, call, mask, [iterator]); | 5508 pushInvokeDynamic(node, call, mask, [iterator]); |
| 5509 buildAssignLoopVariable(node, pop()); | 5509 buildAssignLoopVariable(node, pop()); |
| 5510 visit(node.body); | 5510 visit(node.body); |
| 5511 } | 5511 } |
| 5512 | 5512 |
| 5513 loopHandler.handleLoop( | 5513 loopHandler.handleLoop( |
| 5514 node, | 5514 node, |
| 5515 closureDataLookup.getLoopClosureScope(node), | 5515 closureDataLookup.getCapturedLoopScope(node), |
| 5516 elements.getTargetDefinition(node), | 5516 elements.getTargetDefinition(node), |
| 5517 buildInitializer, | 5517 buildInitializer, |
| 5518 buildCondition, | 5518 buildCondition, |
| 5519 () {}, | 5519 () {}, |
| 5520 buildBody); | 5520 buildBody); |
| 5521 } | 5521 } |
| 5522 | 5522 |
| 5523 buildAssignLoopVariable(ast.ForIn node, HInstruction value) { | 5523 buildAssignLoopVariable(ast.ForIn node, HInstruction value) { |
| 5524 ast.Node identifier = node.declaredIdentifier; | 5524 ast.Node identifier = node.declaredIdentifier; |
| 5525 Element variable = elements.getForInVariable(node); | 5525 Element variable = elements.getForInVariable(node); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5630 HInstruction index = localsHandler.readLocal(indexVariable); | 5630 HInstruction index = localsHandler.readLocal(indexVariable); |
| 5631 HInstruction one = graph.addConstantInt(1, closedWorld); | 5631 HInstruction one = graph.addConstantInt(1, closedWorld); |
| 5632 HInstruction addInstruction = | 5632 HInstruction addInstruction = |
| 5633 new HAdd(index, one, null, commonMasks.positiveIntType); | 5633 new HAdd(index, one, null, commonMasks.positiveIntType); |
| 5634 add(addInstruction); | 5634 add(addInstruction); |
| 5635 localsHandler.updateLocal(indexVariable, addInstruction); | 5635 localsHandler.updateLocal(indexVariable, addInstruction); |
| 5636 } | 5636 } |
| 5637 | 5637 |
| 5638 loopHandler.handleLoop( | 5638 loopHandler.handleLoop( |
| 5639 node, | 5639 node, |
| 5640 closureDataLookup.getLoopClosureScope(node), | 5640 closureDataLookup.getCapturedLoopScope(node), |
| 5641 elements.getTargetDefinition(node), | 5641 elements.getTargetDefinition(node), |
| 5642 buildInitializer, | 5642 buildInitializer, |
| 5643 buildCondition, | 5643 buildCondition, |
| 5644 buildUpdate, | 5644 buildUpdate, |
| 5645 buildBody); | 5645 buildBody); |
| 5646 } | 5646 } |
| 5647 | 5647 |
| 5648 visitLabel(ast.Label node) { | 5648 visitLabel(ast.Label node) { |
| 5649 reporter.internalError(node, 'SsaFromAstMixin.visitLabel.'); | 5649 reporter.internalError(node, 'SsaFromAstMixin.visitLabel.'); |
| 5650 } | 5650 } |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5985 node, | 5985 node, |
| 5986 new NullJumpHandler(reporter), | 5986 new NullJumpHandler(reporter), |
| 5987 buildExpression, | 5987 buildExpression, |
| 5988 node.cases, | 5988 node.cases, |
| 5989 getConstants, | 5989 getConstants, |
| 5990 (_) => false, // No case is default. | 5990 (_) => false, // No case is default. |
| 5991 buildSwitchCase); | 5991 buildSwitchCase); |
| 5992 } | 5992 } |
| 5993 | 5993 |
| 5994 void buildLoop() { | 5994 void buildLoop() { |
| 5995 loopHandler.handleLoop(node, closureDataLookup.getLoopClosureScope(node), | 5995 loopHandler.handleLoop(node, closureDataLookup.getCapturedLoopScope(node), |
| 5996 switchTarget, () {}, buildCondition, () {}, buildSwitch); | 5996 switchTarget, () {}, buildCondition, () {}, buildSwitch); |
| 5997 } | 5997 } |
| 5998 | 5998 |
| 5999 if (hasDefault) { | 5999 if (hasDefault) { |
| 6000 buildLoop(); | 6000 buildLoop(); |
| 6001 } else { | 6001 } else { |
| 6002 // If the switch statement has no default case, surround the loop with | 6002 // If the switch statement has no default case, surround the loop with |
| 6003 // a test of the target. | 6003 // a test of the target. |
| 6004 void buildCondition() { | 6004 void buildCondition() { |
| 6005 js.Template code = js.js.parseForeignJS('#'); | 6005 js.Template code = js.js.parseForeignJS('#'); |
| (...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6843 this.oldReturnLocal, | 6843 this.oldReturnLocal, |
| 6844 this.oldReturnType, | 6844 this.oldReturnType, |
| 6845 this.oldResolvedAst, | 6845 this.oldResolvedAst, |
| 6846 this.oldStack, | 6846 this.oldStack, |
| 6847 this.oldLocalsHandler, | 6847 this.oldLocalsHandler, |
| 6848 this.inTryStatement, | 6848 this.inTryStatement, |
| 6849 this.allFunctionsCalledOnce, | 6849 this.allFunctionsCalledOnce, |
| 6850 this.oldElementInferenceResults) | 6850 this.oldElementInferenceResults) |
| 6851 : super(function); | 6851 : super(function); |
| 6852 } | 6852 } |
| OLD | NEW |