Simplify HeapSlot to make it trivially copyable

This removes the constructors, which were never called since we allocate arrays of HeapSlot with pod_malloc. The destructor is only ever called explicitly since we free this memory with js_free so it has been renamed to destroy(). Also removed is an unused manual barrier.
This commit is contained in:
trav90 2018-08-12 07:57:10 -05:00 • committed by Roy Tam
commit 4f91b109d0
2 changed files with 8 additions and 29 deletions

View file

@ -667,29 +667,15 @@ class HeapSlot : public WriteBarrieredBase<Value>
Element = 1 Element = 1
}; };
explicit HeapSlot() = delete;
explicit HeapSlot(NativeObject* obj, Kind kind, uint32_t slot, const Value& v)
: WriteBarrieredBase<Value>(v)
{
post(obj, kind, slot, v);
}
explicit HeapSlot(NativeObject* obj, Kind kind, uint32_t slot, const HeapSlot& s)
: WriteBarrieredBase<Value>(s.value)
{
post(obj, kind, slot, s);
}
~HeapSlot() {
pre();
}
void init(NativeObject* owner, Kind kind, uint32_t slot, const Value& v) { void init(NativeObject* owner, Kind kind, uint32_t slot, const Value& v) {
value = v; value = v;
post(owner, kind, slot, v); post(owner, kind, slot, v);
} }
void destroy() {
pre();
}
#ifdef DEBUG #ifdef DEBUG
bool preconditionForSet(NativeObject* owner, Kind kind, uint32_t slot) const; bool preconditionForSet(NativeObject* owner, Kind kind, uint32_t slot) const;
bool preconditionForWriteBarrierPost(NativeObject* obj, Kind kind, uint32_t slot, bool preconditionForWriteBarrierPost(NativeObject* obj, Kind kind, uint32_t slot,
@ -703,11 +689,6 @@ class HeapSlot : public WriteBarrieredBase<Value>
post(owner, kind, slot, v); post(owner, kind, slot, v);
} }
/* For users who need to manually barrier the raw types. */
static void writeBarrierPost(NativeObject* owner, Kind kind, uint32_t slot, const Value& target) {
reinterpret_cast<HeapSlot*>(const_cast<Value*>(&target))->post(owner, kind, slot, target);
}
private: private:
void post(NativeObject* owner, Kind kind, uint32_t slot, const Value& target) { void post(NativeObject* owner, Kind kind, uint32_t slot, const Value& target) {
MOZ_ASSERT(preconditionForWriteBarrierPost(owner, kind, slot, target)); MOZ_ASSERT(preconditionForWriteBarrierPost(owner, kind, slot, target));

View file

@ -876,7 +876,7 @@ class NativeObject : public ShapedObject
MOZ_ASSERT(end <= getDenseInitializedLength()); MOZ_ASSERT(end <= getDenseInitializedLength());
MOZ_ASSERT(!denseElementsAreCopyOnWrite()); MOZ_ASSERT(!denseElementsAreCopyOnWrite());
for (size_t i = start; i < end; i++) for (size_t i = start; i < end; i++)
elements_[i].HeapSlot::~HeapSlot(); elements_[i].destroy();
} }
/* /*
@ -885,7 +885,7 @@ class NativeObject : public ShapedObject
*/ */
void prepareSlotRangeForOverwrite(size_t start, size_t end) { void prepareSlotRangeForOverwrite(size_t start, size_t end) {
for (size_t i = start; i < end; i++) for (size_t i = start; i < end; i++)
getSlotAddressUnchecked(i)->HeapSlot::~HeapSlot(); getSlotAddressUnchecked(i)->destroy();
} }
public: public:
@ -1130,8 +1130,7 @@ class NativeObject : public ShapedObject
dst->set(this, HeapSlot::Element, dst - elements_, *src); dst->set(this, HeapSlot::Element, dst - elements_, *src);
} }
} else { } else {
memmove(reinterpret_cast<Value*>(elements_ + dstStart), elements_ + srcStart, memmove(elements_ + dstStart, elements_ + srcStart, count * sizeof(HeapSlot));
count * sizeof(Value));
elementsRangeWriteBarrierPost(dstStart, count); elementsRangeWriteBarrierPost(dstStart, count);
} }
} }
@ -1144,8 +1143,7 @@ class NativeObject : public ShapedObject
MOZ_ASSERT(!denseElementsAreCopyOnWrite()); MOZ_ASSERT(!denseElementsAreCopyOnWrite());
MOZ_ASSERT(!denseElementsAreFrozen()); MOZ_ASSERT(!denseElementsAreFrozen());
memmove(reinterpret_cast<Value*>(elements_ + dstStart), elements_ + srcStart, memmove(elements_ + dstStart, elements_ + srcStart, count * sizeof(HeapSlot));
count * sizeof(Value));
elementsRangeWriteBarrierPost(dstStart, count); elementsRangeWriteBarrierPost(dstStart, count);
} }