Chromium Code Reviews| 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 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
| 9 #include "vm/flow_graph_allocator.h" | 9 #include "vm/flow_graph_allocator.h" |
| 10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 // Both names are private. Mangle test_name before comparison. | 264 // Both names are private. Mangle test_name before comparison. |
| 265 const String& test_name_symbol = String::Handle(Symbols::New(test_name)); | 265 const String& test_name_symbol = String::Handle(Symbols::New(test_name)); |
| 266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); | 266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); |
| 267 } | 267 } |
| 268 | 268 |
| 269 | 269 |
| 270 static bool IsRecognizedLibrary(const Library& library) { | 270 static bool IsRecognizedLibrary(const Library& library) { |
| 271 // List of libraries where methods can be recognized. | 271 // List of libraries where methods can be recognized. |
| 272 return (library.raw() == Library::CoreLibrary()) | 272 return (library.raw() == Library::CoreLibrary()) |
| 273 || (library.raw() == Library::MathLibrary()) | 273 || (library.raw() == Library::MathLibrary()) |
| 274 || (library.raw() == Library::TypedDataLibrary()) | |
| 274 || (library.raw() == Library::ScalarlistLibrary()); | 275 || (library.raw() == Library::ScalarlistLibrary()); |
| 275 } | 276 } |
| 276 | 277 |
| 277 | 278 |
| 278 MethodRecognizer::Kind MethodRecognizer::RecognizeKind( | 279 MethodRecognizer::Kind MethodRecognizer::RecognizeKind( |
| 279 const Function& function) { | 280 const Function& function) { |
| 280 const Class& function_class = Class::Handle(function.Owner()); | 281 const Class& function_class = Class::Handle(function.Owner()); |
| 281 const Library& lib = Library::Handle(function_class.library()); | 282 const Library& lib = Library::Handle(function_class.library()); |
| 282 if (!IsRecognizedLibrary(lib)) { | 283 if (!IsRecognizedLibrary(lib)) { |
| 283 return kUnknown; | 284 return kUnknown; |
| (...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1105 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) { | 1106 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) { |
| 1106 return this; | 1107 return this; |
| 1107 } | 1108 } |
| 1108 | 1109 |
| 1109 | 1110 |
| 1110 bool LoadFieldInstr::IsImmutableLengthLoad() const { | 1111 bool LoadFieldInstr::IsImmutableLengthLoad() const { |
| 1111 switch (recognized_kind()) { | 1112 switch (recognized_kind()) { |
| 1112 case MethodRecognizer::kObjectArrayLength: | 1113 case MethodRecognizer::kObjectArrayLength: |
| 1113 case MethodRecognizer::kImmutableArrayLength: | 1114 case MethodRecognizer::kImmutableArrayLength: |
| 1114 case MethodRecognizer::kByteArrayBaseLength: | 1115 case MethodRecognizer::kByteArrayBaseLength: |
| 1116 case MethodRecognizer::kTypedDataLength: | |
| 1115 case MethodRecognizer::kStringBaseLength: | 1117 case MethodRecognizer::kStringBaseLength: |
| 1116 return true; | 1118 return true; |
| 1117 default: | 1119 default: |
| 1118 return false; | 1120 return false; |
| 1119 } | 1121 } |
| 1120 } | 1122 } |
| 1121 | 1123 |
| 1122 | 1124 |
| 1123 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid( | 1125 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid( |
| 1124 intptr_t cid) { | 1126 intptr_t cid) { |
| 1127 if (RawObject::IsTypedDataClassId(cid) || | |
| 1128 RawObject::IsExternalTypedDataClassId(cid)) { | |
| 1129 return MethodRecognizer::kTypedDataLength; | |
| 1130 } | |
| 1125 switch (cid) { | 1131 switch (cid) { |
| 1126 case kArrayCid: | 1132 case kArrayCid: |
| 1127 return MethodRecognizer::kObjectArrayLength; | 1133 return MethodRecognizer::kObjectArrayLength; |
| 1128 case kImmutableArrayCid: | 1134 case kImmutableArrayCid: |
| 1129 return MethodRecognizer::kImmutableArrayLength; | 1135 return MethodRecognizer::kImmutableArrayLength; |
| 1130 case kGrowableObjectArrayCid: | 1136 case kGrowableObjectArrayCid: |
| 1131 return MethodRecognizer::kGrowableArrayLength; | 1137 return MethodRecognizer::kGrowableArrayLength; |
| 1132 case kInt8ArrayCid: | 1138 case kInt8ArrayCid: |
| 1133 case kUint8ArrayCid: | 1139 case kUint8ArrayCid: |
| 1134 case kUint8ClampedArrayCid: | 1140 case kUint8ClampedArrayCid: |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1917 | 1923 |
| 1918 void LoadFieldInstr::InferRange() { | 1924 void LoadFieldInstr::InferRange() { |
| 1919 if ((range_ == NULL) && | 1925 if ((range_ == NULL) && |
| 1920 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) || | 1926 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) || |
| 1921 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) { | 1927 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) { |
| 1922 range_ = new Range(RangeBoundary::FromConstant(0), | 1928 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1923 RangeBoundary::FromConstant(Array::kMaxElements)); | 1929 RangeBoundary::FromConstant(Array::kMaxElements)); |
| 1924 return; | 1930 return; |
| 1925 } | 1931 } |
| 1926 if ((range_ == NULL) && | 1932 if ((range_ == NULL) && |
| 1927 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength)) { | 1933 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength || |
| 1934 recognized_kind() == MethodRecognizer::kTypedDataLength)) { | |
| 1928 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi()); | 1935 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi()); |
| 1929 return; | 1936 return; |
| 1930 } | 1937 } |
| 1931 if ((range_ == NULL) && | 1938 if ((range_ == NULL) && |
| 1932 (recognized_kind() == MethodRecognizer::kStringBaseLength)) { | 1939 (recognized_kind() == MethodRecognizer::kStringBaseLength)) { |
| 1933 range_ = new Range(RangeBoundary::FromConstant(0), | 1940 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1934 RangeBoundary::FromConstant(String::kMaxElements)); | 1941 RangeBoundary::FromConstant(String::kMaxElements)); |
| 1935 return; | 1942 return; |
| 1936 } | 1943 } |
| 1937 Definition::InferRange(); | 1944 Definition::InferRange(); |
| 1938 } | 1945 } |
| 1939 | 1946 |
| 1940 | 1947 |
| 1941 | 1948 |
| 1942 void LoadIndexedInstr::InferRange() { | 1949 void LoadIndexedInstr::InferRange() { |
| 1943 switch (class_id()) { | 1950 switch (class_id()) { |
| 1944 case kInt8ArrayCid: | 1951 case kInt8ArrayCid: |
| 1952 case kTypedDataInt8ArrayCid: | |
| 1945 range_ = new Range(RangeBoundary::FromConstant(-128), | 1953 range_ = new Range(RangeBoundary::FromConstant(-128), |
| 1946 RangeBoundary::FromConstant(127)); | 1954 RangeBoundary::FromConstant(127)); |
| 1947 break; | 1955 break; |
| 1948 case kUint8ArrayCid: | 1956 case kUint8ArrayCid: |
| 1949 case kUint8ClampedArrayCid: | 1957 case kUint8ClampedArrayCid: |
| 1950 case kExternalUint8ArrayCid: | 1958 case kExternalUint8ArrayCid: |
| 1951 case kExternalUint8ClampedArrayCid: | 1959 case kExternalUint8ClampedArrayCid: |
| 1960 case kTypedDataUint8ArrayCid: | |
| 1961 case kTypedDataUint8ClampedArrayCid: | |
| 1962 case kExternalTypedDataUint8ArrayCid: | |
| 1963 case kExternalTypedDataUint8ClampedArrayCid: | |
| 1964 | |
|
Kevin Millikin (Google)
2013/03/14 10:09:12
There's an extra blank line here.
Florian Schneider
2013/03/14 14:03:09
Done.
| |
| 1952 range_ = new Range(RangeBoundary::FromConstant(0), | 1965 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1953 RangeBoundary::FromConstant(255)); | 1966 RangeBoundary::FromConstant(255)); |
| 1954 break; | 1967 break; |
| 1955 case kInt16ArrayCid: | 1968 case kInt16ArrayCid: |
| 1969 case kTypedDataInt16ArrayCid: | |
| 1956 range_ = new Range(RangeBoundary::FromConstant(-32768), | 1970 range_ = new Range(RangeBoundary::FromConstant(-32768), |
| 1957 RangeBoundary::FromConstant(32767)); | 1971 RangeBoundary::FromConstant(32767)); |
| 1958 break; | 1972 break; |
| 1959 case kUint16ArrayCid: | 1973 case kUint16ArrayCid: |
| 1974 case kTypedDataUint16ArrayCid: | |
| 1960 range_ = new Range(RangeBoundary::FromConstant(0), | 1975 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1961 RangeBoundary::FromConstant(65535)); | 1976 RangeBoundary::FromConstant(65535)); |
| 1962 break; | 1977 break; |
| 1963 case kOneByteStringCid: | 1978 case kOneByteStringCid: |
| 1964 range_ = new Range(RangeBoundary::FromConstant(0), | 1979 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1965 RangeBoundary::FromConstant(0xFF)); | 1980 RangeBoundary::FromConstant(0xFF)); |
| 1966 break; | 1981 break; |
| 1967 case kTwoByteStringCid: | 1982 case kTwoByteStringCid: |
| 1968 range_ = new Range(RangeBoundary::FromConstant(0), | 1983 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1969 RangeBoundary::FromConstant(0xFFFF)); | 1984 RangeBoundary::FromConstant(0xFFFF)); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2183 do { | 2198 do { |
| 2184 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset(); | 2199 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset(); |
| 2185 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length)); | 2200 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length)); |
| 2186 | 2201 |
| 2187 // Failed to prove that maximum is bounded with array length. | 2202 // Failed to prove that maximum is bounded with array length. |
| 2188 return false; | 2203 return false; |
| 2189 } | 2204 } |
| 2190 | 2205 |
| 2191 | 2206 |
| 2192 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) { | 2207 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) { |
| 2208 if (RawObject::IsExternalTypedDataClassId(class_id)) { | |
| 2209 return ExternalTypedData::length_offset(); | |
| 2210 } | |
| 2211 if (RawObject::IsTypedDataClassId(class_id)) { | |
| 2212 return TypedData::length_offset(); | |
| 2213 } | |
| 2193 switch (class_id) { | 2214 switch (class_id) { |
| 2194 case kGrowableObjectArrayCid: | 2215 case kGrowableObjectArrayCid: |
| 2195 return GrowableObjectArray::length_offset(); | 2216 return GrowableObjectArray::length_offset(); |
| 2196 case kOneByteStringCid: | 2217 case kOneByteStringCid: |
| 2197 case kTwoByteStringCid: | 2218 case kTwoByteStringCid: |
| 2198 return String::length_offset(); | 2219 return String::length_offset(); |
| 2199 case kArrayCid: | 2220 case kArrayCid: |
| 2200 case kImmutableArrayCid: | 2221 case kImmutableArrayCid: |
| 2201 return Array::length_offset(); | 2222 return Array::length_offset(); |
| 2202 case kInt8ArrayCid: | 2223 case kInt8ArrayCid: |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2303 default: | 2324 default: |
| 2304 UNREACHABLE(); | 2325 UNREACHABLE(); |
| 2305 } | 2326 } |
| 2306 return kPowRuntimeEntry; | 2327 return kPowRuntimeEntry; |
| 2307 } | 2328 } |
| 2308 | 2329 |
| 2309 | 2330 |
| 2310 #undef __ | 2331 #undef __ |
| 2311 | 2332 |
| 2312 } // namespace dart | 2333 } // namespace dart |
| OLD | NEW |