| 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" |
| 11 #include "vm/json_stream.h" | 11 #include "vm/json_stream.h" |
| 12 #include "vm/bitmap.h" | 12 #include "vm/bitmap.h" |
| 13 #include "vm/dart.h" | 13 #include "vm/dart.h" |
| 14 #include "vm/flags.h" | 14 #include "vm/flags.h" |
| 15 #include "vm/globals.h" | 15 #include "vm/globals.h" |
| 16 #include "vm/growable_array.h" | 16 #include "vm/growable_array.h" |
| 17 #include "vm/handles.h" | 17 #include "vm/handles.h" |
| 18 #include "vm/heap.h" | 18 #include "vm/heap.h" |
| 19 #include "vm/isolate.h" | 19 #include "vm/isolate.h" |
| 20 #include "vm/method_recognizer.h" | 20 #include "vm/method_recognizer.h" |
| 21 #include "vm/os.h" | 21 #include "vm/os.h" |
| 22 #include "vm/raw_object.h" | 22 #include "vm/raw_object.h" |
| 23 #include "vm/report.h" | 23 #include "vm/report.h" |
| 24 #include "vm/scanner.h" | 24 #include "vm/scanner.h" |
| 25 #include "vm/tags.h" | 25 #include "vm/tags.h" |
| 26 #include "vm/thread.h" | 26 #include "vm/thread.h" |
| 27 #include "vm/token_position.h" | 27 #include "vm/token_position.h" |
| 28 #include "vm/verified_memory.h" | |
| 29 | 28 |
| 30 namespace dart { | 29 namespace dart { |
| 31 | 30 |
| 32 // Forward declarations. | 31 // Forward declarations. |
| 33 #define DEFINE_FORWARD_DECLARATION(clazz) \ | 32 #define DEFINE_FORWARD_DECLARATION(clazz) \ |
| 34 class clazz; | 33 class clazz; |
| 35 CLASS_LIST(DEFINE_FORWARD_DECLARATION) | 34 CLASS_LIST(DEFINE_FORWARD_DECLARATION) |
| 36 #undef DEFINE_FORWARD_DECLARATION | 35 #undef DEFINE_FORWARD_DECLARATION |
| 37 class Api; | 36 class Api; |
| 38 class ArgumentsDescriptor; | 37 class ArgumentsDescriptor; |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 } | 647 } |
| 649 | 648 |
| 650 // Store a range of pointers [from, from + count) into [to, to + count). | 649 // Store a range of pointers [from, from + count) into [to, to + count). |
| 651 // TODO(koda): Use this to fix Object::Clone's broken store buffer logic. | 650 // TODO(koda): Use this to fix Object::Clone's broken store buffer logic. |
| 652 void StorePointers(RawObject* const* to, | 651 void StorePointers(RawObject* const* to, |
| 653 RawObject* const* from, | 652 RawObject* const* from, |
| 654 intptr_t count) { | 653 intptr_t count) { |
| 655 ASSERT(Contains(reinterpret_cast<uword>(to))); | 654 ASSERT(Contains(reinterpret_cast<uword>(to))); |
| 656 if (raw()->IsNewObject()) { | 655 if (raw()->IsNewObject()) { |
| 657 memmove(const_cast<RawObject**>(to), from, count * kWordSize); | 656 memmove(const_cast<RawObject**>(to), from, count * kWordSize); |
| 658 VerifiedMemory::Accept(reinterpret_cast<uword>(to), count * kWordSize); | |
| 659 } else { | 657 } else { |
| 660 for (intptr_t i = 0; i < count; ++i) { | 658 for (intptr_t i = 0; i < count; ++i) { |
| 661 StorePointer(&to[i], from[i]); | 659 StorePointer(&to[i], from[i]); |
| 662 } | 660 } |
| 663 } | 661 } |
| 664 } | 662 } |
| 665 | 663 |
| 666 // Use for storing into an explicitly Smi-typed field of an object | 664 // Use for storing into an explicitly Smi-typed field of an object |
| 667 // (i.e., both the previous and new value are Smis). | 665 // (i.e., both the previous and new value are Smis). |
| 668 void StoreSmi(RawSmi* const* addr, RawSmi* value) const { | 666 void StoreSmi(RawSmi* const* addr, RawSmi* value) const { |
| (...skipping 6764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7433 NoSafepointScope no_safepoint; | 7431 NoSafepointScope no_safepoint; |
| 7434 ASSERT(!IsNull()); | 7432 ASSERT(!IsNull()); |
| 7435 ASSERT(index < Length()); | 7433 ASSERT(index < Length()); |
| 7436 return *ObjectAddr(index); | 7434 return *ObjectAddr(index); |
| 7437 } | 7435 } |
| 7438 void SetAt(intptr_t index, const Object& value) const { | 7436 void SetAt(intptr_t index, const Object& value) const { |
| 7439 ASSERT(!IsNull()); | 7437 ASSERT(!IsNull()); |
| 7440 ASSERT(index < Length()); | 7438 ASSERT(index < Length()); |
| 7441 | 7439 |
| 7442 // TODO(iposva): Add storing NoSafepointScope. | 7440 // TODO(iposva): Add storing NoSafepointScope. |
| 7443 DataStorePointer(ObjectAddr(index), value.raw()); | 7441 data()->StorePointer(ObjectAddr(index), value.raw()); |
| 7444 } | 7442 } |
| 7445 | 7443 |
| 7446 void Add(const Object& value, Heap::Space space = Heap::kNew) const; | 7444 void Add(const Object& value, Heap::Space space = Heap::kNew) const; |
| 7447 | 7445 |
| 7448 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const; | 7446 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const; |
| 7449 RawObject* RemoveLast() const; | 7447 RawObject* RemoveLast() const; |
| 7450 | 7448 |
| 7451 virtual RawTypeArguments* GetTypeArguments() const { | 7449 virtual RawTypeArguments* GetTypeArguments() const { |
| 7452 return raw_ptr()->type_arguments_; | 7450 return raw_ptr()->type_arguments_; |
| 7453 } | 7451 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7503 Heap::Space space = Heap::kNew); | 7501 Heap::Space space = Heap::kNew); |
| 7504 static RawGrowableObjectArray* New(const Array& array, | 7502 static RawGrowableObjectArray* New(const Array& array, |
| 7505 Heap::Space space = Heap::kNew); | 7503 Heap::Space space = Heap::kNew); |
| 7506 | 7504 |
| 7507 private: | 7505 private: |
| 7508 RawArray* DataArray() const { return data()->ptr(); } | 7506 RawArray* DataArray() const { return data()->ptr(); } |
| 7509 RawObject** ObjectAddr(intptr_t index) const { | 7507 RawObject** ObjectAddr(intptr_t index) const { |
| 7510 ASSERT((index >= 0) && (index < Length())); | 7508 ASSERT((index >= 0) && (index < Length())); |
| 7511 return &(DataArray()->data()[index]); | 7509 return &(DataArray()->data()[index]); |
| 7512 } | 7510 } |
| 7513 void DataStorePointer(RawObject** addr, RawObject* value) const { | |
| 7514 data()->StorePointer(addr, value); | |
| 7515 } | |
| 7516 | 7511 |
| 7517 static const int kDefaultInitialCapacity = 4; | 7512 static const int kDefaultInitialCapacity = 4; |
| 7518 | 7513 |
| 7519 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); | 7514 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); |
| 7520 friend class Array; | 7515 friend class Array; |
| 7521 friend class Class; | 7516 friend class Class; |
| 7522 }; | 7517 }; |
| 7523 | 7518 |
| 7524 | 7519 |
| 7525 class Float32x4 : public Instance { | 7520 class Float32x4 : public Instance { |
| (...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8738 | 8733 |
| 8739 inline void TypeArguments::SetHash(intptr_t value) const { | 8734 inline void TypeArguments::SetHash(intptr_t value) const { |
| 8740 // This is only safe because we create a new Smi, which does not cause | 8735 // This is only safe because we create a new Smi, which does not cause |
| 8741 // heap allocation. | 8736 // heap allocation. |
| 8742 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8737 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8743 } | 8738 } |
| 8744 | 8739 |
| 8745 } // namespace dart | 8740 } // namespace dart |
| 8746 | 8741 |
| 8747 #endif // VM_OBJECT_H_ | 8742 #endif // VM_OBJECT_H_ |
| OLD | NEW |