| 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 RUNTIME_VM_OBJECT_H_ | 5 #ifndef RUNTIME_VM_OBJECT_H_ |
| 6 #define RUNTIME_VM_OBJECT_H_ | 6 #define RUNTIME_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 4383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4394 static intptr_t InstanceSize() { | 4394 static intptr_t InstanceSize() { |
| 4395 ASSERT(sizeof(RawCodeSourceMap) == | 4395 ASSERT(sizeof(RawCodeSourceMap) == |
| 4396 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data)); | 4396 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data)); |
| 4397 return 0; | 4397 return 0; |
| 4398 } | 4398 } |
| 4399 static intptr_t InstanceSize(intptr_t len) { | 4399 static intptr_t InstanceSize(intptr_t len) { |
| 4400 ASSERT(0 <= len && len <= kMaxElements); | 4400 ASSERT(0 <= len && len <= kMaxElements); |
| 4401 return RoundedAllocationSize(sizeof(RawCodeSourceMap) + len); | 4401 return RoundedAllocationSize(sizeof(RawCodeSourceMap) + len); |
| 4402 } | 4402 } |
| 4403 | 4403 |
| 4404 static RawCodeSourceMap* New(GrowableArray<uint8_t>* delta_encoded_data); | 4404 static RawCodeSourceMap* New(intptr_t length); |
| 4405 |
| 4406 intptr_t Length() const { return raw_ptr()->length_; } |
| 4407 uint8_t* Data() const { |
| 4408 return UnsafeMutableNonPointer(&raw_ptr()->data()[0]); |
| 4409 } |
| 4405 | 4410 |
| 4406 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; | 4411 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; |
| 4407 | 4412 |
| 4408 // Encode integer in SLEB128 format. | |
| 4409 static void EncodeInteger(GrowableArray<uint8_t>* data, intptr_t value); | |
| 4410 | |
| 4411 // Decode SLEB128 encoded integer. Update byte_index to the next integer. | |
| 4412 intptr_t DecodeInteger(intptr_t* byte_index) const; | |
| 4413 | |
| 4414 TokenPosition TokenPositionForPCOffset(uword pc_offset) const; | |
| 4415 RawFunction* FunctionForPCOffset(const Code& code, | |
| 4416 const Function& function, | |
| 4417 uword pc_offset) const; | |
| 4418 RawScript* ScriptForPCOffset(const Code& code, | |
| 4419 const Function& function, | |
| 4420 uword pc_offset) const; | |
| 4421 | |
| 4422 static void Dump(const CodeSourceMap& code_source_map, | |
| 4423 const Code& code, | |
| 4424 const Function& function); | |
| 4425 | |
| 4426 class Iterator : ValueObject { | |
| 4427 public: | |
| 4428 explicit Iterator(const CodeSourceMap& code_source_map) | |
| 4429 : code_source_map_(code_source_map), | |
| 4430 byte_index_(0), | |
| 4431 cur_pc_offset_(0), | |
| 4432 cur_token_pos_(0) {} | |
| 4433 | |
| 4434 bool MoveNext() { | |
| 4435 // Moves to the next record. | |
| 4436 while (byte_index_ < code_source_map_.Length()) { | |
| 4437 cur_pc_offset_ += code_source_map_.DecodeInteger(&byte_index_); | |
| 4438 cur_token_pos_ += code_source_map_.DecodeInteger(&byte_index_); | |
| 4439 | |
| 4440 return true; | |
| 4441 } | |
| 4442 return false; | |
| 4443 } | |
| 4444 | |
| 4445 uword PcOffset() const { return cur_pc_offset_; } | |
| 4446 TokenPosition TokenPos() const { return TokenPosition(cur_token_pos_); } | |
| 4447 | |
| 4448 private: | |
| 4449 friend class CodeSourceMap; | |
| 4450 | |
| 4451 const CodeSourceMap& code_source_map_; | |
| 4452 intptr_t byte_index_; | |
| 4453 | |
| 4454 intptr_t cur_pc_offset_; | |
| 4455 intptr_t cur_token_pos_; | |
| 4456 }; | |
| 4457 | |
| 4458 private: | 4413 private: |
| 4459 static RawCodeSourceMap* New(intptr_t length); | |
| 4460 | |
| 4461 intptr_t Length() const; | |
| 4462 void SetLength(intptr_t value) const; | 4414 void SetLength(intptr_t value) const; |
| 4463 void CopyData(GrowableArray<uint8_t>* data); | |
| 4464 | 4415 |
| 4465 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object); | 4416 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object); |
| 4466 friend class Class; | 4417 friend class Class; |
| 4467 friend class Object; | 4418 friend class Object; |
| 4468 }; | 4419 }; |
| 4469 | 4420 |
| 4470 | 4421 |
| 4471 class StackMap : public Object { | 4422 class StackMap : public Object { |
| 4472 public: | 4423 public: |
| 4473 static const intptr_t kNoMaximum = -1; | 4424 static const intptr_t kNoMaximum = -1; |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4723 #else | 4674 #else |
| 4724 ASSERT(code_source_map.IsOld()); | 4675 ASSERT(code_source_map.IsOld()); |
| 4725 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw()); | 4676 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw()); |
| 4726 #endif | 4677 #endif |
| 4727 } | 4678 } |
| 4728 | 4679 |
| 4729 // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas | 4680 // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas |
| 4730 // that are embedded inside the Code object. | 4681 // that are embedded inside the Code object. |
| 4731 void ResetICDatas(Zone* zone) const; | 4682 void ResetICDatas(Zone* zone) const; |
| 4732 | 4683 |
| 4733 TokenPosition GetTokenPositionAt(intptr_t offset) const; | |
| 4734 | |
| 4735 // Array of DeoptInfo objects. | 4684 // Array of DeoptInfo objects. |
| 4736 RawArray* deopt_info_array() const { | 4685 RawArray* deopt_info_array() const { |
| 4737 #if defined(DART_PRECOMPILED_RUNTIME) | 4686 #if defined(DART_PRECOMPILED_RUNTIME) |
| 4738 UNREACHABLE(); | 4687 UNREACHABLE(); |
| 4739 return NULL; | 4688 return NULL; |
| 4740 #else | 4689 #else |
| 4741 return raw_ptr()->deopt_info_array_; | 4690 return raw_ptr()->deopt_info_array_; |
| 4742 #endif | 4691 #endif |
| 4743 } | 4692 } |
| 4744 void set_deopt_info_array(const Array& array) const; | 4693 void set_deopt_info_array(const Array& array) const; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4819 return NULL; | 4768 return NULL; |
| 4820 #else | 4769 #else |
| 4821 return raw_ptr()->return_address_metadata_; | 4770 return raw_ptr()->return_address_metadata_; |
| 4822 #endif | 4771 #endif |
| 4823 } | 4772 } |
| 4824 // Sets |return_address_metadata|. | 4773 // Sets |return_address_metadata|. |
| 4825 void SetPrologueOffset(intptr_t offset) const; | 4774 void SetPrologueOffset(intptr_t offset) const; |
| 4826 // Returns -1 if no prologue offset is available. | 4775 // Returns -1 if no prologue offset is available. |
| 4827 intptr_t GetPrologueOffset() const; | 4776 intptr_t GetPrologueOffset() const; |
| 4828 | 4777 |
| 4829 enum InlinedIntervalEntries { | 4778 RawArray* inlined_id_to_function() const; |
| 4830 kInlIntStart = 0, | 4779 void set_inlined_id_to_function(const Array& value) const; |
| 4831 kInlIntInliningId = 1, | |
| 4832 kInlIntNumEntries = 2, | |
| 4833 }; | |
| 4834 | 4780 |
| 4835 RawArray* GetInlinedIntervals() const; | 4781 // Provides the call stack at the given pc offset, with the top-of-stack in |
| 4836 void SetInlinedIntervals(const Array& value) const; | 4782 // the last element and the root function (this) as the first element, along |
| 4783 // with the corresponding source positions. Note the token position for each |
| 4784 // function except the top-of-stack is the position of the call to the next |
| 4785 // function. The stack will be empty if we lack the metadata to produce it, |
| 4786 // which happens for stub code. |
| 4787 void GetInlinedFunctionsAt( |
| 4788 intptr_t pc_offset, |
| 4789 GrowableArray<const Function*>* functions, |
| 4790 GrowableArray<TokenPosition>* token_positions) const; |
| 4837 | 4791 |
| 4838 RawArray* GetInlinedIdToFunction() const; | 4792 NOT_IN_PRODUCT(void PrintJSONInlineIntervals(JSONObject* object) const); |
| 4839 void SetInlinedIdToFunction(const Array& value) const; | 4793 void DumpInlineIntervals() const; |
| 4840 | 4794 void DumpSourcePositions() const; |
| 4841 RawArray* GetInlinedIdToTokenPos() const; | |
| 4842 void SetInlinedIdToTokenPos(const Array& value) const; | |
| 4843 | |
| 4844 RawArray* GetInlinedCallerIdMap() const; | |
| 4845 void SetInlinedCallerIdMap(const Array& value) const; | |
| 4846 | |
| 4847 // If |token_positions| is not NULL it will be populated with the token | |
| 4848 // positions of the inlined calls. | |
| 4849 void GetInlinedFunctionsAt( | |
| 4850 intptr_t offset, | |
| 4851 GrowableArray<Function*>* fs, | |
| 4852 GrowableArray<TokenPosition>* token_positions = NULL) const; | |
| 4853 | |
| 4854 void DumpInlinedIntervals() const; | |
| 4855 | 4795 |
| 4856 RawLocalVarDescriptors* var_descriptors() const { | 4796 RawLocalVarDescriptors* var_descriptors() const { |
| 4857 #if defined(DART_PRECOMPILED_RUNTIME) | 4797 #if defined(DART_PRECOMPILED_RUNTIME) |
| 4858 UNREACHABLE(); | 4798 UNREACHABLE(); |
| 4859 return NULL; | 4799 return NULL; |
| 4860 #else | 4800 #else |
| 4861 return raw_ptr()->var_descriptors_; | 4801 return raw_ptr()->var_descriptors_; |
| 4862 #endif | 4802 #endif |
| 4863 } | 4803 } |
| 4864 void set_var_descriptors(const LocalVarDescriptors& value) const { | 4804 void set_var_descriptors(const LocalVarDescriptors& value) const { |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5029 ASSERT(index >= 0); | 4969 ASSERT(index >= 0); |
| 5030 ASSERT(index < pointer_offsets_length()); | 4970 ASSERT(index < pointer_offsets_length()); |
| 5031 // TODO(iposva): Unit test is missing for this functionality. | 4971 // TODO(iposva): Unit test is missing for this functionality. |
| 5032 return &UnsafeMutableNonPointer(raw_ptr()->data())[index]; | 4972 return &UnsafeMutableNonPointer(raw_ptr()->data())[index]; |
| 5033 } | 4973 } |
| 5034 void SetPointerOffsetAt(int index, int32_t offset_in_instructions) { | 4974 void SetPointerOffsetAt(int index, int32_t offset_in_instructions) { |
| 5035 NoSafepointScope no_safepoint; | 4975 NoSafepointScope no_safepoint; |
| 5036 *PointerOffsetAddrAt(index) = offset_in_instructions; | 4976 *PointerOffsetAddrAt(index) = offset_in_instructions; |
| 5037 } | 4977 } |
| 5038 | 4978 |
| 5039 // Currently slow, as it searches linearly through inlined_intervals(). | |
| 5040 intptr_t GetCallerId(intptr_t inlined_id) const; | |
| 5041 | |
| 5042 intptr_t BinarySearchInSCallTable(uword pc) const; | 4979 intptr_t BinarySearchInSCallTable(uword pc) const; |
| 5043 static RawCode* LookupCodeInIsolate(Isolate* isolate, uword pc); | 4980 static RawCode* LookupCodeInIsolate(Isolate* isolate, uword pc); |
| 5044 | 4981 |
| 5045 // New is a private method as RawInstruction and RawCode objects should | 4982 // New is a private method as RawInstruction and RawCode objects should |
| 5046 // only be created using the Code::FinalizeCode method. This method creates | 4983 // only be created using the Code::FinalizeCode method. This method creates |
| 5047 // the RawInstruction and RawCode objects, sets up the pointer offsets | 4984 // the RawInstruction and RawCode objects, sets up the pointer offsets |
| 5048 // and links the two in a GC safe manner. | 4985 // and links the two in a GC safe manner. |
| 5049 static RawCode* New(intptr_t pointer_offsets_length); | 4986 static RawCode* New(intptr_t pointer_offsets_length); |
| 5050 | 4987 |
| 5051 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); | 4988 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); |
| (...skipping 3904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8956 | 8893 |
| 8957 inline void TypeArguments::SetHash(intptr_t value) const { | 8894 inline void TypeArguments::SetHash(intptr_t value) const { |
| 8958 // This is only safe because we create a new Smi, which does not cause | 8895 // This is only safe because we create a new Smi, which does not cause |
| 8959 // heap allocation. | 8896 // heap allocation. |
| 8960 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8897 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8961 } | 8898 } |
| 8962 | 8899 |
| 8963 } // namespace dart | 8900 } // namespace dart |
| 8964 | 8901 |
| 8965 #endif // RUNTIME_VM_OBJECT_H_ | 8902 #endif // RUNTIME_VM_OBJECT_H_ |
| OLD | NEW |