OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library simple_types_inferrer; | 5 library simple_types_inferrer; |
6 | 6 |
7 import '../closure.dart' show ClosureRepresentationInfo; | 7 import '../closure.dart' show ClosureRepresentationInfo; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show Identifiers, Selectors; | 9 import '../common/names.dart' show Identifiers, Selectors; |
10 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 node = resolvedAst.node; | 97 node = resolvedAst.node; |
98 } | 98 } |
99 FieldInitializationScope fieldScope = | 99 FieldInitializationScope fieldScope = |
100 analyzedElement.isGenerativeConstructor | 100 analyzedElement.isGenerativeConstructor |
101 ? new FieldInitializationScope(types) | 101 ? new FieldInitializationScope(types) |
102 : null; | 102 : null; |
103 locals = | 103 locals = |
104 new LocalsHandler(inferrer, types, compiler.options, node, fieldScope); | 104 new LocalsHandler(inferrer, types, compiler.options, node, fieldScope); |
105 } | 105 } |
106 | 106 |
107 ElementGraphBuilder(MemberElement element, ResolvedAst resolvedAst, | 107 ElementGraphBuilder( |
108 Compiler compiler, InferrerEngine inferrer, [LocalsHandler handler]) | 108 MemberElement element, Compiler compiler, InferrerEngine inferrer, |
109 : this.internal(element, resolvedAst, element.memberContext.declaration, | 109 [LocalsHandler handler]) |
110 inferrer, compiler, handler); | 110 : this.internal(element, element.resolvedAst, |
| 111 element.memberContext.declaration, inferrer, compiler, handler); |
111 | 112 |
112 TreeElements get elements => resolvedAst.elements; | 113 TreeElements get elements => resolvedAst.elements; |
113 | 114 |
114 bool accumulateIsChecks = false; | 115 bool accumulateIsChecks = false; |
115 bool conditionIsSimple = false; | 116 bool conditionIsSimple = false; |
116 List<ast.Send> isChecks; | 117 List<ast.Send> isChecks; |
117 int loopLevel = 0; | 118 int loopLevel = 0; |
118 | 119 |
119 bool get inLoop => loopLevel > 0; | 120 bool get inLoop => loopLevel > 0; |
120 bool get isThisExposed { | 121 bool get isThisExposed { |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 | 886 |
886 TypeInformation visitCascade(ast.Cascade node) { | 887 TypeInformation visitCascade(ast.Cascade node) { |
887 // Ignore the result of the cascade send and return the type of the cascade | 888 // Ignore the result of the cascade send and return the type of the cascade |
888 // receiver. | 889 // receiver. |
889 visit(node.expression); | 890 visit(node.expression); |
890 return cascadeReceiverStack.removeLast(); | 891 return cascadeReceiverStack.removeLast(); |
891 } | 892 } |
892 | 893 |
893 void analyzeSuperConstructorCall( | 894 void analyzeSuperConstructorCall( |
894 ConstructorElement target, ArgumentsTypes arguments) { | 895 ConstructorElement target, ArgumentsTypes arguments) { |
| 896 assert(target.isDeclaration); |
895 ResolvedAst resolvedAst = target.resolvedAst; | 897 ResolvedAst resolvedAst = target.resolvedAst; |
896 inferrer.analyze(resolvedAst, arguments); | 898 ast.Node body; |
| 899 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 900 body = resolvedAst.node; |
| 901 } |
| 902 inferrer.analyze(target, body, arguments); |
897 isThisExposed = isThisExposed || inferrer.checkIfExposesThis(target); | 903 isThisExposed = isThisExposed || inferrer.checkIfExposesThis(target); |
898 } | 904 } |
899 | 905 |
900 TypeInformation run() { | 906 TypeInformation run() { |
901 var node; | 907 var node; |
902 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 908 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
903 node = resolvedAst.node; | 909 node = resolvedAst.node; |
904 } | 910 } |
905 ast.Expression initializer; | 911 ast.Expression initializer; |
906 if (analyzedElement.isField) { | 912 if (analyzedElement.isField) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 ? declaration.callMethod | 955 ? declaration.callMethod |
950 : declaration; | 956 : declaration; |
951 bool needNewContext = declarationMethod != analyzedElement; | 957 bool needNewContext = declarationMethod != analyzedElement; |
952 if (needNewContext) { | 958 if (needNewContext) { |
953 assert( | 959 assert( |
954 declarationMethod is ConstructorElement, | 960 declarationMethod is ConstructorElement, |
955 failedAt( | 961 failedAt( |
956 parameter, | 962 parameter, |
957 "Unexpected function declaration " | 963 "Unexpected function declaration " |
958 "${declarationMethod}, expected ${analyzedElement}.")); | 964 "${declarationMethod}, expected ${analyzedElement}.")); |
959 visitor = new ElementGraphBuilder(declarationMethod, | 965 visitor = |
960 parameter.functionDeclaration.resolvedAst, compiler, inferrer); | 966 new ElementGraphBuilder(declarationMethod, compiler, inferrer); |
961 } | 967 } |
962 TypeInformation type = | 968 TypeInformation type = |
963 (defaultValue == null) ? types.nullType : visitor.visit(defaultValue); | 969 (defaultValue == null) ? types.nullType : visitor.visit(defaultValue); |
964 inferrer.setDefaultTypeOfParameter(parameter, type, | 970 inferrer.setDefaultTypeOfParameter(parameter, type, |
965 isInstanceMember: function.isInstanceMember); | 971 isInstanceMember: function.isInstanceMember); |
966 }); | 972 }); |
967 | 973 |
968 if (closedWorld.nativeData.isNativeMember(analyzedElement)) { | 974 if (closedWorld.nativeData.isNativeMember(analyzedElement)) { |
969 // Native methods do not have a body, and we currently just say | 975 // Native methods do not have a body, and we currently just say |
970 // they return dynamic. | 976 // they return dynamic. |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 // the safe side, we mark [this] as exposed here. We could do better by | 1103 // the safe side, we mark [this] as exposed here. We could do better by |
1098 // analyzing the closure. | 1104 // analyzing the closure. |
1099 // TODO(herhut): Analyze whether closure exposes this. | 1105 // TODO(herhut): Analyze whether closure exposes this. |
1100 isThisExposed = true; | 1106 isThisExposed = true; |
1101 LocalFunctionElement element = elements.getFunctionDefinition(node); | 1107 LocalFunctionElement element = elements.getFunctionDefinition(node); |
1102 // We don'TypeInformation put the closure in the work queue of the | 1108 // We don'TypeInformation put the closure in the work queue of the |
1103 // inferrer, because it will share information with its enclosing | 1109 // inferrer, because it will share information with its enclosing |
1104 // method, like for example the types of local variables. | 1110 // method, like for example the types of local variables. |
1105 LocalsHandler closureLocals = | 1111 LocalsHandler closureLocals = |
1106 new LocalsHandler.from(locals, node, useOtherTryBlock: false); | 1112 new LocalsHandler.from(locals, node, useOtherTryBlock: false); |
1107 ElementGraphBuilder visitor = new ElementGraphBuilder(element.callMethod, | 1113 ElementGraphBuilder visitor = new ElementGraphBuilder( |
1108 element.resolvedAst, compiler, inferrer, closureLocals); | 1114 element.callMethod, compiler, inferrer, closureLocals); |
1109 visitor.run(); | 1115 visitor.run(); |
1110 inferrer.recordReturnType(element.callMethod, visitor.returnType); | 1116 inferrer.recordReturnType(element.callMethod, visitor.returnType); |
1111 | 1117 |
1112 // Record the types of captured non-boxed variables. Types of | 1118 // Record the types of captured non-boxed variables. Types of |
1113 // these variables may already be there, because of an analysis of | 1119 // these variables may already be there, because of an analysis of |
1114 // a previous closure. | 1120 // a previous closure. |
1115 ClosureRepresentationInfo nestedClosureData = compiler | 1121 ClosureRepresentationInfo nestedClosureData = compiler |
1116 .backendStrategy.closureDataLookup | 1122 .backendStrategy.closureDataLookup |
1117 .getClosureRepresentationInfo(element); | 1123 .getClosureRepresentationInfo(element); |
1118 nestedClosureData.forEachCapturedVariable((variable, field) { | 1124 nestedClosureData.forEachCapturedVariable((variable, field) { |
(...skipping 1859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2978 node, | 2984 node, |
2979 iteratorSelector, | 2985 iteratorSelector, |
2980 iteratorMask, | 2986 iteratorMask, |
2981 expressionType, | 2987 expressionType, |
2982 new ArgumentsTypes.empty()); | 2988 new ArgumentsTypes.empty()); |
2983 | 2989 |
2984 return handleForInLoop(node, iteratorType, currentSelector, currentMask, | 2990 return handleForInLoop(node, iteratorType, currentSelector, currentMask, |
2985 moveNextSelector, moveNextMask); | 2991 moveNextSelector, moveNextMask); |
2986 } | 2992 } |
2987 } | 2993 } |
OLD | NEW |