| 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 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 * stores it in the [returnLocal] field. | 861 * stores it in the [returnLocal] field. |
| 862 */ | 862 */ |
| 863 void setupStateForInlining( | 863 void setupStateForInlining( |
| 864 MethodElement function, List<HInstruction> compiledArguments, | 864 MethodElement function, List<HInstruction> compiledArguments, |
| 865 {ResolutionInterfaceType instanceType}) { | 865 {ResolutionInterfaceType instanceType}) { |
| 866 ResolvedAst resolvedAst = function.resolvedAst; | 866 ResolvedAst resolvedAst = function.resolvedAst; |
| 867 assert(resolvedAst != null); | 867 assert(resolvedAst != null); |
| 868 localsHandler = new LocalsHandler(this, function, function.memberContext, | 868 localsHandler = new LocalsHandler(this, function, function.memberContext, |
| 869 function.contextClass, instanceType, nativeData, interceptorData); | 869 function.contextClass, instanceType, nativeData, interceptorData); |
| 870 localsHandler.closureData = | 870 localsHandler.closureData = |
| 871 closureToClassMapper.getClosureRepresentationInfo(function); | 871 closureDataLookup.getClosureRepresentationInfo(function); |
| 872 returnLocal = | 872 returnLocal = |
| 873 new SyntheticLocal("result", function, function.memberContext); | 873 new SyntheticLocal("result", function, function.memberContext); |
| 874 localsHandler.updateLocal(returnLocal, graph.addConstantNull(closedWorld)); | 874 localsHandler.updateLocal(returnLocal, graph.addConstantNull(closedWorld)); |
| 875 | 875 |
| 876 inTryStatement = false; // TODO(lry): why? Document. | 876 inTryStatement = false; // TODO(lry): why? Document. |
| 877 | 877 |
| 878 int argumentIndex = 0; | 878 int argumentIndex = 0; |
| 879 if (function.isInstanceMember) { | 879 if (function.isInstanceMember) { |
| 880 localsHandler.updateLocal(localsHandler.closureData.thisLocal, | 880 localsHandler.updateLocal(localsHandler.closureData.thisLocal, |
| 881 compiledArguments[argumentIndex++]); | 881 compiledArguments[argumentIndex++]); |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 } | 1029 } |
| 1030 }); | 1030 }); |
| 1031 | 1031 |
| 1032 // Build the initializers in the context of the new constructor. | 1032 // Build the initializers in the context of the new constructor. |
| 1033 ResolvedAst oldResolvedAst = resolvedAst; | 1033 ResolvedAst oldResolvedAst = resolvedAst; |
| 1034 resolvedAst = callee.resolvedAst; | 1034 resolvedAst = callee.resolvedAst; |
| 1035 final oldElementInferenceResults = elementInferenceResults; | 1035 final oldElementInferenceResults = elementInferenceResults; |
| 1036 elementInferenceResults = globalInferenceResults.resultOfMember(callee); | 1036 elementInferenceResults = globalInferenceResults.resultOfMember(callee); |
| 1037 ClosureRepresentationInfo oldClosureData = localsHandler.closureData; | 1037 ClosureRepresentationInfo oldClosureData = localsHandler.closureData; |
| 1038 ClosureRepresentationInfo newClosureData = | 1038 ClosureRepresentationInfo newClosureData = |
| 1039 closureToClassMapper.getClosureRepresentationInfo(callee); | 1039 closureDataLookup.getClosureRepresentationInfo(callee); |
| 1040 localsHandler.closureData = newClosureData; | 1040 localsHandler.closureData = newClosureData; |
| 1041 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 1041 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 1042 localsHandler.enterScope( | 1042 localsHandler.enterScope( |
| 1043 closureToClassMapper.getClosureAnalysisInfo(resolvedAst.node), | 1043 closureDataLookup.getClosureAnalysisInfo(resolvedAst.node), |
| 1044 forGenerativeConstructorBody: callee.isGenerativeConstructorBody); | 1044 forGenerativeConstructorBody: callee.isGenerativeConstructorBody); |
| 1045 } | 1045 } |
| 1046 buildInitializers(callee, constructorResolvedAsts, fieldValues); | 1046 buildInitializers(callee, constructorResolvedAsts, fieldValues); |
| 1047 localsHandler.closureData = oldClosureData; | 1047 localsHandler.closureData = oldClosureData; |
| 1048 resolvedAst = oldResolvedAst; | 1048 resolvedAst = oldResolvedAst; |
| 1049 elementInferenceResults = oldElementInferenceResults; | 1049 elementInferenceResults = oldElementInferenceResults; |
| 1050 }); | 1050 }); |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 void buildInitializers( | 1053 void buildInitializers( |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1388 // last parameter. So no need to directly pass it. | 1388 // last parameter. So no need to directly pass it. |
| 1389 if (!localsHandler.isBoxed(parameter)) { | 1389 if (!localsHandler.isBoxed(parameter)) { |
| 1390 bodyCallInputs.add(localsHandler.readLocal(parameter)); | 1390 bodyCallInputs.add(localsHandler.readLocal(parameter)); |
| 1391 } | 1391 } |
| 1392 }); | 1392 }); |
| 1393 | 1393 |
| 1394 // If there are locals that escape (ie mutated in closures), we | 1394 // If there are locals that escape (ie mutated in closures), we |
| 1395 // pass the box to the constructor. | 1395 // pass the box to the constructor. |
| 1396 // The box must be passed before any type variable. | 1396 // The box must be passed before any type variable. |
| 1397 ClosureAnalysisInfo scopeData = | 1397 ClosureAnalysisInfo scopeData = |
| 1398 closureToClassMapper.getClosureAnalysisInfo(node); | 1398 closureDataLookup.getClosureAnalysisInfo(node); |
| 1399 if (scopeData.requiresContextBox()) { | 1399 if (scopeData.requiresContextBox()) { |
| 1400 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 1400 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
| 1401 } | 1401 } |
| 1402 | 1402 |
| 1403 // Type variables arguments must come after the box (if there is one). | 1403 // Type variables arguments must come after the box (if there is one). |
| 1404 ClassElement currentClass = constructor.enclosingClass; | 1404 ClassElement currentClass = constructor.enclosingClass; |
| 1405 if (rtiNeed.classNeedsRti(currentClass)) { | 1405 if (rtiNeed.classNeedsRti(currentClass)) { |
| 1406 // If [currentClass] needs RTI, we add the type variables as | 1406 // If [currentClass] needs RTI, we add the type variables as |
| 1407 // parameters of the generative constructor body. | 1407 // parameters of the generative constructor body. |
| 1408 currentClass.typeVariables | 1408 currentClass.typeVariables |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 Map<Local, TypeMask> parameters = <Local, TypeMask>{}; | 1447 Map<Local, TypeMask> parameters = <Local, TypeMask>{}; |
| 1448 if (element is MethodElement) { | 1448 if (element is MethodElement) { |
| 1449 element.functionSignature | 1449 element.functionSignature |
| 1450 .orderedForEachParameter((ParameterElement parameter) { | 1450 .orderedForEachParameter((ParameterElement parameter) { |
| 1451 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( | 1451 parameters[parameter] = TypeMaskFactory.inferredTypeForParameter( |
| 1452 parameter, globalInferenceResults); | 1452 parameter, globalInferenceResults); |
| 1453 }); | 1453 }); |
| 1454 } | 1454 } |
| 1455 | 1455 |
| 1456 ClosureRepresentationInfo closureData = | 1456 ClosureRepresentationInfo closureData = |
| 1457 closureToClassMapper.getClosureRepresentationInfo(element); | 1457 closureDataLookup.getClosureRepresentationInfo(element); |
| 1458 localsHandler.startFunction(element, closureData, | 1458 localsHandler.startFunction(element, closureData, |
| 1459 closureToClassMapper.getClosureAnalysisInfo(node), parameters, | 1459 closureDataLookup.getClosureAnalysisInfo(node), parameters, |
| 1460 isGenerativeConstructorBody: element.isGenerativeConstructorBody); | 1460 isGenerativeConstructorBody: element.isGenerativeConstructorBody); |
| 1461 close(new HGoto()).addSuccessor(block); | 1461 close(new HGoto()).addSuccessor(block); |
| 1462 | 1462 |
| 1463 open(block); | 1463 open(block); |
| 1464 | 1464 |
| 1465 // Add the type parameters of the class as parameters of this method. This | 1465 // Add the type parameters of the class as parameters of this method. This |
| 1466 // must be done before adding the normal parameters, because their types | 1466 // must be done before adding the normal parameters, because their types |
| 1467 // may contain references to type variables. | 1467 // may contain references to type variables. |
| 1468 ClassElement cls = element.enclosingClass; | 1468 ClassElement cls = element.enclosingClass; |
| 1469 if ((element.isConstructor || element.isGenerativeConstructorBody) && | 1469 if ((element.isConstructor || element.isGenerativeConstructorBody) && |
| 1470 rtiNeed.classNeedsRti(cls)) { | 1470 rtiNeed.classNeedsRti(cls)) { |
| 1471 cls.typeVariables.forEach((ResolutionTypeVariableType typeVariable) { | 1471 cls.typeVariables.forEach((ResolutionTypeVariableType typeVariable) { |
| 1472 HParameterValue param = | 1472 HParameterValue param = |
| 1473 addParameter(typeVariable.element, commonMasks.nonNullType); | 1473 addParameter(typeVariable.element, commonMasks.nonNullType); |
| 1474 localsHandler.directLocals[ | 1474 localsHandler.directLocals[ |
| 1475 localsHandler.getTypeVariableAsLocal(typeVariable)] = param; | 1475 localsHandler.getTypeVariableAsLocal(typeVariable)] = param; |
| 1476 }); | 1476 }); |
| 1477 } | 1477 } |
| 1478 | 1478 |
| 1479 if (element is MethodElement) { | 1479 if (element is MethodElement) { |
| 1480 MethodElement functionElement = element; | 1480 MethodElement functionElement = element; |
| 1481 FunctionSignature signature = functionElement.functionSignature; | 1481 FunctionSignature signature = functionElement.functionSignature; |
| 1482 | 1482 |
| 1483 // Put the type checks in the first successor of the entry, | 1483 // Put the type checks in the first successor of the entry, |
| 1484 // because that is where the type guards will also be inserted. | 1484 // because that is where the type guards will also be inserted. |
| 1485 // This way we ensure that a type guard will dominate the type | 1485 // This way we ensure that a type guard will dominate the type |
| 1486 // check. | 1486 // check. |
| 1487 signature.orderedForEachParameter((ParameterElement parameterElement) { | 1487 signature.orderedForEachParameter((ParameterElement parameterElement) { |
| 1488 if (element.isGenerativeConstructorBody) { | 1488 if (element.isGenerativeConstructorBody) { |
| 1489 if (closureToClassMapper | 1489 if (closureDataLookup |
| 1490 .getClosureAnalysisInfo(node) | 1490 .getClosureAnalysisInfo(node) |
| 1491 .isCaptured(parameterElement)) { | 1491 .isCaptured(parameterElement)) { |
| 1492 // The parameter will be a field in the box passed as the | 1492 // The parameter will be a field in the box passed as the |
| 1493 // last parameter. So no need to have it. | 1493 // last parameter. So no need to have it. |
| 1494 return; | 1494 return; |
| 1495 } | 1495 } |
| 1496 } | 1496 } |
| 1497 HInstruction newParameter = | 1497 HInstruction newParameter = |
| 1498 localsHandler.directLocals[parameterElement]; | 1498 localsHandler.directLocals[parameterElement]; |
| 1499 if (!element.isConstructor || | 1499 if (!element.isConstructor || |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 pop(); | 1724 pop(); |
| 1725 } | 1725 } |
| 1726 } | 1726 } |
| 1727 | 1727 |
| 1728 void buildBody() { | 1728 void buildBody() { |
| 1729 visit(node.body); | 1729 visit(node.body); |
| 1730 } | 1730 } |
| 1731 | 1731 |
| 1732 loopHandler.handleLoop( | 1732 loopHandler.handleLoop( |
| 1733 node, | 1733 node, |
| 1734 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 1734 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 1735 buildInitializer, | 1735 buildInitializer, |
| 1736 buildCondition, | 1736 buildCondition, |
| 1737 buildUpdate, | 1737 buildUpdate, |
| 1738 buildBody); | 1738 buildBody); |
| 1739 } | 1739 } |
| 1740 | 1740 |
| 1741 visitWhile(ast.While node) { | 1741 visitWhile(ast.While node) { |
| 1742 assert(isReachable); | 1742 assert(isReachable); |
| 1743 HInstruction buildCondition() { | 1743 HInstruction buildCondition() { |
| 1744 visit(node.condition); | 1744 visit(node.condition); |
| 1745 return popBoolified(); | 1745 return popBoolified(); |
| 1746 } | 1746 } |
| 1747 | 1747 |
| 1748 loopHandler.handleLoop( | 1748 loopHandler.handleLoop( |
| 1749 node, | 1749 node, |
| 1750 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 1750 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 1751 () {}, | 1751 () {}, |
| 1752 buildCondition, | 1752 buildCondition, |
| 1753 () {}, () { | 1753 () {}, () { |
| 1754 visit(node.body); | 1754 visit(node.body); |
| 1755 }); | 1755 }); |
| 1756 } | 1756 } |
| 1757 | 1757 |
| 1758 visitDoWhile(ast.DoWhile node) { | 1758 visitDoWhile(ast.DoWhile node) { |
| 1759 assert(isReachable); | 1759 assert(isReachable); |
| 1760 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); | 1760 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); |
| 1761 var loopClosureInfo = | 1761 var loopClosureInfo = |
| 1762 closureToClassMapper.getClosureRepresentationInfoForLoop(node); | 1762 closureDataLookup.getClosureRepresentationInfoForLoop(node); |
| 1763 localsHandler.startLoop(loopClosureInfo); | 1763 localsHandler.startLoop(loopClosureInfo); |
| 1764 loopDepth++; | 1764 loopDepth++; |
| 1765 JumpHandler jumpHandler = loopHandler.beginLoopHeader(node); | 1765 JumpHandler jumpHandler = loopHandler.beginLoopHeader(node); |
| 1766 HLoopInformation loopInfo = current.loopInformation; | 1766 HLoopInformation loopInfo = current.loopInformation; |
| 1767 HBasicBlock loopEntryBlock = current; | 1767 HBasicBlock loopEntryBlock = current; |
| 1768 HBasicBlock bodyEntryBlock = current; | 1768 HBasicBlock bodyEntryBlock = current; |
| 1769 JumpTarget target = elements.getTargetDefinition(node); | 1769 JumpTarget target = elements.getTargetDefinition(node); |
| 1770 bool hasContinues = target != null && target.isContinueTarget; | 1770 bool hasContinues = target != null && target.isContinueTarget; |
| 1771 if (hasContinues) { | 1771 if (hasContinues) { |
| 1772 // Add extra block to hang labels on. | 1772 // Add extra block to hang labels on. |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1891 }); | 1891 }); |
| 1892 } | 1892 } |
| 1893 } | 1893 } |
| 1894 jumpHandler.close(); | 1894 jumpHandler.close(); |
| 1895 loopDepth--; | 1895 loopDepth--; |
| 1896 } | 1896 } |
| 1897 | 1897 |
| 1898 visitFunctionExpression(ast.FunctionExpression node) { | 1898 visitFunctionExpression(ast.FunctionExpression node) { |
| 1899 LocalFunctionElement methodElement = elements[node]; | 1899 LocalFunctionElement methodElement = elements[node]; |
| 1900 ClosureRepresentationInfo closureInfo = | 1900 ClosureRepresentationInfo closureInfo = |
| 1901 closureToClassMapper.getClosureRepresentationInfo(methodElement); | 1901 closureDataLookup.getClosureRepresentationInfo(methodElement); |
| 1902 ClassEntity closureClassEntity = closureInfo.closureClassEntity; | 1902 ClassEntity closureClassEntity = closureInfo.closureClassEntity; |
| 1903 | 1903 |
| 1904 List<HInstruction> capturedVariables = <HInstruction>[]; | 1904 List<HInstruction> capturedVariables = <HInstruction>[]; |
| 1905 closureInfo.createdFieldEntities.forEach((Local field) { | 1905 closureInfo.createdFieldEntities.forEach((Local field) { |
| 1906 assert(field != null); | 1906 assert(field != null); |
| 1907 capturedVariables.add(localsHandler.readLocal(field)); | 1907 capturedVariables.add(localsHandler.readLocal(field)); |
| 1908 }); | 1908 }); |
| 1909 | 1909 |
| 1910 TypeMask type = new TypeMask.nonNullExact(closureClassEntity, closedWorld); | 1910 TypeMask type = new TypeMask.nonNullExact(closureClassEntity, closedWorld); |
| 1911 push(new HCreate(closureClassEntity, capturedVariables, type, | 1911 push(new HCreate(closureClassEntity, capturedVariables, type, |
| (...skipping 3543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5455 pop(); // Pop the value pushed by the setter call. | 5455 pop(); // Pop the value pushed by the setter call. |
| 5456 | 5456 |
| 5457 visit(node.body); | 5457 visit(node.body); |
| 5458 } | 5458 } |
| 5459 | 5459 |
| 5460 void buildUpdate() {} | 5460 void buildUpdate() {} |
| 5461 | 5461 |
| 5462 buildProtectedByFinally(() { | 5462 buildProtectedByFinally(() { |
| 5463 loopHandler.handleLoop( | 5463 loopHandler.handleLoop( |
| 5464 node, | 5464 node, |
| 5465 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 5465 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 5466 buildInitializer, | 5466 buildInitializer, |
| 5467 buildCondition, | 5467 buildCondition, |
| 5468 buildUpdate, | 5468 buildUpdate, |
| 5469 buildBody); | 5469 buildBody); |
| 5470 }, () { | 5470 }, () { |
| 5471 pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]); | 5471 pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]); |
| 5472 push(new HAwait(pop(), | 5472 push(new HAwait(pop(), |
| 5473 new TypeMask.subclass(commonElements.objectClass, closedWorld))); | 5473 new TypeMask.subclass(commonElements.objectClass, closedWorld))); |
| 5474 pop(); | 5474 pop(); |
| 5475 }); | 5475 }); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5527 void buildBody() { | 5527 void buildBody() { |
| 5528 Selector call = Selectors.current; | 5528 Selector call = Selectors.current; |
| 5529 TypeMask mask = elementInferenceResults.typeOfIteratorCurrent(node); | 5529 TypeMask mask = elementInferenceResults.typeOfIteratorCurrent(node); |
| 5530 pushInvokeDynamic(node, call, mask, [iterator]); | 5530 pushInvokeDynamic(node, call, mask, [iterator]); |
| 5531 buildAssignLoopVariable(node, pop()); | 5531 buildAssignLoopVariable(node, pop()); |
| 5532 visit(node.body); | 5532 visit(node.body); |
| 5533 } | 5533 } |
| 5534 | 5534 |
| 5535 loopHandler.handleLoop( | 5535 loopHandler.handleLoop( |
| 5536 node, | 5536 node, |
| 5537 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 5537 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 5538 buildInitializer, | 5538 buildInitializer, |
| 5539 buildCondition, | 5539 buildCondition, |
| 5540 () {}, | 5540 () {}, |
| 5541 buildBody); | 5541 buildBody); |
| 5542 } | 5542 } |
| 5543 | 5543 |
| 5544 buildAssignLoopVariable(ast.ForIn node, HInstruction value) { | 5544 buildAssignLoopVariable(ast.ForIn node, HInstruction value) { |
| 5545 ast.Node identifier = node.declaredIdentifier; | 5545 ast.Node identifier = node.declaredIdentifier; |
| 5546 Element variable = elements.getForInVariable(node); | 5546 Element variable = elements.getForInVariable(node); |
| 5547 Selector selector = elements.getSelector(identifier); | 5547 Selector selector = elements.getSelector(identifier); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5651 HInstruction index = localsHandler.readLocal(indexVariable); | 5651 HInstruction index = localsHandler.readLocal(indexVariable); |
| 5652 HInstruction one = graph.addConstantInt(1, closedWorld); | 5652 HInstruction one = graph.addConstantInt(1, closedWorld); |
| 5653 HInstruction addInstruction = | 5653 HInstruction addInstruction = |
| 5654 new HAdd(index, one, null, commonMasks.positiveIntType); | 5654 new HAdd(index, one, null, commonMasks.positiveIntType); |
| 5655 add(addInstruction); | 5655 add(addInstruction); |
| 5656 localsHandler.updateLocal(indexVariable, addInstruction); | 5656 localsHandler.updateLocal(indexVariable, addInstruction); |
| 5657 } | 5657 } |
| 5658 | 5658 |
| 5659 loopHandler.handleLoop( | 5659 loopHandler.handleLoop( |
| 5660 node, | 5660 node, |
| 5661 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 5661 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 5662 buildInitializer, | 5662 buildInitializer, |
| 5663 buildCondition, | 5663 buildCondition, |
| 5664 buildUpdate, | 5664 buildUpdate, |
| 5665 buildBody); | 5665 buildBody); |
| 5666 } | 5666 } |
| 5667 | 5667 |
| 5668 visitLabel(ast.Label node) { | 5668 visitLabel(ast.Label node) { |
| 5669 reporter.internalError(node, 'SsaFromAstMixin.visitLabel.'); | 5669 reporter.internalError(node, 'SsaFromAstMixin.visitLabel.'); |
| 5670 } | 5670 } |
| 5671 | 5671 |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6004 buildExpression, | 6004 buildExpression, |
| 6005 node.cases, | 6005 node.cases, |
| 6006 getConstants, | 6006 getConstants, |
| 6007 (_) => false, // No case is default. | 6007 (_) => false, // No case is default. |
| 6008 buildSwitchCase); | 6008 buildSwitchCase); |
| 6009 } | 6009 } |
| 6010 | 6010 |
| 6011 void buildLoop() { | 6011 void buildLoop() { |
| 6012 loopHandler.handleLoop( | 6012 loopHandler.handleLoop( |
| 6013 node, | 6013 node, |
| 6014 closureToClassMapper.getClosureRepresentationInfoForLoop(node), | 6014 closureDataLookup.getClosureRepresentationInfoForLoop(node), |
| 6015 () {}, | 6015 () {}, |
| 6016 buildCondition, | 6016 buildCondition, |
| 6017 () {}, | 6017 () {}, |
| 6018 buildSwitch); | 6018 buildSwitch); |
| 6019 } | 6019 } |
| 6020 | 6020 |
| 6021 if (hasDefault) { | 6021 if (hasDefault) { |
| 6022 buildLoop(); | 6022 buildLoop(); |
| 6023 } else { | 6023 } else { |
| 6024 // If the switch statement has no default case, surround the loop with | 6024 // If the switch statement has no default case, surround the loop with |
| (...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6867 this.oldReturnLocal, | 6867 this.oldReturnLocal, |
| 6868 this.oldReturnType, | 6868 this.oldReturnType, |
| 6869 this.oldResolvedAst, | 6869 this.oldResolvedAst, |
| 6870 this.oldStack, | 6870 this.oldStack, |
| 6871 this.oldLocalsHandler, | 6871 this.oldLocalsHandler, |
| 6872 this.inTryStatement, | 6872 this.inTryStatement, |
| 6873 this.allFunctionsCalledOnce, | 6873 this.allFunctionsCalledOnce, |
| 6874 this.oldElementInferenceResults) | 6874 this.oldElementInferenceResults) |
| 6875 : super(function); | 6875 : super(function); |
| 6876 } | 6876 } |
| OLD | NEW |