| 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 'package:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
| 9 import '../common.dart'; | 9 import '../common.dart'; |
| 10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { | 60 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { |
| 61 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; | 61 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; |
| 62 } | 62 } |
| 63 _typeConverter = new DartTypeConverter(this); | 63 _typeConverter = new DartTypeConverter(this); |
| 64 } | 64 } |
| 65 | 65 |
| 66 Compiler get _compiler => _backend.compiler; | 66 Compiler get _compiler => _backend.compiler; |
| 67 TreeElements get elements => _resolvedAst.elements; | 67 TreeElements get elements => _resolvedAst.elements; |
| 68 DiagnosticReporter get reporter => _compiler.reporter; | 68 DiagnosticReporter get reporter => _compiler.reporter; |
| 69 Element get _target => _resolvedAst.element; | 69 Element get _target => _resolvedAst.element; |
| 70 ClosedWorld get _closedWorld => _compiler.closedWorld; |
| 70 | 71 |
| 71 GlobalTypeInferenceElementResult _resultOf(Element e) => | 72 GlobalTypeInferenceElementResult _resultOf(Element e) => |
| 72 _compiler.globalInference.results.resultOf(e); | 73 _compiler.globalInference.results.resultOf(e); |
| 73 | 74 |
| 74 ConstantValue getConstantForSymbol(ir.SymbolLiteral node) { | 75 ConstantValue getConstantForSymbol(ir.SymbolLiteral node) { |
| 75 if (kernel.syntheticNodes.contains(node)) { | 76 if (kernel.syntheticNodes.contains(node)) { |
| 76 return _backend.constantSystem.createSymbol(_compiler, node.value); | 77 return _backend.constantSystem.createSymbol(_compiler, node.value); |
| 77 } | 78 } |
| 78 ast.Node astNode = getNode(node); | 79 ast.Node astNode = getNode(node); |
| 79 ConstantValue constantValue = _backend.constants | 80 ConstantValue constantValue = _backend.constants |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 // If this is a synthetic local, return the synthetic local | 121 // If this is a synthetic local, return the synthetic local |
| 121 if (variable.name == null) { | 122 if (variable.name == null) { |
| 122 return _syntheticLocals.putIfAbsent( | 123 return _syntheticLocals.putIfAbsent( |
| 123 variable, () => new SyntheticLocal("x", null)); | 124 variable, () => new SyntheticLocal("x", null)); |
| 124 } | 125 } |
| 125 return getElement(variable) as LocalElement; | 126 return getElement(variable) as LocalElement; |
| 126 } | 127 } |
| 127 | 128 |
| 128 bool getCanThrow(ir.Node procedure) { | 129 bool getCanThrow(ir.Node procedure) { |
| 129 FunctionElement function = getElement(procedure); | 130 FunctionElement function = getElement(procedure); |
| 130 return !_compiler.closedWorld.getCannotThrow(function); | 131 return !_closedWorld.getCannotThrow(function); |
| 131 } | 132 } |
| 132 | 133 |
| 133 TypeMask returnTypeOf(ir.Member node) { | 134 TypeMask returnTypeOf(ir.Member node) { |
| 134 return TypeMaskFactory.inferredReturnTypeForElement( | 135 return TypeMaskFactory.inferredReturnTypeForElement( |
| 135 getElement(node), _compiler); | 136 getElement(node), _compiler); |
| 136 } | 137 } |
| 137 | 138 |
| 138 SideEffects getSideEffects(ir.Node node) { | 139 SideEffects getSideEffects(ir.Node node) { |
| 139 return _compiler.closedWorld.getSideEffectsOfElement(getElement(node)); | 140 return _closedWorld.getSideEffectsOfElement(getElement(node)); |
| 140 } | 141 } |
| 141 | 142 |
| 142 CallStructure getCallStructure(ir.Arguments arguments) { | 143 CallStructure getCallStructure(ir.Arguments arguments) { |
| 143 int argumentCount = arguments.positional.length + arguments.named.length; | 144 int argumentCount = arguments.positional.length + arguments.named.length; |
| 144 List<String> namedArguments = arguments.named.map((e) => e.name).toList(); | 145 List<String> namedArguments = arguments.named.map((e) => e.name).toList(); |
| 145 return new CallStructure(argumentCount, namedArguments); | 146 return new CallStructure(argumentCount, namedArguments); |
| 146 } | 147 } |
| 147 | 148 |
| 148 FunctionSignature getFunctionSignature(ir.FunctionNode function) { | 149 FunctionSignature getFunctionSignature(ir.FunctionNode function) { |
| 149 return getElement(function).asFunctionElement().functionSignature; | 150 return getElement(function).asFunctionElement().functionSignature; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 return _compiler.closedWorld.commonMasks.dynamicType; | 208 return _compiler.closedWorld.commonMasks.dynamicType; |
| 208 } | 209 } |
| 209 return _resultOf(_target).typeOfSend(getNode(send)); | 210 return _resultOf(_target).typeOfSend(getNode(send)); |
| 210 } | 211 } |
| 211 | 212 |
| 212 TypeMask typeOfGet(ir.PropertyGet getter) { | 213 TypeMask typeOfGet(ir.PropertyGet getter) { |
| 213 return _resultOf(_target).typeOfSend(getNode(getter)); | 214 return _resultOf(_target).typeOfSend(getNode(getter)); |
| 214 } | 215 } |
| 215 | 216 |
| 216 TypeMask typeOfSet(ir.PropertySet setter) { | 217 TypeMask typeOfSet(ir.PropertySet setter) { |
| 217 return _compiler.closedWorld.commonMasks.dynamicType; | 218 return _closedWorld.commonMasks.dynamicType; |
| 218 } | 219 } |
| 219 | 220 |
| 220 TypeMask typeOfSend(ir.Expression send) { | 221 TypeMask typeOfSend(ir.Expression send) { |
| 221 assert(send is ir.InvocationExpression || send is ir.PropertyGet); | 222 assert(send is ir.InvocationExpression || send is ir.PropertyGet); |
| 222 return _resultOf(_target).typeOfSend(getNode(send)); | 223 return _resultOf(_target).typeOfSend(getNode(send)); |
| 223 } | 224 } |
| 224 | 225 |
| 225 TypeMask typeOfListLiteral(Element owner, ir.ListLiteral listLiteral) { | 226 TypeMask typeOfListLiteral(Element owner, ir.ListLiteral listLiteral) { |
| 226 ast.Node node = getNodeOrNull(listLiteral); | 227 ast.Node node = getNodeOrNull(listLiteral); |
| 227 if (node == null) { | 228 if (node == null) { |
| 228 assertNodeIsSynthetic(listLiteral); | 229 assertNodeIsSynthetic(listLiteral); |
| 229 return _compiler.closedWorld.commonMasks.growableListType; | 230 return _closedWorld.commonMasks.growableListType; |
| 230 } | 231 } |
| 231 return _resultOf(owner).typeOfNewList(getNode(listLiteral)) ?? | 232 return _resultOf(owner).typeOfNewList(getNode(listLiteral)) ?? |
| 232 _compiler.closedWorld.commonMasks.dynamicType; | 233 _closedWorld.commonMasks.dynamicType; |
| 233 } | 234 } |
| 234 | 235 |
| 235 TypeMask typeOfIterator(ir.ForInStatement forInStatement) { | 236 TypeMask typeOfIterator(ir.ForInStatement forInStatement) { |
| 236 return _resultOf(_target).typeOfIterator(getNode(forInStatement)); | 237 return _resultOf(_target).typeOfIterator(getNode(forInStatement)); |
| 237 } | 238 } |
| 238 | 239 |
| 239 TypeMask typeOfIteratorCurrent(ir.ForInStatement forInStatement) { | 240 TypeMask typeOfIteratorCurrent(ir.ForInStatement forInStatement) { |
| 240 return _resultOf(_target).typeOfIteratorCurrent(getNode(forInStatement)); | 241 return _resultOf(_target).typeOfIteratorCurrent(getNode(forInStatement)); |
| 241 } | 242 } |
| 242 | 243 |
| 243 TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) { | 244 TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) { |
| 244 return _resultOf(_target).typeOfIteratorMoveNext(getNode(forInStatement)); | 245 return _resultOf(_target).typeOfIteratorMoveNext(getNode(forInStatement)); |
| 245 } | 246 } |
| 246 | 247 |
| 247 bool isJsIndexableIterator(ir.ForInStatement forInStatement) { | 248 bool isJsIndexableIterator(ir.ForInStatement forInStatement) { |
| 248 TypeMask mask = typeOfIterator(forInStatement); | 249 TypeMask mask = typeOfIterator(forInStatement); |
| 249 ClosedWorld closedWorld = _compiler.closedWorld; | |
| 250 return mask != null && | 250 return mask != null && |
| 251 mask.satisfies(_backend.helpers.jsIndexableClass, closedWorld) && | 251 mask.satisfies(_backend.helpers.jsIndexableClass, _closedWorld) && |
| 252 // String is indexable but not iterable. | 252 // String is indexable but not iterable. |
| 253 !mask.satisfies(_backend.helpers.jsStringClass, closedWorld); | 253 !mask.satisfies(_backend.helpers.jsStringClass, _closedWorld); |
| 254 } | 254 } |
| 255 | 255 |
| 256 bool isFixedLength(TypeMask mask) { | 256 bool isFixedLength(TypeMask mask) { |
| 257 ClosedWorld closedWorld = _compiler.closedWorld; | |
| 258 JavaScriptBackend backend = _compiler.backend; | 257 JavaScriptBackend backend = _compiler.backend; |
| 259 if (mask.isContainer && (mask as ContainerTypeMask).length != null) { | 258 if (mask.isContainer && (mask as ContainerTypeMask).length != null) { |
| 260 // A container on which we have inferred the length. | 259 // A container on which we have inferred the length. |
| 261 return true; | 260 return true; |
| 262 } | 261 } |
| 263 // TODO(sra): Recognize any combination of fixed length indexables. | 262 // TODO(sra): Recognize any combination of fixed length indexables. |
| 264 if (mask.containsOnly(backend.helpers.jsFixedArrayClass) || | 263 if (mask.containsOnly( |
| 265 mask.containsOnly(backend.helpers.jsUnmodifiableArrayClass) || | 264 _closedWorld.backendClasses.fixedListImplementation) || |
| 266 mask.containsOnlyString(closedWorld) || | 265 mask.containsOnly( |
| 266 _closedWorld.backendClasses.constListImplementation) || |
| 267 mask.containsOnlyString(_closedWorld) || |
| 267 backend.isTypedArray(mask)) { | 268 backend.isTypedArray(mask)) { |
| 268 return true; | 269 return true; |
| 269 } | 270 } |
| 270 return false; | 271 return false; |
| 271 } | 272 } |
| 272 | 273 |
| 273 TypeMask inferredIndexType(ir.ForInStatement forInStatement) { | 274 TypeMask inferredIndexType(ir.ForInStatement forInStatement) { |
| 274 return TypeMaskFactory.inferredTypeForSelector( | 275 return TypeMaskFactory.inferredTypeForSelector( |
| 275 new Selector.index(), typeOfIterator(forInStatement), _compiler); | 276 new Selector.index(), typeOfIterator(forInStatement), _compiler); |
| 276 } | 277 } |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 astAdapter.reporter.internalError( | 844 astAdapter.reporter.internalError( |
| 844 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element."); | 845 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element."); |
| 845 return null; | 846 return null; |
| 846 } | 847 } |
| 847 | 848 |
| 848 @override | 849 @override |
| 849 ConstantExpression visitStringLiteral(ir.StringLiteral node) { | 850 ConstantExpression visitStringLiteral(ir.StringLiteral node) { |
| 850 return new StringConstantExpression(node.value); | 851 return new StringConstantExpression(node.value); |
| 851 } | 852 } |
| 852 } | 853 } |
| OLD | NEW |