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 <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 2981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2992 | 2992 |
2993 class PcDescriptors : public Object { | 2993 class PcDescriptors : public Object { |
2994 public: | 2994 public: |
2995 void AddDescriptor(intptr_t index, | 2995 void AddDescriptor(intptr_t index, |
2996 uword pc, | 2996 uword pc, |
2997 RawPcDescriptors::Kind kind, | 2997 RawPcDescriptors::Kind kind, |
2998 int64_t deopt_id, | 2998 int64_t deopt_id, |
2999 int64_t token_pos, // Or deopt reason. | 2999 int64_t token_pos, // Or deopt reason. |
3000 intptr_t try_index) const { // Or deopt index. | 3000 intptr_t try_index) const { // Or deopt index. |
3001 RawPcDescriptors::PcDescriptorRec* rec = recAt(index); | 3001 RawPcDescriptors::PcDescriptorRec* rec = recAt(index); |
3002 rec->pc = pc; | 3002 rec->set_pc(pc); |
3003 rec->kind_ = kind; | 3003 rec->set_kind(kind); |
3004 ASSERT(Utils::IsInt(32, deopt_id)); | 3004 ASSERT(Utils::IsInt(32, deopt_id)); |
3005 rec->deopt_id = deopt_id; | 3005 rec->set_deopt_id(deopt_id); |
3006 ASSERT(Utils::IsInt(32, token_pos)); | 3006 ASSERT(Utils::IsInt(32, token_pos)); |
3007 rec->token_pos = token_pos; | 3007 rec->set_token_pos(token_pos, |
| 3008 RecordSizeInBytes() == RawPcDescriptors::kCompressedRecSize); |
3008 ASSERT(Utils::IsInt(16, try_index)); | 3009 ASSERT(Utils::IsInt(16, try_index)); |
3009 rec->try_index = try_index; | 3010 rec->set_try_index(try_index); |
| 3011 ASSERT(rec->try_index() == try_index); |
| 3012 ASSERT(rec->token_pos() == token_pos); |
3010 } | 3013 } |
3011 | 3014 |
3012 static const intptr_t kBytesPerElement = | 3015 static const intptr_t kMaxBytesPerElement = |
3013 sizeof(RawPcDescriptors::PcDescriptorRec); | 3016 RawPcDescriptors::kFullRecSize; |
3014 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 3017 static const intptr_t kMaxElements = kSmiMax / kMaxBytesPerElement; |
3015 | 3018 |
3016 static intptr_t InstanceSize() { | 3019 static intptr_t InstanceSize() { |
3017 ASSERT(sizeof(RawPcDescriptors) == | 3020 ASSERT(sizeof(RawPcDescriptors) == |
3018 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); | 3021 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); |
3019 return 0; | 3022 return 0; |
3020 } | 3023 } |
3021 static intptr_t InstanceSize(intptr_t len) { | 3024 static intptr_t InstanceSize(intptr_t len, intptr_t record_size_in_bytes) { |
3022 ASSERT(0 <= len && len <= kMaxElements); | 3025 ASSERT(0 <= len && len <= kMaxElements); |
3023 return RoundedAllocationSize( | 3026 return RoundedAllocationSize( |
3024 sizeof(RawPcDescriptors) + (len * kBytesPerElement)); | 3027 sizeof(RawPcDescriptors) + (len * record_size_in_bytes)); |
3025 } | 3028 } |
3026 | 3029 |
3027 static RawPcDescriptors* New(intptr_t num_descriptors); | 3030 static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index); |
3028 | 3031 |
3029 // Returns 0 if not found. | 3032 // Returns 0 if not found. |
3030 uword GetPcForKind(RawPcDescriptors::Kind kind) const; | 3033 uword GetPcForKind(RawPcDescriptors::Kind kind) const; |
3031 | 3034 |
3032 // Verify (assert) assumptions about pc descriptors in debug mode. | 3035 // Verify (assert) assumptions about pc descriptors in debug mode. |
3033 void Verify(const Function& function) const; | 3036 void Verify(const Function& function) const; |
3034 | 3037 |
3035 static void PrintHeaderString(); | 3038 static void PrintHeaderString(); |
3036 | 3039 |
3037 void PrintToJSONObject(JSONObject* jsobj) const; | 3040 void PrintToJSONObject(JSONObject* jsobj) const; |
(...skipping 26 matching lines...) Expand all Loading... |
3064 : ValueObject(), | 3067 : ValueObject(), |
3065 descriptors_(iter.descriptors_), | 3068 descriptors_(iter.descriptors_), |
3066 kind_mask_(iter.kind_mask_), | 3069 kind_mask_(iter.kind_mask_), |
3067 current_ix_(iter.current_ix_) {} | 3070 current_ix_(iter.current_ix_) {} |
3068 | 3071 |
3069 // Moves to record that matches kind_mask_. | 3072 // Moves to record that matches kind_mask_. |
3070 void MoveToMatching() { | 3073 void MoveToMatching() { |
3071 while (current_ix_ < descriptors_.Length()) { | 3074 while (current_ix_ < descriptors_.Length()) { |
3072 const RawPcDescriptors::PcDescriptorRec& rec = | 3075 const RawPcDescriptors::PcDescriptorRec& rec = |
3073 *descriptors_.recAt(current_ix_); | 3076 *descriptors_.recAt(current_ix_); |
3074 if ((rec.kind_ & kind_mask_) != 0) { | 3077 if ((rec.kind() & kind_mask_) != 0) { |
3075 return; // Current is valid. | 3078 return; // Current is valid. |
3076 } else { | 3079 } else { |
3077 ++current_ix_; | 3080 ++current_ix_; |
3078 } | 3081 } |
3079 } | 3082 } |
3080 } | 3083 } |
3081 | 3084 |
3082 const PcDescriptors& descriptors_; | 3085 const PcDescriptors& descriptors_; |
3083 const intptr_t kind_mask_; | 3086 const intptr_t kind_mask_; |
3084 intptr_t current_ix_; | 3087 intptr_t current_ix_; |
3085 }; | 3088 }; |
3086 | 3089 |
3087 private: | 3090 private: |
3088 static const char* KindAsStr(RawPcDescriptors::Kind kind); | 3091 static const char* KindAsStr(RawPcDescriptors::Kind kind); |
3089 | 3092 |
3090 intptr_t Length() const; | 3093 intptr_t Length() const; |
| 3094 void SetLength(intptr_t value) const; |
| 3095 |
| 3096 void SetRecordSizeInBytes(intptr_t value) const; |
| 3097 intptr_t RecordSizeInBytes() const; |
3091 | 3098 |
3092 RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const { | 3099 RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const { |
3093 ASSERT(ix < Length()); | 3100 ASSERT(ix < Length()); |
3094 return &raw_ptr()->data()[ix]; | 3101 uint8_t* d = raw_ptr()->data() + (ix * RecordSizeInBytes()); |
| 3102 return reinterpret_cast<RawPcDescriptors::PcDescriptorRec*>(d); |
3095 } | 3103 } |
3096 void SetLength(intptr_t value) const; | |
3097 | 3104 |
3098 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); | 3105 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); |
3099 friend class Class; | 3106 friend class Class; |
3100 friend class Object; | 3107 friend class Object; |
3101 }; | 3108 }; |
3102 | 3109 |
3103 | 3110 |
3104 class Stackmap : public Object { | 3111 class Stackmap : public Object { |
3105 public: | 3112 public: |
3106 static const intptr_t kNoMaximum = -1; | 3113 static const intptr_t kNoMaximum = -1; |
(...skipping 4070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7177 | 7184 |
7178 | 7185 |
7179 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 7186 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
7180 intptr_t index) { | 7187 intptr_t index) { |
7181 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 7188 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
7182 } | 7189 } |
7183 | 7190 |
7184 } // namespace dart | 7191 } // namespace dart |
7185 | 7192 |
7186 #endif // VM_OBJECT_H_ | 7193 #endif // VM_OBJECT_H_ |
OLD | NEW |