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 3164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3175 private: | 3175 private: |
3176 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); | 3176 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); |
3177 friend class Class; | 3177 friend class Class; |
3178 friend class Object; | 3178 friend class Object; |
3179 }; | 3179 }; |
3180 | 3180 |
3181 | 3181 |
3182 class PcDescriptors : public Object { | 3182 class PcDescriptors : public Object { |
3183 public: | 3183 public: |
3184 void AddDescriptor(intptr_t index, | 3184 void AddDescriptor(intptr_t index, |
3185 uword pc, | 3185 uword pc_offset, |
3186 RawPcDescriptors::Kind kind, | 3186 RawPcDescriptors::Kind kind, |
3187 int64_t deopt_id, | 3187 int64_t deopt_id, |
3188 int64_t token_pos, // Or deopt reason. | 3188 int64_t token_pos, // Or deopt reason. |
3189 intptr_t try_index) const { // Or deopt index. | 3189 intptr_t try_index) const { // Or deopt index. |
3190 NoGCScope no_gc; | 3190 NoGCScope no_gc; |
3191 RawPcDescriptors::PcDescriptorRec* rec = recAt(index); | 3191 RawPcDescriptors::PcDescriptorRec* rec = recAt(index); |
3192 rec->set_pc(pc); | 3192 rec->set_pc_offset(pc_offset); |
3193 rec->set_kind(kind); | 3193 rec->set_kind(kind); |
3194 ASSERT(Utils::IsInt(32, deopt_id)); | 3194 ASSERT(Utils::IsInt(32, deopt_id)); |
3195 rec->set_deopt_id(static_cast<int32_t>(deopt_id)); | 3195 rec->set_deopt_id(static_cast<int32_t>(deopt_id)); |
3196 ASSERT(Utils::IsInt(32, token_pos)); | 3196 ASSERT(Utils::IsInt(32, token_pos)); |
3197 rec->set_token_pos(static_cast<int32_t>(token_pos), | 3197 rec->set_token_pos(static_cast<int32_t>(token_pos), |
3198 RecordSizeInBytes() == RawPcDescriptors::kCompressedRecSize); | 3198 RecordSizeInBytes() == RawPcDescriptors::kCompressedRecSize); |
3199 ASSERT(Utils::IsInt(16, try_index)); | 3199 ASSERT(Utils::IsInt(16, try_index)); |
3200 rec->set_try_index(try_index); | 3200 rec->set_try_index(try_index); |
3201 ASSERT(rec->try_index() == try_index); | 3201 ASSERT(rec->try_index() == try_index); |
3202 ASSERT(rec->token_pos() == token_pos); | 3202 ASSERT(rec->token_pos() == token_pos); |
3203 } | 3203 } |
3204 | 3204 |
3205 static const intptr_t kMaxBytesPerElement = | 3205 static const intptr_t kMaxBytesPerElement = |
3206 sizeof(RawPcDescriptors::PcDescriptorRec); | 3206 sizeof(RawPcDescriptors::PcDescriptorRec); |
3207 static const intptr_t kMaxElements = kMaxInt32 / kMaxBytesPerElement; | 3207 static const intptr_t kMaxElements = kMaxInt32 / kMaxBytesPerElement; |
3208 | 3208 |
3209 static intptr_t InstanceSize() { | 3209 static intptr_t InstanceSize() { |
3210 ASSERT(sizeof(RawPcDescriptors) == | 3210 ASSERT(sizeof(RawPcDescriptors) == |
3211 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); | 3211 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); |
3212 return 0; | 3212 return 0; |
3213 } | 3213 } |
3214 static intptr_t InstanceSize(intptr_t len, intptr_t record_size_in_bytes) { | 3214 static intptr_t InstanceSize(intptr_t len, intptr_t record_size_in_bytes) { |
3215 ASSERT(0 <= len && len <= kMaxElements); | 3215 ASSERT(0 <= len && len <= kMaxElements); |
3216 return RoundedAllocationSize( | 3216 return RoundedAllocationSize( |
3217 sizeof(RawPcDescriptors) + (len * record_size_in_bytes)); | 3217 sizeof(RawPcDescriptors) + (len * record_size_in_bytes)); |
3218 } | 3218 } |
3219 | 3219 |
3220 static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index); | 3220 static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index); |
3221 | 3221 |
3222 // Returns 0 if not found. | |
3223 uword GetPcForKind(RawPcDescriptors::Kind kind) const; | |
3224 | |
3225 // Verify (assert) assumptions about pc descriptors in debug mode. | 3222 // Verify (assert) assumptions about pc descriptors in debug mode. |
3226 void Verify(const Function& function) const; | 3223 void Verify(const Function& function) const; |
3227 | 3224 |
3228 static void PrintHeaderString(); | 3225 static void PrintHeaderString(); |
3229 | 3226 |
3230 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; | 3227 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; |
3231 | 3228 |
3232 // We would have a VisitPointers function here to traverse the | 3229 // We would have a VisitPointers function here to traverse the |
3233 // pc descriptors table to visit objects if any in the table. | 3230 // pc descriptors table to visit objects if any in the table. |
3234 // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec | 3231 // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec |
(...skipping 11 matching lines...) Expand all Loading... |
3246 bool MoveNext() { | 3243 bool MoveNext() { |
3247 if (HasNext()) { | 3244 if (HasNext()) { |
3248 current_ix_ = next_ix_++; | 3245 current_ix_ = next_ix_++; |
3249 MoveToMatching(); | 3246 MoveToMatching(); |
3250 return true; | 3247 return true; |
3251 } else { | 3248 } else { |
3252 return false; | 3249 return false; |
3253 } | 3250 } |
3254 } | 3251 } |
3255 | 3252 |
3256 uword Pc() const { | 3253 uword PcOffset() const { |
3257 NoGCScope no_gc; | 3254 NoGCScope no_gc; |
3258 return descriptors_.recAt(current_ix_)->pc(); | 3255 return descriptors_.recAt(current_ix_)->pc_offset(); |
3259 } | 3256 } |
3260 intptr_t DeoptId() const { | 3257 intptr_t DeoptId() const { |
3261 NoGCScope no_gc; | 3258 NoGCScope no_gc; |
3262 return descriptors_.recAt(current_ix_)->deopt_id(); | 3259 return descriptors_.recAt(current_ix_)->deopt_id(); |
3263 } | 3260 } |
3264 intptr_t TokenPos() const { | 3261 intptr_t TokenPos() const { |
3265 NoGCScope no_gc; | 3262 NoGCScope no_gc; |
3266 return descriptors_.recAt(current_ix_)->token_pos(); | 3263 return descriptors_.recAt(current_ix_)->token_pos(); |
3267 } | 3264 } |
3268 intptr_t TryIndex() const { | 3265 intptr_t TryIndex() const { |
(...skipping 4431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7700 | 7697 |
7701 | 7698 |
7702 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 7699 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
7703 intptr_t index) { | 7700 intptr_t index) { |
7704 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 7701 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
7705 } | 7702 } |
7706 | 7703 |
7707 } // namespace dart | 7704 } // namespace dart |
7708 | 7705 |
7709 #endif // VM_OBJECT_H_ | 7706 #endif // VM_OBJECT_H_ |
OLD | NEW |