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

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

Issue 356923006: Iterate over PcDescriptors only via iterators, not via an index. (preparation for more compression … (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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
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 <limits> 8 #include <limits>
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "platform/assert.h" 10 #include "platform/assert.h"
(...skipping 2967 matching lines...) Expand 10 before | Expand all | Expand 10 after
2978 static RawLocalVarDescriptors* New(intptr_t num_variables); 2978 static RawLocalVarDescriptors* New(intptr_t num_variables);
2979 2979
2980 private: 2980 private:
2981 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); 2981 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object);
2982 friend class Class; 2982 friend class Class;
2983 }; 2983 };
2984 2984
2985 2985
2986 class PcDescriptors : public Object { 2986 class PcDescriptors : public Object {
2987 public: 2987 public:
2988 enum Kind {
2989 kDeopt, // Deoptimization continuation point.
2990 kIcCall, // IC call.
2991 kOptStaticCall, // Call directly to known target, e.g. static call.
2992 kUnoptStaticCall, // Call to a known target via a stub.
2993 kClosureCall, // Closure call.
2994 kRuntimeCall, // Runtime call.
2995 kOsrEntry, // OSR entry point in unoptimized code.
2996 kOther
2997 };
2998
2999 intptr_t Length() const;
3000
3001 uword PC(intptr_t index) const {
3002 ASSERT(index < Length());
3003 return raw_ptr()->data()[index].pc;
3004 }
3005 PcDescriptors::Kind DescriptorKind(intptr_t index) const {
3006 ASSERT(index < Length());
3007 return static_cast<PcDescriptors::Kind>(raw_ptr()->data()[index].kind);
3008 }
3009 intptr_t DeoptId(intptr_t index) const {
3010 ASSERT(index < Length());
3011 return raw_ptr()->data()[index].deopt_id;
3012 }
3013 intptr_t TokenPos(intptr_t index) const {
3014 ASSERT(index < Length());
3015 return raw_ptr()->data()[index].token_pos;
3016 }
3017 intptr_t TryIndex(intptr_t index) const {
3018 ASSERT(index < Length());
3019 return raw_ptr()->data()[index].try_index;
3020 }
3021 const char* KindAsStr(intptr_t index) const;
3022
3023 void AddDescriptor(intptr_t index, 2988 void AddDescriptor(intptr_t index,
3024 uword pc, 2989 uword pc,
3025 PcDescriptors::Kind kind, 2990 RawPcDescriptors::Kind kind,
3026 int64_t deopt_id, 2991 int64_t deopt_id,
3027 int64_t token_pos, // Or deopt reason. 2992 int64_t token_pos, // Or deopt reason.
3028 intptr_t try_index) const { // Or deopt index. 2993 intptr_t try_index) const { // Or deopt index.
3029 RawPcDescriptors::PcDescriptorRec* rec = &raw_ptr()->data()[index]; 2994 RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
3030 rec->pc = pc; 2995 rec->pc = pc;
3031 rec->kind = kind; 2996 rec->kind_ = kind;
3032 ASSERT(Utils::IsInt(32, deopt_id)); 2997 ASSERT(Utils::IsInt(32, deopt_id));
3033 rec->deopt_id = deopt_id; 2998 rec->deopt_id = deopt_id;
3034 ASSERT(Utils::IsInt(32, token_pos)); 2999 ASSERT(Utils::IsInt(32, token_pos));
3035 rec->token_pos = token_pos; 3000 rec->token_pos = token_pos;
3036 ASSERT(Utils::IsInt(16, try_index)); 3001 ASSERT(Utils::IsInt(16, try_index));
3037 rec->try_index = try_index; 3002 rec->try_index = try_index;
3038 } 3003 }
3039 3004
3040 static const intptr_t kBytesPerElement = 3005 static const intptr_t kBytesPerElement =
3041 sizeof(RawPcDescriptors::PcDescriptorRec); 3006 sizeof(RawPcDescriptors::PcDescriptorRec);
3042 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 3007 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
3043 3008
3044 static intptr_t InstanceSize() { 3009 static intptr_t InstanceSize() {
3045 ASSERT(sizeof(RawPcDescriptors) == 3010 ASSERT(sizeof(RawPcDescriptors) ==
3046 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); 3011 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
3047 return 0; 3012 return 0;
3048 } 3013 }
3049 static intptr_t InstanceSize(intptr_t len) { 3014 static intptr_t InstanceSize(intptr_t len) {
3050 ASSERT(0 <= len && len <= kMaxElements); 3015 ASSERT(0 <= len && len <= kMaxElements);
3051 return RoundedAllocationSize( 3016 return RoundedAllocationSize(
3052 sizeof(RawPcDescriptors) + (len * kBytesPerElement)); 3017 sizeof(RawPcDescriptors) + (len * kBytesPerElement));
3053 } 3018 }
3054 3019
3055 static RawPcDescriptors* New(intptr_t num_descriptors); 3020 static RawPcDescriptors* New(intptr_t num_descriptors);
3056 3021
3057 // Returns 0 if not found. 3022 // Returns 0 if not found.
3058 uword GetPcForKind(Kind kind) const; 3023 uword GetPcForKind(RawPcDescriptors::Kind kind) const;
3059 3024
3060 // Verify (assert) assumptions about pc descriptors in debug mode. 3025 // Verify (assert) assumptions about pc descriptors in debug mode.
3061 void Verify(const Function& function) const; 3026 void Verify(const Function& function) const;
3062 3027
3063 static void PrintHeaderString(); 3028 static void PrintHeaderString();
3064 3029
3065 void PrintToJSONObject(JSONObject* jsobj) const; 3030 void PrintToJSONObject(JSONObject* jsobj) const;
3066 3031
3067 // We would have a VisitPointers function here to traverse the 3032 // We would have a VisitPointers function here to traverse the
3068 // pc descriptors table to visit objects if any in the table. 3033 // pc descriptors table to visit objects if any in the table.
3069 3034
3035 class Iterator : public ValueObject {
3036 public:
3037 explicit Iterator(const PcDescriptors& descriptors)
3038 : descriptors_(descriptors), current_ix_(0) {}
3039
3040 // For nested iterations, starting at element after.
3041 explicit Iterator(const Iterator& iter)
3042 : descriptors_(iter.descriptors_), current_ix_(iter.current_ix_) {}
3043
3044 bool HasNext() { return current_ix_ < descriptors_.Length(); }
3045
3046 const RawPcDescriptors::PcDescriptorRec& Next() {
3047 ASSERT(HasNext());
3048 return *descriptors_.recAt(current_ix_++);
3049 }
3050
3051 private:
3052 const PcDescriptors& descriptors_;
3053 intptr_t current_ix_;
3054 };
3055
3070 private: 3056 private:
3057 static const char* KindAsStr(RawPcDescriptors::Kind kind);
3058
3059 intptr_t Length() const;
3060
3061 RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const {
3062 ASSERT(ix < Length());
3063 return &raw_ptr()->data()[ix];
3064 }
3071 void SetLength(intptr_t value) const; 3065 void SetLength(intptr_t value) const;
3072 3066
3073 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); 3067 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
3074 friend class Class; 3068 friend class Class;
3075 friend class Object; 3069 friend class Object;
3076 }; 3070 };
3077 3071
3078 3072
3079 class Stackmap : public Object { 3073 class Stackmap : public Object {
3080 public: 3074 public:
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
3677 kInvalidPc = -1 3671 kInvalidPc = -1
3678 }; 3672 };
3679 3673
3680 // Returns 0 if code is not patchable 3674 // Returns 0 if code is not patchable
3681 uword GetEntryPatchPc() const; 3675 uword GetEntryPatchPc() const;
3682 uword GetPatchCodePc() const; 3676 uword GetPatchCodePc() const;
3683 3677
3684 uword GetLazyDeoptPc() const; 3678 uword GetLazyDeoptPc() const;
3685 3679
3686 // Find pc, return 0 if not found. 3680 // Find pc, return 0 if not found.
3687 uword GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const; 3681 uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
3688 intptr_t GetDeoptIdForOsr(uword pc) const; 3682 intptr_t GetDeoptIdForOsr(uword pc) const;
3689 3683
3690 // Returns true if there is an object in the code between 'start_offset' 3684 // Returns true if there is an object in the code between 'start_offset'
3691 // (inclusive) and 'end_offset' (exclusive). 3685 // (inclusive) and 'end_offset' (exclusive).
3692 bool ObjectExistsInArea(intptr_t start_offest, intptr_t end_offset) const; 3686 bool ObjectExistsInArea(intptr_t start_offest, intptr_t end_offset) const;
3693 3687
3694 RawString* Name() const; 3688 RawString* Name() const;
3695 RawString* PrettyName() const; 3689 RawString* PrettyName() const;
3696 3690
3697 int64_t compile_timestamp() const { 3691 int64_t compile_timestamp() const {
(...skipping 3454 matching lines...) Expand 10 before | Expand all | Expand 10 after
7152 7146
7153 7147
7154 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 7148 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
7155 intptr_t index) { 7149 intptr_t index) {
7156 return array.At((index * kEntryLength) + kTargetFunctionIndex); 7150 return array.At((index * kEntryLength) + kTargetFunctionIndex);
7157 } 7151 }
7158 7152
7159 } // namespace dart 7153 } // namespace dart
7160 7154
7161 #endif // VM_OBJECT_H_ 7155 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698