Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(969)

Side by Side Diff: runtime/vm/object.h

Issue 1128183007: Delta encode pc descriptors, and combine pc kind and try index into single field. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/code_descriptors.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3263 matching lines...) Expand 10 before | Expand all | Expand 10 after
3274 3274
3275 private: 3275 private:
3276 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); 3276 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object);
3277 friend class Class; 3277 friend class Class;
3278 friend class Object; 3278 friend class Object;
3279 }; 3279 };
3280 3280
3281 3281
3282 class PcDescriptors : public Object { 3282 class PcDescriptors : public Object {
3283 public: 3283 public:
3284 void AddDescriptor(intptr_t index, 3284 static const intptr_t kBytesPerElement = 1;
3285 uword pc_offset, 3285 static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement;
3286 RawPcDescriptors::Kind kind,
3287 int64_t deopt_id,
3288 int64_t token_pos, // Or deopt reason.
3289 intptr_t try_index) const { // Or deopt index.
3290 NoSafepointScope no_safepoint;
3291 RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
3292 rec->set_pc_offset(pc_offset);
3293 rec->set_kind(kind);
3294 ASSERT(Utils::IsInt(32, deopt_id));
3295 rec->set_deopt_id(static_cast<int32_t>(deopt_id));
3296 ASSERT(Utils::IsInt(32, token_pos));
3297 rec->set_token_pos(static_cast<int32_t>(token_pos),
3298 RecordSizeInBytes() == RawPcDescriptors::kCompressedRecSize);
3299 ASSERT(Utils::IsInt(16, try_index));
3300 rec->set_try_index(try_index);
3301 ASSERT(rec->try_index() == try_index);
3302 ASSERT(rec->token_pos() == token_pos);
3303 }
3304
3305 static const intptr_t kMaxBytesPerElement =
3306 sizeof(RawPcDescriptors::PcDescriptorRec);
3307 static const intptr_t kMaxElements = kMaxInt32 / kMaxBytesPerElement;
3308 3286
3309 static intptr_t InstanceSize() { 3287 static intptr_t InstanceSize() {
3310 ASSERT(sizeof(RawPcDescriptors) == 3288 ASSERT(sizeof(RawPcDescriptors) ==
3311 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); 3289 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
3312 return 0; 3290 return 0;
3313 } 3291 }
3314 static intptr_t InstanceSize(intptr_t len, intptr_t record_size_in_bytes) { 3292 static intptr_t InstanceSize(intptr_t len) {
3315 ASSERT(0 <= len && len <= kMaxElements); 3293 ASSERT(0 <= len && len <= kMaxElements);
3316 return RoundedAllocationSize( 3294 return RoundedAllocationSize(sizeof(RawPcDescriptors) + len);
3317 sizeof(RawPcDescriptors) + (len * record_size_in_bytes));
3318 } 3295 }
3319 3296
3320 static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index); 3297 static RawPcDescriptors* New(GrowableArray<uint8_t>* delta_encoded_data);
3321 3298
3322 // Verify (assert) assumptions about pc descriptors in debug mode. 3299 // Verify (assert) assumptions about pc descriptors in debug mode.
3323 void Verify(const Function& function) const; 3300 void Verify(const Function& function) const;
3324 3301
3325 static void PrintHeaderString(); 3302 static void PrintHeaderString();
3326 3303
3327 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; 3304 void PrintToJSONObject(JSONObject* jsobj, bool ref) const;
3328 3305
3306 // Encode integer in SLEB128 format.
3307 static void EncodeInteger(GrowableArray<uint8_t>* data, intptr_t value);
3308
3309 // Decode SLEB128 encoded integer. Update byte_index to the next integer.
3310 intptr_t DecodeInteger(intptr_t* byte_index) const;
3311
3329 // We would have a VisitPointers function here to traverse the 3312 // We would have a VisitPointers function here to traverse the
3330 // pc descriptors table to visit objects if any in the table. 3313 // pc descriptors table to visit objects if any in the table.
3331 // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec 3314 // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec
3332 // as the object can move. 3315 // as the object can move.
3333 class Iterator : ValueObject { 3316 class Iterator : ValueObject {
3334 public: 3317 public:
3335 Iterator(const PcDescriptors& descriptors, intptr_t kind_mask) 3318 Iterator(const PcDescriptors& descriptors, intptr_t kind_mask)
3336 : descriptors_(descriptors), 3319 : descriptors_(descriptors),
3337 kind_mask_(kind_mask), 3320 kind_mask_(kind_mask),
3338 next_ix_(0), 3321 byte_index_(0),
3339 current_ix_(-1) { 3322 cur_pc_offset_(0),
3340 MoveToMatching(); 3323 cur_kind_(0),
3324 cur_deopt_id_(0),
3325 cur_token_pos_(0),
3326 cur_try_index_(0) {
3341 } 3327 }
3342 3328
3343 bool MoveNext() { 3329 bool MoveNext() {
3344 if (HasNext()) { 3330 // Moves to record that matches kind_mask_.
3345 current_ix_ = next_ix_++; 3331 while (byte_index_ < descriptors_.Length()) {
3346 MoveToMatching(); 3332 int32_t merged_kind_try = descriptors_.DecodeInteger(&byte_index_);
3347 return true; 3333 cur_kind_ =
3348 } else { 3334 RawPcDescriptors::MergedKindTry::DecodeKind(merged_kind_try);
3349 return false; 3335 cur_try_index_ =
3336 RawPcDescriptors::MergedKindTry::DecodeTryIndex(merged_kind_try);
3337
3338 cur_pc_offset_ += descriptors_.DecodeInteger(&byte_index_);
3339 cur_deopt_id_ += descriptors_.DecodeInteger(&byte_index_);
3340 cur_token_pos_ += descriptors_.DecodeInteger(&byte_index_);
3341
3342 if ((cur_kind_ & kind_mask_) != 0) {
3343 return true; // Current is valid.
3344 }
3350 } 3345 }
3346 return false;
3351 } 3347 }
3352 3348
3353 uword PcOffset() const { 3349 uword PcOffset() const { return cur_pc_offset_; }
3354 NoSafepointScope no_safepoint; 3350 intptr_t DeoptId() const { return cur_deopt_id_; }
3355 return descriptors_.recAt(current_ix_)->pc_offset(); 3351 intptr_t TokenPos() const { return cur_token_pos_; }
3356 } 3352 intptr_t TryIndex() const { return cur_try_index_; }
3357 intptr_t DeoptId() const {
3358 NoSafepointScope no_safepoint;
3359 return descriptors_.recAt(current_ix_)->deopt_id();
3360 }
3361 intptr_t TokenPos() const {
3362 NoSafepointScope no_safepoint;
3363 return descriptors_.recAt(current_ix_)->token_pos();
3364 }
3365 intptr_t TryIndex() const {
3366 NoSafepointScope no_safepoint;
3367 return descriptors_.recAt(current_ix_)->try_index();
3368 }
3369 RawPcDescriptors::Kind Kind() const { 3353 RawPcDescriptors::Kind Kind() const {
3370 NoSafepointScope no_safepoint; 3354 return static_cast<RawPcDescriptors::Kind>(cur_kind_);
3371 return descriptors_.recAt(current_ix_)->kind();
3372 } 3355 }
3373 3356
3374 private: 3357 private:
3375 friend class PcDescriptors; 3358 friend class PcDescriptors;
3376 3359
3377 bool HasNext() const { return next_ix_ < descriptors_.Length(); }
3378
3379 // For nested iterations, starting at element after. 3360 // For nested iterations, starting at element after.
3380 explicit Iterator(const Iterator& iter) 3361 explicit Iterator(const Iterator& iter)
3381 : ValueObject(), 3362 : ValueObject(),
3382 descriptors_(iter.descriptors_), 3363 descriptors_(iter.descriptors_),
3383 kind_mask_(iter.kind_mask_), 3364 kind_mask_(iter.kind_mask_),
3384 next_ix_(iter.next_ix_), 3365 byte_index_(iter.byte_index_),
3385 current_ix_(iter.current_ix_) {} 3366 cur_pc_offset_(iter.cur_pc_offset_),
3386 3367 cur_kind_(iter.cur_kind_),
3387 // Moves to record that matches kind_mask_. 3368 cur_deopt_id_(iter.cur_deopt_id_),
3388 void MoveToMatching() { 3369 cur_token_pos_(iter.cur_token_pos_),
3389 NoSafepointScope no_safepoint; 3370 cur_try_index_(iter.cur_try_index_) {}
3390 while (next_ix_ < descriptors_.Length()) {
3391 const RawPcDescriptors::PcDescriptorRec& rec =
3392 *descriptors_.recAt(next_ix_);
3393 if ((rec.kind() & kind_mask_) != 0) {
3394 return; // Current is valid.
3395 } else {
3396 ++next_ix_;
3397 }
3398 }
3399 }
3400 3371
3401 const PcDescriptors& descriptors_; 3372 const PcDescriptors& descriptors_;
3402 const intptr_t kind_mask_; 3373 const intptr_t kind_mask_;
3403 intptr_t next_ix_; 3374 intptr_t byte_index_;
3404 intptr_t current_ix_; 3375
3376 intptr_t cur_pc_offset_;
3377 intptr_t cur_kind_;
3378 intptr_t cur_deopt_id_;
3379 intptr_t cur_token_pos_;
3380 intptr_t cur_try_index_;
3405 }; 3381 };
3406 3382
3407 private: 3383 private:
3408 static const char* KindAsStr(RawPcDescriptors::Kind kind); 3384 static const char* KindAsStr(RawPcDescriptors::Kind kind);
3409 3385
3410 intptr_t Length() const; 3386 intptr_t Length() const;
3411 void SetLength(intptr_t value) const; 3387 void SetLength(intptr_t value) const;
3412 3388 void CopyData(GrowableArray<uint8_t>* data);
3413 void SetRecordSizeInBytes(intptr_t value) const;
3414 intptr_t RecordSizeInBytes() const;
3415
3416 RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const {
3417 ASSERT((0 <= ix) && (ix < Length()));
3418 uint8_t* d = UnsafeMutableNonPointer(raw_ptr()->data()) +
3419 (ix * RecordSizeInBytes());
3420 return reinterpret_cast<RawPcDescriptors::PcDescriptorRec*>(d);
3421 }
3422 3389
3423 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); 3390 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
3424 friend class Class; 3391 friend class Class;
3425 friend class Object; 3392 friend class Object;
3426 }; 3393 };
3427 3394
3428 3395
3429 class Stackmap : public Object { 3396 class Stackmap : public Object {
3430 public: 3397 public:
3431 static const intptr_t kNoMaximum = -1; 3398 static const intptr_t kNoMaximum = -1;
(...skipping 4346 matching lines...) Expand 10 before | Expand all | Expand 10 after
7778 7745
7779 7746
7780 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 7747 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
7781 intptr_t index) { 7748 intptr_t index) {
7782 return array.At((index * kEntryLength) + kTargetFunctionIndex); 7749 return array.At((index * kEntryLength) + kTargetFunctionIndex);
7783 } 7750 }
7784 7751
7785 } // namespace dart 7752 } // namespace dart
7786 7753
7787 #endif // VM_OBJECT_H_ 7754 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/code_descriptors.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698