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 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 } | 1835 } |
1836 | 1836 |
1837 intptr_t NumArgsTested() const; | 1837 intptr_t NumArgsTested() const; |
1838 | 1838 |
1839 intptr_t deopt_id() const { | 1839 intptr_t deopt_id() const { |
1840 return raw_ptr()->deopt_id_; | 1840 return raw_ptr()->deopt_id_; |
1841 } | 1841 } |
1842 | 1842 |
1843 bool IsImmutable() const; | 1843 bool IsImmutable() const; |
1844 | 1844 |
1845 void Reset(bool is_static_call) const; | 1845 void Reset() const; |
1846 void ResetData() const; | 1846 void ResetData() const; |
1847 | 1847 |
1848 // Note: only deopts with reasons before Unknown in this list are recorded in | 1848 // Note: only deopts with reasons before Unknown in this list are recorded in |
1849 // the ICData. All other reasons are used purely for informational messages | 1849 // the ICData. All other reasons are used purely for informational messages |
1850 // printed during deoptimization itself. | 1850 // printed during deoptimization itself. |
1851 #define DEOPT_REASONS(V) \ | 1851 #define DEOPT_REASONS(V) \ |
1852 V(BinarySmiOp) \ | 1852 V(BinarySmiOp) \ |
1853 V(BinaryMintOp) \ | 1853 V(BinaryMintOp) \ |
1854 V(DoubleToSmi) \ | 1854 V(DoubleToSmi) \ |
1855 V(CheckSmi) \ | 1855 V(CheckSmi) \ |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2021 // Consider only used entries. | 2021 // Consider only used entries. |
2022 bool AllTargetsHaveSameOwner(intptr_t owner_cid) const; | 2022 bool AllTargetsHaveSameOwner(intptr_t owner_cid) const; |
2023 bool AllReceiversAreNumbers() const; | 2023 bool AllReceiversAreNumbers() const; |
2024 bool HasOneTarget() const; | 2024 bool HasOneTarget() const; |
2025 bool HasReceiverClassId(intptr_t class_id) const; | 2025 bool HasReceiverClassId(intptr_t class_id) const; |
2026 | 2026 |
2027 static RawICData* New(const Function& owner, | 2027 static RawICData* New(const Function& owner, |
2028 const String& target_name, | 2028 const String& target_name, |
2029 const Array& arguments_descriptor, | 2029 const Array& arguments_descriptor, |
2030 intptr_t deopt_id, | 2030 intptr_t deopt_id, |
2031 intptr_t num_args_tested); | 2031 intptr_t num_args_tested, |
| 2032 bool is_static_call); |
2032 static RawICData* NewFrom(const ICData& from, intptr_t num_args_tested); | 2033 static RawICData* NewFrom(const ICData& from, intptr_t num_args_tested); |
2033 | 2034 |
2034 // Generates a new ICData with descriptor and data array copied (deep clone). | 2035 // Generates a new ICData with descriptor and data array copied (deep clone). |
2035 static RawICData* Clone(const ICData& from); | 2036 static RawICData* Clone(const ICData& from); |
2036 | 2037 |
2037 static intptr_t TestEntryLengthFor(intptr_t num_args); | 2038 static intptr_t TestEntryLengthFor(intptr_t num_args); |
2038 | 2039 |
2039 static intptr_t TargetIndexFor(intptr_t num_args) { | 2040 static intptr_t TargetIndexFor(intptr_t num_args) { |
2040 return num_args; | 2041 return num_args; |
2041 } | 2042 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 | 2140 |
2140 enum { | 2141 enum { |
2141 kCachedICDataArrayCount = 4 | 2142 kCachedICDataArrayCount = 4 |
2142 }; | 2143 }; |
2143 | 2144 |
2144 #if defined(TAG_IC_DATA) | 2145 #if defined(TAG_IC_DATA) |
2145 void set_tag(intptr_t value) const; | 2146 void set_tag(intptr_t value) const; |
2146 intptr_t tag() const { return raw_ptr()->tag_; } | 2147 intptr_t tag() const { return raw_ptr()->tag_; } |
2147 #endif | 2148 #endif |
2148 | 2149 |
| 2150 void SetIsStaticCall(bool static_call) const; |
| 2151 bool is_static_call() const; |
| 2152 |
2149 private: | 2153 private: |
2150 static RawICData* New(); | 2154 static RawICData* New(); |
2151 | 2155 |
2152 RawArray* ic_data() const { | 2156 RawArray* ic_data() const { |
2153 return raw_ptr()->ic_data_; | 2157 return raw_ptr()->ic_data_; |
2154 } | 2158 } |
2155 | 2159 |
2156 void set_owner(const Function& value) const; | 2160 void set_owner(const Function& value) const; |
2157 void set_target_name(const String& value) const; | 2161 void set_target_name(const String& value) const; |
2158 void set_arguments_descriptor(const Array& value) const; | 2162 void set_arguments_descriptor(const Array& value) const; |
2159 void set_deopt_id(intptr_t value) const; | 2163 void set_deopt_id(intptr_t value) const; |
2160 void SetNumArgsTested(intptr_t value) const; | 2164 void SetNumArgsTested(intptr_t value) const; |
2161 void set_ic_data_array(const Array& value) const; | 2165 void set_ic_data_array(const Array& value) const; |
2162 void set_state_bits(uint32_t bits) const; | 2166 void set_state_bits(uint32_t bits) const; |
2163 | 2167 |
2164 enum { | 2168 enum { |
2165 kNumArgsTestedPos = 0, | 2169 kNumArgsTestedPos = 0, |
2166 kNumArgsTestedSize = 2, | 2170 kNumArgsTestedSize = 2, |
2167 kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize, | 2171 kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize, |
2168 kDeoptReasonSize = kLastRecordedDeoptReason + 1, | 2172 kDeoptReasonSize = kLastRecordedDeoptReason + 1, |
2169 kRangeFeedbackPos = kDeoptReasonPos + kDeoptReasonSize, | 2173 kRangeFeedbackPos = kDeoptReasonPos + kDeoptReasonSize, |
2170 kRangeFeedbackSize = kBitsPerRangeFeedback * kRangeFeedbackSlots | 2174 kRangeFeedbackSize = kBitsPerRangeFeedback * kRangeFeedbackSlots, |
| 2175 kStaticCallPos = kRangeFeedbackPos + kRangeFeedbackSize, |
| 2176 kStaticCallSize = 1, |
2171 }; | 2177 }; |
2172 | 2178 |
2173 class NumArgsTestedBits : public BitField<uint32_t, | 2179 class NumArgsTestedBits : public BitField<uint32_t, |
2174 uint32_t, | 2180 uint32_t, |
2175 kNumArgsTestedPos, | 2181 kNumArgsTestedPos, |
2176 kNumArgsTestedSize> {}; | 2182 kNumArgsTestedSize> {}; |
2177 class DeoptReasonBits : public BitField<uint32_t, | 2183 class DeoptReasonBits : public BitField<uint32_t, |
2178 uint32_t, | 2184 uint32_t, |
2179 ICData::kDeoptReasonPos, | 2185 ICData::kDeoptReasonPos, |
2180 ICData::kDeoptReasonSize> {}; | 2186 ICData::kDeoptReasonSize> {}; |
2181 class RangeFeedbackBits : public BitField<uint32_t, | 2187 class RangeFeedbackBits : public BitField<uint32_t, |
2182 uint32_t, | 2188 uint32_t, |
2183 ICData::kRangeFeedbackPos, | 2189 ICData::kRangeFeedbackPos, |
2184 ICData::kRangeFeedbackSize> {}; | 2190 ICData::kRangeFeedbackSize> {}; |
2185 | 2191 |
| 2192 class StaticCallBit : public BitField<uint32_t, |
| 2193 bool, |
| 2194 ICData::kStaticCallPos, |
| 2195 ICData::kStaticCallSize> {}; |
2186 #if defined(DEBUG) | 2196 #if defined(DEBUG) |
2187 // Used in asserts to verify that a check is not added twice. | 2197 // Used in asserts to verify that a check is not added twice. |
2188 bool HasCheck(const GrowableArray<intptr_t>& cids) const; | 2198 bool HasCheck(const GrowableArray<intptr_t>& cids) const; |
2189 #endif // DEBUG | 2199 #endif // DEBUG |
2190 | 2200 |
2191 intptr_t TestEntryLength() const; | 2201 intptr_t TestEntryLength() const; |
2192 static RawArray* NewNonCachedEmptyICDataArray(intptr_t num_args_tested); | 2202 static RawArray* NewNonCachedEmptyICDataArray(intptr_t num_args_tested); |
2193 static RawArray* NewEmptyICDataArray(intptr_t num_args_tested); | 2203 static RawArray* NewEmptyICDataArray(intptr_t num_args_tested); |
2194 static RawICData* NewDescriptor(Zone* zone, | 2204 static RawICData* NewDescriptor(Zone* zone, |
2195 const Function& owner, | 2205 const Function& owner, |
2196 const String& target_name, | 2206 const String& target_name, |
2197 const Array& arguments_descriptor, | 2207 const Array& arguments_descriptor, |
2198 intptr_t deopt_id, | 2208 intptr_t deopt_id, |
2199 intptr_t num_args_tested); | 2209 intptr_t num_args_tested, |
| 2210 bool is_static_call); |
2200 | 2211 |
2201 static void WriteSentinel(const Array& data, intptr_t test_entry_length); | 2212 static void WriteSentinel(const Array& data, intptr_t test_entry_length); |
2202 | 2213 |
2203 // A cache of VM heap allocated preinitialized empty ic data entry arrays. | 2214 // A cache of VM heap allocated preinitialized empty ic data entry arrays. |
2204 static RawArray* cached_icdata_arrays_[kCachedICDataArrayCount]; | 2215 static RawArray* cached_icdata_arrays_[kCachedICDataArrayCount]; |
2205 | 2216 |
2206 FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object); | 2217 FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object); |
2207 friend class Class; | 2218 friend class Class; |
2208 friend class SnapshotWriter; | 2219 friend class SnapshotWriter; |
2209 }; | 2220 }; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2268 // does not involve generic parameter types or generic result type. | 2279 // does not involve generic parameter types or generic result type. |
2269 bool HasInstantiatedSignature() const; | 2280 bool HasInstantiatedSignature() const; |
2270 | 2281 |
2271 // Build a string of the form 'T, {B b, C c}' representing the user | 2282 // Build a string of the form 'T, {B b, C c}' representing the user |
2272 // visible formal parameters of the function. | 2283 // visible formal parameters of the function. |
2273 RawString* UserVisibleFormalParameters() const; | 2284 RawString* UserVisibleFormalParameters() const; |
2274 | 2285 |
2275 // Reloading support: | 2286 // Reloading support: |
2276 void Reparent(const Class& new_cls) const; | 2287 void Reparent(const Class& new_cls) const; |
2277 void ZeroEdgeCounters() const; | 2288 void ZeroEdgeCounters() const; |
2278 void FillICDataWithSentinels(const Code& code) const; | |
2279 | 2289 |
2280 RawClass* Owner() const; | 2290 RawClass* Owner() const; |
2281 RawClass* origin() const; | 2291 RawClass* origin() const; |
2282 RawScript* script() const; | 2292 RawScript* script() const; |
2283 RawObject* RawOwner() const { return raw_ptr()->owner_; } | 2293 RawObject* RawOwner() const { return raw_ptr()->owner_; } |
2284 | 2294 |
2285 RawRegExp* regexp() const; | 2295 RawRegExp* regexp() const; |
2286 intptr_t string_specialization_cid() const; | 2296 intptr_t string_specialization_cid() const; |
2287 void SetRegExpData(const RegExp& regexp, | 2297 void SetRegExpData(const RegExp& regexp, |
2288 intptr_t string_specialization_cid) const; | 2298 intptr_t string_specialization_cid) const; |
(...skipping 2243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4532 | 4542 |
4533 RawCodeSourceMap* code_source_map() const { | 4543 RawCodeSourceMap* code_source_map() const { |
4534 return raw_ptr()->code_source_map_; | 4544 return raw_ptr()->code_source_map_; |
4535 } | 4545 } |
4536 | 4546 |
4537 void set_code_source_map(const CodeSourceMap& code_source_map) const { | 4547 void set_code_source_map(const CodeSourceMap& code_source_map) const { |
4538 ASSERT(code_source_map.IsOld()); | 4548 ASSERT(code_source_map.IsOld()); |
4539 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw()); | 4549 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw()); |
4540 } | 4550 } |
4541 | 4551 |
| 4552 // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas |
| 4553 // that are embedded inside the Code object. |
| 4554 void ResetICDatas() const; |
| 4555 |
4542 TokenPosition GetTokenPositionAt(intptr_t offset) const; | 4556 TokenPosition GetTokenPositionAt(intptr_t offset) const; |
4543 | 4557 |
4544 // Array of DeoptInfo objects. | 4558 // Array of DeoptInfo objects. |
4545 RawArray* deopt_info_array() const { | 4559 RawArray* deopt_info_array() const { |
4546 return raw_ptr()->deopt_info_array_; | 4560 return raw_ptr()->deopt_info_array_; |
4547 } | 4561 } |
4548 void set_deopt_info_array(const Array& array) const; | 4562 void set_deopt_info_array(const Array& array) const; |
4549 | 4563 |
4550 RawArray* stackmaps() const { | 4564 RawArray* stackmaps() const { |
4551 return raw_ptr()->stackmaps_; | 4565 return raw_ptr()->stackmaps_; |
(...skipping 4160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8712 | 8726 |
8713 inline void TypeArguments::SetHash(intptr_t value) const { | 8727 inline void TypeArguments::SetHash(intptr_t value) const { |
8714 // This is only safe because we create a new Smi, which does not cause | 8728 // This is only safe because we create a new Smi, which does not cause |
8715 // heap allocation. | 8729 // heap allocation. |
8716 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8730 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
8717 } | 8731 } |
8718 | 8732 |
8719 } // namespace dart | 8733 } // namespace dart |
8720 | 8734 |
8721 #endif // VM_OBJECT_H_ | 8735 #endif // VM_OBJECT_H_ |
OLD | NEW |