summaryrefslogtreecommitdiff
path: root/deps/v8/src/objects/objects-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/objects/objects-inl.h')
-rw-r--r--deps/v8/src/objects/objects-inl.h81
1 files changed, 54 insertions, 27 deletions
diff --git a/deps/v8/src/objects/objects-inl.h b/deps/v8/src/objects/objects-inl.h
index c94feca250..1a0ff834b2 100644
--- a/deps/v8/src/objects/objects-inl.h
+++ b/deps/v8/src/objects/objects-inl.h
@@ -16,6 +16,7 @@
#include "src/base/memory.h"
#include "src/builtins/builtins.h"
#include "src/common/external-pointer-inl.h"
+#include "src/common/globals.h"
#include "src/handles/handles-inl.h"
#include "src/heap/factory.h"
#include "src/heap/heap-write-barrier-inl.h"
@@ -42,7 +43,6 @@
#include "src/objects/tagged-impl-inl.h"
#include "src/objects/tagged-index.h"
#include "src/objects/templates.h"
-#include "src/sanitizer/tsan.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -631,10 +631,9 @@ void Object::InitExternalPointerField(size_t offset, Isolate* isolate,
i::InitExternalPointerField(field_address(offset), isolate, value, tag);
}
-Address Object::ReadExternalPointerField(size_t offset,
- PtrComprCageBase isolate_root,
+Address Object::ReadExternalPointerField(size_t offset, Isolate* isolate,
ExternalPointerTag tag) const {
- return i::ReadExternalPointerField(field_address(offset), isolate_root, tag);
+ return i::ReadExternalPointerField(field_address(offset), isolate, tag);
}
void Object::WriteExternalPointerField(size_t offset, Isolate* isolate,
@@ -650,11 +649,26 @@ MaybeObjectSlot HeapObject::RawMaybeWeakField(int byte_offset) const {
return MaybeObjectSlot(field_address(byte_offset));
}
-MapWord MapWord::FromMap(const Map map) { return MapWord(map.ptr()); }
+MapWord MapWord::FromMap(const Map map) {
+ DCHECK(map.is_null() || !MapWord::IsPacked(map.ptr()));
+#ifdef V8_MAP_PACKING
+ return MapWord(Pack(map.ptr()));
+#else
+ return MapWord(map.ptr());
+#endif
+}
-Map MapWord::ToMap() const { return Map::unchecked_cast(Object(value_)); }
+Map MapWord::ToMap() const {
+#ifdef V8_MAP_PACKING
+ return Map::unchecked_cast(Object(Unpack(value_)));
+#else
+ return Map::unchecked_cast(Object(value_));
+#endif
+}
-bool MapWord::IsForwardingAddress() const { return HAS_SMI_TAG(value_); }
+bool MapWord::IsForwardingAddress() const {
+ return (value_ & kForwardingTagMask) == kForwardingTag;
+}
MapWord MapWord::FromForwardingAddress(HeapObject object) {
return MapWord(object.ptr() - kHeapObjectTag);
@@ -697,7 +711,9 @@ ReadOnlyRoots HeapObject::GetReadOnlyRoots(PtrComprCageBase cage_base) const {
#endif
}
-DEF_GETTER(HeapObject, map, Map) { return map_word(cage_base).ToMap(); }
+DEF_GETTER(HeapObject, map, Map) {
+ return map_word(cage_base, kRelaxedLoad).ToMap();
+}
void HeapObject::set_map(Map value) {
#ifdef VERIFY_HEAP
@@ -705,7 +721,7 @@ void HeapObject::set_map(Map value) {
GetHeapFromWritableObject(*this)->VerifyObjectLayoutChange(*this, value);
}
#endif
- set_map_word(MapWord::FromMap(value));
+ set_map_word(MapWord::FromMap(value), kRelaxedStore);
#ifndef V8_DISABLE_WRITE_BARRIERS
if (!value.is_null()) {
// TODO(1600) We are passing kNullAddress as a slot because maps can never
@@ -715,17 +731,21 @@ void HeapObject::set_map(Map value) {
#endif
}
-DEF_GETTER(HeapObject, synchronized_map, Map) {
- return synchronized_map_word(cage_base).ToMap();
+Map HeapObject::map(AcquireLoadTag tag) const {
+ PtrComprCageBase cage_base = GetPtrComprCageBase(*this);
+ return HeapObject::map(cage_base, tag);
+}
+Map HeapObject::map(PtrComprCageBase cage_base, AcquireLoadTag tag) const {
+ return map_word(cage_base, tag).ToMap();
}
-void HeapObject::synchronized_set_map(Map value) {
+void HeapObject::set_map(Map value, ReleaseStoreTag tag) {
#ifdef VERIFY_HEAP
if (FLAG_verify_heap && !value.is_null()) {
GetHeapFromWritableObject(*this)->VerifyObjectLayoutChange(*this, value);
}
#endif
- synchronized_set_map_word(MapWord::FromMap(value));
+ set_map_word(MapWord::FromMap(value), tag);
#ifndef V8_DISABLE_WRITE_BARRIERS
if (!value.is_null()) {
// TODO(1600) We are passing kNullAddress as a slot because maps can never
@@ -742,11 +762,12 @@ void HeapObject::set_map_no_write_barrier(Map value) {
GetHeapFromWritableObject(*this)->VerifyObjectLayoutChange(*this, value);
}
#endif
- set_map_word(MapWord::FromMap(value));
+ set_map_word(MapWord::FromMap(value), kRelaxedStore);
}
void HeapObject::set_map_after_allocation(Map value, WriteBarrierMode mode) {
- set_map_word(MapWord::FromMap(value));
+ MapWord mapword = MapWord::FromMap(value);
+ set_map_word(mapword, kRelaxedStore);
#ifndef V8_DISABLE_WRITE_BARRIERS
if (mode != SKIP_WRITE_BARRIER) {
DCHECK(!value.is_null());
@@ -761,20 +782,28 @@ ObjectSlot HeapObject::map_slot() const {
return ObjectSlot(MapField::address(*this));
}
-DEF_GETTER(HeapObject, map_word, MapWord) {
- return MapField::Relaxed_Load(cage_base, *this);
+MapWord HeapObject::map_word(RelaxedLoadTag tag) const {
+ PtrComprCageBase cage_base = GetPtrComprCageBase(*this);
+ return HeapObject::map_word(cage_base, tag);
+}
+MapWord HeapObject::map_word(PtrComprCageBase cage_base, RelaxedLoadTag) const {
+ return MapField::Relaxed_Load_Map_Word(cage_base, *this);
}
-void HeapObject::set_map_word(MapWord map_word) {
- MapField::Relaxed_Store(*this, map_word);
+void HeapObject::set_map_word(MapWord map_word, RelaxedStoreTag) {
+ MapField::Relaxed_Store_Map_Word(*this, map_word);
}
-DEF_GETTER(HeapObject, synchronized_map_word, MapWord) {
- return MapField::Acquire_Load(cage_base, *this);
+MapWord HeapObject::map_word(AcquireLoadTag tag) const {
+ PtrComprCageBase cage_base = GetPtrComprCageBase(*this);
+ return HeapObject::map_word(cage_base, tag);
+}
+MapWord HeapObject::map_word(PtrComprCageBase cage_base, AcquireLoadTag) const {
+ return MapField::Acquire_Load_No_Unpack(cage_base, *this);
}
-void HeapObject::synchronized_set_map_word(MapWord map_word) {
- MapField::Release_Store(*this, map_word);
+void HeapObject::set_map_word(MapWord map_word, ReleaseStoreTag) {
+ MapField::Release_Store_Map_Word(*this, map_word);
}
bool HeapObject::release_compare_and_swap_map_word(MapWord old_map_word,
@@ -1081,8 +1110,7 @@ static inline uint32_t ObjectAddressForHashing(Address object) {
static inline Handle<Object> MakeEntryPair(Isolate* isolate, size_t index,
Handle<Object> value) {
Handle<Object> key = isolate->factory()->SizeToString(index);
- Handle<FixedArray> entry_storage =
- isolate->factory()->NewUninitializedFixedArray(2);
+ Handle<FixedArray> entry_storage = isolate->factory()->NewFixedArray(2);
{
entry_storage->set(0, *key, SKIP_WRITE_BARRIER);
entry_storage->set(1, *value, SKIP_WRITE_BARRIER);
@@ -1093,8 +1121,7 @@ static inline Handle<Object> MakeEntryPair(Isolate* isolate, size_t index,
static inline Handle<Object> MakeEntryPair(Isolate* isolate, Handle<Object> key,
Handle<Object> value) {
- Handle<FixedArray> entry_storage =
- isolate->factory()->NewUninitializedFixedArray(2);
+ Handle<FixedArray> entry_storage = isolate->factory()->NewFixedArray(2);
{
entry_storage->set(0, *key, SKIP_WRITE_BARRIER);
entry_storage->set(1, *value, SKIP_WRITE_BARRIER);