| // Copyright 2018 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_OBJECTS_FREE_SPACE_INL_H_ |
| #define V8_OBJECTS_FREE_SPACE_INL_H_ |
| |
| #include "src/execution/isolate.h" |
| #include "src/heap/heap-write-barrier-inl.h" |
| #include "src/heap/heap.h" |
| #include "src/objects/free-space.h" |
| #include "src/objects/objects-inl.h" |
| |
| // Has to be the last include (doesn't have include guards): |
| #include "src/objects/object-macros.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| #include "torque-generated/src/objects/free-space-tq-inl.inc" |
| |
| TQ_OBJECT_CONSTRUCTORS_IMPL(FreeSpace) |
| |
| RELAXED_SMI_ACCESSORS(FreeSpace, size, kSizeOffset) |
| |
| int FreeSpace::Size() { return size(); } |
| |
| FreeSpace FreeSpace::next() { |
| DCHECK(IsValid()); |
| return FreeSpace::unchecked_cast( |
| TaggedField<Object, kNextOffset>::load(*this)); |
| } |
| |
| void FreeSpace::set_next(FreeSpace next) { |
| DCHECK(IsValid()); |
| RELAXED_WRITE_FIELD(*this, kNextOffset, next); |
| } |
| |
| FreeSpace FreeSpace::cast(HeapObject o) { |
| SLOW_DCHECK((!GetHeapFromWritableObject(o)->deserialization_complete()) || |
| o.IsFreeSpace()); |
| return bit_cast<FreeSpace>(o); |
| } |
| |
| FreeSpace FreeSpace::unchecked_cast(const Object o) { |
| return bit_cast<FreeSpace>(o); |
| } |
| |
| bool FreeSpace::IsValid() { |
| Heap* heap = GetHeapFromWritableObject(*this); |
| Object free_space_map = |
| Isolate::FromHeap(heap)->root(RootIndex::kFreeSpaceMap); |
| CHECK_IMPLIES(!map_slot().contains_value(free_space_map.ptr()), |
| !heap->deserialization_complete() && |
| map_slot().contains_value(kNullAddress)); |
| CHECK_LE(kNextOffset + kTaggedSize, relaxed_read_size()); |
| return true; |
| } |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #include "src/objects/object-macros-undef.h" |
| |
| #endif // V8_OBJECTS_FREE_SPACE_INL_H_ |