Chromium Code Reviews| 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 object() : super() {} \ | 162 object() : super() {} \ |
| 163 BASE_OBJECT_IMPLEMENTATION(object, super) \ | 163 BASE_OBJECT_IMPLEMENTATION(object, super) \ |
| 164 | 164 |
| 165 #define HEAP_OBJECT_IMPLEMENTATION(object, super) \ | 165 #define HEAP_OBJECT_IMPLEMENTATION(object, super) \ |
| 166 OBJECT_IMPLEMENTATION(object, super); \ | 166 OBJECT_IMPLEMENTATION(object, super); \ |
| 167 Raw##object* raw_ptr() const { \ | 167 Raw##object* raw_ptr() const { \ |
| 168 ASSERT(raw() != null()); \ | 168 ASSERT(raw() != null()); \ |
| 169 return raw()->ptr(); \ | 169 return raw()->ptr(); \ |
| 170 } \ | 170 } \ |
| 171 SNAPSHOT_READER_SUPPORT(object) \ | 171 SNAPSHOT_READER_SUPPORT(object) \ |
| 172 friend class Isolate; \ | |
| 172 friend class StackFrame; \ | 173 friend class StackFrame; \ |
| 173 | 174 |
| 174 // This macro is used to denote types that do not have a sub-type. | 175 // This macro is used to denote types that do not have a sub-type. |
| 175 #define FINAL_HEAP_OBJECT_IMPLEMENTATION(object, super) \ | 176 #define FINAL_HEAP_OBJECT_IMPLEMENTATION(object, super) \ |
| 176 public: /* NOLINT */ \ | 177 public: /* NOLINT */ \ |
| 177 void operator=(Raw##object* value) { \ | 178 void operator=(Raw##object* value) { \ |
| 178 raw_ = value; \ | 179 raw_ = value; \ |
| 179 CHECK_HANDLE(); \ | 180 CHECK_HANDLE(); \ |
| 180 } \ | 181 } \ |
| 181 void operator^=(RawObject* value) { \ | 182 void operator^=(RawObject* value) { \ |
| 182 raw_ = value; \ | 183 raw_ = value; \ |
| 183 CHECK_HANDLE(); \ | 184 CHECK_HANDLE(); \ |
| 184 } \ | 185 } \ |
| 185 private: /* NOLINT */ \ | 186 private: /* NOLINT */ \ |
| 186 object() : super() {} \ | 187 object() : super() {} \ |
| 187 BASE_OBJECT_IMPLEMENTATION(object, super) \ | 188 BASE_OBJECT_IMPLEMENTATION(object, super) \ |
| 188 Raw##object* raw_ptr() const { \ | 189 Raw##object* raw_ptr() const { \ |
| 189 ASSERT(raw() != null()); \ | 190 ASSERT(raw() != null()); \ |
| 190 return raw()->ptr(); \ | 191 return raw()->ptr(); \ |
| 191 } \ | 192 } \ |
| 192 SNAPSHOT_READER_SUPPORT(object) \ | 193 SNAPSHOT_READER_SUPPORT(object) \ |
| 194 friend class Isolate; \ | |
| 193 friend class StackFrame; \ | 195 friend class StackFrame; \ |
| 194 | 196 |
| 195 class Object { | 197 class Object { |
| 196 public: | 198 public: |
| 197 virtual ~Object() { } | 199 virtual ~Object() { } |
| 198 | 200 |
| 199 RawObject* raw() const { return raw_; } | 201 RawObject* raw() const { return raw_; } |
| 200 void operator=(RawObject* value) { | 202 void operator=(RawObject* value) { |
| 201 initializeHandle(this, value); | 203 initializeHandle(this, value); |
| 202 } | 204 } |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 static LanguageError* snapshot_writer_error_; | 586 static LanguageError* snapshot_writer_error_; |
| 585 | 587 |
| 586 friend void ClassTable::Register(const Class& cls); | 588 friend void ClassTable::Register(const Class& cls); |
| 587 friend void RawObject::Validate(Isolate* isolate) const; | 589 friend void RawObject::Validate(Isolate* isolate) const; |
| 588 friend class Closure; | 590 friend class Closure; |
| 589 friend class SnapshotReader; | 591 friend class SnapshotReader; |
| 590 friend class OneByteString; | 592 friend class OneByteString; |
| 591 friend class TwoByteString; | 593 friend class TwoByteString; |
| 592 friend class ExternalOneByteString; | 594 friend class ExternalOneByteString; |
| 593 friend class ExternalTwoByteString; | 595 friend class ExternalTwoByteString; |
| 596 friend class Isolate; | |
| 594 | 597 |
| 595 DISALLOW_ALLOCATION(); | 598 DISALLOW_ALLOCATION(); |
| 596 DISALLOW_COPY_AND_ASSIGN(Object); | 599 DISALLOW_COPY_AND_ASSIGN(Object); |
| 597 }; | 600 }; |
| 598 | 601 |
| 599 | 602 |
| 600 class Class : public Object { | 603 class Class : public Object { |
| 601 public: | 604 public: |
| 602 intptr_t instance_size() const { | 605 intptr_t instance_size() const { |
| 603 ASSERT(is_finalized() || is_prefinalized()); | 606 ASSERT(is_finalized() || is_prefinalized()); |
| (...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2347 void AddMetadata(const Class& cls, | 2350 void AddMetadata(const Class& cls, |
| 2348 const String& name, | 2351 const String& name, |
| 2349 intptr_t token_pos) const; | 2352 intptr_t token_pos) const; |
| 2350 | 2353 |
| 2351 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); | 2354 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); |
| 2352 | 2355 |
| 2353 friend class Bootstrap; | 2356 friend class Bootstrap; |
| 2354 friend class Class; | 2357 friend class Class; |
| 2355 friend class Debugger; | 2358 friend class Debugger; |
| 2356 friend class DictionaryIterator; | 2359 friend class DictionaryIterator; |
| 2357 friend class Isolate; | |
| 2358 friend class Namespace; | 2360 friend class Namespace; |
| 2359 friend class Object; | 2361 friend class Object; |
| 2360 }; | 2362 }; |
| 2361 | 2363 |
| 2362 | 2364 |
| 2363 class LibraryPrefix : public Object { | 2365 class LibraryPrefix : public Object { |
| 2364 public: | 2366 public: |
| 2365 RawString* name() const { return raw_ptr()->name_; } | 2367 RawString* name() const { return raw_ptr()->name_; } |
| 2366 virtual RawString* DictionaryName() const { return name(); } | 2368 virtual RawString* DictionaryName() const { return name(); } |
| 2367 | 2369 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 2383 static const int kInitialSize = 2; | 2385 static const int kInitialSize = 2; |
| 2384 static const int kIncrementSize = 2; | 2386 static const int kIncrementSize = 2; |
| 2385 | 2387 |
| 2386 void set_name(const String& value) const; | 2388 void set_name(const String& value) const; |
| 2387 void set_imports(const Array& value) const; | 2389 void set_imports(const Array& value) const; |
| 2388 void set_num_imports(intptr_t value) const; | 2390 void set_num_imports(intptr_t value) const; |
| 2389 static RawLibraryPrefix* New(); | 2391 static RawLibraryPrefix* New(); |
| 2390 | 2392 |
| 2391 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Object); | 2393 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Object); |
| 2392 friend class Class; | 2394 friend class Class; |
| 2393 friend class Isolate; | |
| 2394 }; | 2395 }; |
| 2395 | 2396 |
| 2396 | 2397 |
| 2397 class Namespace : public Object { | 2398 class Namespace : public Object { |
| 2398 public: | 2399 public: |
| 2399 RawLibrary* library() const { return raw_ptr()->library_; } | 2400 RawLibrary* library() const { return raw_ptr()->library_; } |
| 2400 RawArray* show_names() const { return raw_ptr()->show_names_; } | 2401 RawArray* show_names() const { return raw_ptr()->show_names_; } |
| 2401 RawArray* hide_names() const { return raw_ptr()->hide_names_; } | 2402 RawArray* hide_names() const { return raw_ptr()->hide_names_; } |
| 2402 | 2403 |
| 2403 static intptr_t InstanceSize() { | 2404 static intptr_t InstanceSize() { |
| (...skipping 3401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5805 // Breaking cycles and loops. | 5806 // Breaking cycles and loops. |
| 5806 RawClass* Object::clazz() const { | 5807 RawClass* Object::clazz() const { |
| 5807 uword raw_value = reinterpret_cast<uword>(raw_); | 5808 uword raw_value = reinterpret_cast<uword>(raw_); |
| 5808 if ((raw_value & kSmiTagMask) == kSmiTag) { | 5809 if ((raw_value & kSmiTagMask) == kSmiTag) { |
| 5809 return Smi::Class(); | 5810 return Smi::Class(); |
| 5810 } | 5811 } |
| 5811 return Isolate::Current()->class_table()->At(raw()->GetClassId()); | 5812 return Isolate::Current()->class_table()->At(raw()->GetClassId()); |
| 5812 } | 5813 } |
| 5813 | 5814 |
| 5814 | 5815 |
| 5815 void Object::SetRaw(RawObject* value) { | 5816 inline void Object::SetRaw(RawObject* value) { |
|
Ivan Posva
2013/06/22 01:01:36
DART_FORCE_INLINE would be a good alternative here
siva
2013/07/18 20:39:23
Done.
| |
| 5816 // NOTE: The assignment "raw_ = value" should be the first statement in | 5817 // NOTE: The assignment "raw_ = value" should be the first statement in |
| 5817 // this function. Also do not use 'value' in this function after the | 5818 // this function. Also do not use 'value' in this function after the |
| 5818 // assignment (use 'raw_' instead). | 5819 // assignment (use 'raw_' instead). |
| 5819 raw_ = value; | 5820 raw_ = value; |
| 5820 if ((reinterpret_cast<uword>(raw_) & kSmiTagMask) == kSmiTag) { | 5821 cpp_vtable vtable_ptr; |
| 5821 set_vtable(Smi::handle_vtable_); | 5822 if ((reinterpret_cast<uword>(value) & kSmiTagMask) == kSmiTag) { |
| 5822 return; | 5823 vtable_ptr = Smi::handle_vtable_; |
|
Ivan Posva
2013/06/22 01:01:36
--verify_handles will fail below when being passed
siva
2013/07/18 20:39:23
Reverted this change as DART_FORCE_INLINE should m
| |
| 5824 } else { | |
| 5825 intptr_t cid = value->GetClassId(); | |
| 5826 if (cid >= kNumPredefinedCids) { | |
| 5827 cid = kInstanceCid; | |
| 5828 } | |
| 5829 vtable_ptr = builtin_vtables_[cid]; | |
| 5823 } | 5830 } |
| 5824 intptr_t cid = raw_->GetClassId(); | 5831 set_vtable(vtable_ptr); |
| 5825 if (cid >= kNumPredefinedCids) { | |
| 5826 cid = kInstanceCid; | |
| 5827 } | |
| 5828 set_vtable(builtin_vtables_[cid]); | |
| 5829 #if defined(DEBUG) | 5832 #if defined(DEBUG) |
| 5830 if (FLAG_verify_handles) { | 5833 if (FLAG_verify_handles) { |
| 5831 Isolate* isolate = Isolate::Current(); | 5834 Isolate* isolate = Isolate::Current(); |
| 5832 Heap* isolate_heap = isolate->heap(); | 5835 Heap* isolate_heap = isolate->heap(); |
| 5833 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); | 5836 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); |
| 5834 ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) || | 5837 ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) || |
| 5835 vm_isolate_heap->Contains(RawObject::ToAddr(raw_))); | 5838 vm_isolate_heap->Contains(RawObject::ToAddr(raw_))); |
| 5836 } | 5839 } |
| 5837 #endif | 5840 #endif |
| 5838 } | 5841 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5921 | 5924 |
| 5922 | 5925 |
| 5923 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 5926 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
| 5924 intptr_t index) { | 5927 intptr_t index) { |
| 5925 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 5928 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
| 5926 } | 5929 } |
| 5927 | 5930 |
| 5928 } // namespace dart | 5931 } // namespace dart |
| 5929 | 5932 |
| 5930 #endif // VM_OBJECT_H_ | 5933 #endif // VM_OBJECT_H_ |
| OLD | NEW |