| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 '../closure.dart'; | 5 import '../closure.dart'; |
| 6 import '../common.dart'; | 6 import '../common.dart'; |
| 7 import '../compiler.dart' show Compiler; | 7 import '../compiler.dart' show Compiler; |
| 8 import '../dart_types.dart'; | 8 import '../dart_types.dart'; |
| 9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
| 10 import '../io/source_information.dart'; | 10 import '../io/source_information.dart'; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 InterfaceType instanceType, this._compiler) | 67 InterfaceType instanceType, this._compiler) |
| 68 : this.instanceType = | 68 : this.instanceType = |
| 69 instanceType == null || instanceType.containsTypeVariables | 69 instanceType == null || instanceType.containsTypeVariables |
| 70 ? null | 70 ? null |
| 71 : instanceType; | 71 : instanceType; |
| 72 | 72 |
| 73 ClosedWorld get closedWorld => builder.closedWorld; | 73 ClosedWorld get closedWorld => builder.closedWorld; |
| 74 | 74 |
| 75 CommonMasks get commonMasks => closedWorld.commonMasks; | 75 CommonMasks get commonMasks => closedWorld.commonMasks; |
| 76 | 76 |
| 77 GlobalTypeInferenceResults get _globalInferenceResults => |
| 78 _compiler.globalInference.results; |
| 79 |
| 77 /// Substituted type variables occurring in [type] into the context of | 80 /// Substituted type variables occurring in [type] into the context of |
| 78 /// [contextClass]. | 81 /// [contextClass]. |
| 79 DartType substInContext(DartType type) { | 82 DartType substInContext(DartType type) { |
| 80 if (contextClass != null) { | 83 if (contextClass != null) { |
| 81 ClassElement typeContext = Types.getClassContext(type); | 84 ClassElement typeContext = Types.getClassContext(type); |
| 82 if (typeContext != null) { | 85 if (typeContext != null) { |
| 83 type = type.substByContext(contextClass.asInstanceOf(typeContext)); | 86 type = type.substByContext(contextClass.asInstanceOf(typeContext)); |
| 84 } | 87 } |
| 85 } | 88 } |
| 86 if (instanceType != null) { | 89 if (instanceType != null) { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 if (scopeData != null && | 202 if (scopeData != null && |
| 200 scopeData.isCapturedVariable(parameterElement)) { | 203 scopeData.isCapturedVariable(parameterElement)) { |
| 201 // The parameter will be a field in the box passed as the | 204 // The parameter will be a field in the box passed as the |
| 202 // last parameter. So no need to have it. | 205 // last parameter. So no need to have it. |
| 203 return; | 206 return; |
| 204 } | 207 } |
| 205 } | 208 } |
| 206 HInstruction parameter = builder.addParameter( | 209 HInstruction parameter = builder.addParameter( |
| 207 parameterElement, | 210 parameterElement, |
| 208 TypeMaskFactory.inferredTypeForElement( | 211 TypeMaskFactory.inferredTypeForElement( |
| 209 parameterElement, _compiler)); | 212 parameterElement, _globalInferenceResults)); |
| 210 builder.parameters[parameterElement] = parameter; | 213 builder.parameters[parameterElement] = parameter; |
| 211 directLocals[parameterElement] = parameter; | 214 directLocals[parameterElement] = parameter; |
| 212 }); | 215 }); |
| 213 } | 216 } |
| 214 | 217 |
| 215 enterScope(node, element); | 218 enterScope(node, element); |
| 216 | 219 |
| 217 // If the freeVariableMapping is not empty, then this function was a | 220 // If the freeVariableMapping is not empty, then this function was a |
| 218 // nested closure that captures variables. Redirect the captured | 221 // nested closure that captures variables. Redirect the captured |
| 219 // variables to fields in the closure. | 222 // variables to fields in the closure. |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 } | 636 } |
| 634 return result; | 637 return result; |
| 635 } | 638 } |
| 636 | 639 |
| 637 Map<Element, TypeMask> cachedTypesOfCapturedVariables = | 640 Map<Element, TypeMask> cachedTypesOfCapturedVariables = |
| 638 new Map<Element, TypeMask>(); | 641 new Map<Element, TypeMask>(); |
| 639 | 642 |
| 640 TypeMask getTypeOfCapturedVariable(Element element) { | 643 TypeMask getTypeOfCapturedVariable(Element element) { |
| 641 assert(element.isField); | 644 assert(element.isField); |
| 642 return cachedTypesOfCapturedVariables.putIfAbsent(element, () { | 645 return cachedTypesOfCapturedVariables.putIfAbsent(element, () { |
| 643 return TypeMaskFactory.inferredTypeForElement(element, _compiler); | 646 return TypeMaskFactory.inferredTypeForElement( |
| 647 element, _globalInferenceResults); |
| 644 }); | 648 }); |
| 645 } | 649 } |
| 646 | 650 |
| 647 /// Variables stored in the current activation. These variables are | 651 /// Variables stored in the current activation. These variables are |
| 648 /// being updated in try/catch blocks, and should be | 652 /// being updated in try/catch blocks, and should be |
| 649 /// accessed indirectly through [HLocalGet] and [HLocalSet]. | 653 /// accessed indirectly through [HLocalGet] and [HLocalSet]. |
| 650 Map<Local, HLocalValue> activationVariables = <Local, HLocalValue>{}; | 654 Map<Local, HLocalValue> activationVariables = <Local, HLocalValue>{}; |
| 651 } | 655 } |
| 652 | 656 |
| 653 /// A synthetic local variable only used with the SSA graph. | 657 /// A synthetic local variable only used with the SSA graph. |
| 654 /// | 658 /// |
| 655 /// For instance used for holding return value of function or the exception of a | 659 /// For instance used for holding return value of function or the exception of a |
| 656 /// try-catch statement. | 660 /// try-catch statement. |
| 657 class SyntheticLocal extends Local { | 661 class SyntheticLocal extends Local { |
| 658 final String name; | 662 final String name; |
| 659 final ExecutableElement executableContext; | 663 final ExecutableElement executableContext; |
| 660 | 664 |
| 661 // Avoid slow Object.hashCode. | 665 // Avoid slow Object.hashCode. |
| 662 final int hashCode = _nextHashCode = (_nextHashCode + 1).toUnsigned(30); | 666 final int hashCode = _nextHashCode = (_nextHashCode + 1).toUnsigned(30); |
| 663 static int _nextHashCode = 0; | 667 static int _nextHashCode = 0; |
| 664 | 668 |
| 665 SyntheticLocal(this.name, this.executableContext); | 669 SyntheticLocal(this.name, this.executableContext); |
| 666 | 670 |
| 667 toString() => 'SyntheticLocal($name)'; | 671 toString() => 'SyntheticLocal($name)'; |
| 668 } | 672 } |
| OLD | NEW |