Skip to content

Commit 7944e4c

Browse files
lavenzgfacebook-github-bot
authored andcommitted
Pass the pointer of owning object in GCPointer::set() part II (#1509)
Summary: Pull Request resolved: #1509 Differential Revision: D62227030
1 parent 9223b4a commit 7944e4c

File tree

5 files changed

+42
-20
lines changed

5 files changed

+42
-20
lines changed

include/hermes/VM/GCPointer-inline.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,16 @@ inline void GCPointerBase::setNonNull(
5959
setNoBarrier(CompressedPointer::encodeNonNull(ptr, base));
6060
}
6161

62-
inline void
63-
GCPointerBase::set(PointerBase &base, CompressedPointer ptr, GC &gc) {
62+
inline void GCPointerBase::set(
63+
PointerBase &base,
64+
CompressedPointer ptr,
65+
GC &gc,
66+
const GCCell *owningObj) {
6467
assert(
6568
(!ptr || gc.validPointer(ptr.get(base))) &&
6669
"Cannot set a GCPointer to an invalid pointer");
6770
// Write barrier must happen before the write.
71+
(void)owningObj;
6872
gc.writeBarrier(this, ptr.get(base));
6973
setNoBarrier(ptr);
7074
}

include/hermes/VM/GCPointer.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ class GCPointerBase : public CompressedPointer {
4141
/// \param owningObj The object that contains this GCPointer.
4242
inline void
4343
set(PointerBase &base, GCCell *ptr, GC &gc, const GCCell *owningObj);
44-
inline void set(PointerBase &base, CompressedPointer ptr, GC &gc);
44+
inline void set(
45+
PointerBase &base,
46+
CompressedPointer ptr,
47+
GC &gc,
48+
const GCCell *owningObj);
4549
inline void
4650
setNonNull(PointerBase &base, GCCell *ptr, GC &gc, const GCCell *owningObj);
4751

@@ -102,8 +106,12 @@ class GCPointer : public GCPointerBase {
102106
}
103107

104108
/// Convenience overload of GCPointer::set for other GCPointers.
105-
void set(PointerBase &base, const GCPointer<T> &ptr, GC &gc) {
106-
GCPointerBase::set(base, ptr, gc);
109+
void set(
110+
PointerBase &base,
111+
const GCPointer<T> &ptr,
112+
GC &gc,
113+
const GCCell *owningObj) {
114+
GCPointerBase::set(base, ptr, gc, owningObj);
107115
}
108116
};
109117

lib/VM/HiddenClass.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ Handle<HiddenClass> HiddenClass::copyToNewDictionary(
213213
initializeMissingPropertyMap(selfHandle, runtime);
214214

215215
newClassHandle->propertyMap_.set(
216-
runtime, selfHandle->propertyMap_, runtime.getHeap());
216+
runtime, selfHandle->propertyMap_, runtime.getHeap(), *newClassHandle);
217217
selfHandle->propertyMap_.setNull(runtime.getHeap());
218218

219219
LLVM_DEBUG(
@@ -436,7 +436,7 @@ CallResult<std::pair<Handle<HiddenClass>, SlotIndex>> HiddenClass::addProperty(
436436
return ExecutionStatus::EXCEPTION;
437437
}
438438
childHandle->propertyMap_.set(
439-
runtime, selfHandle->propertyMap_, runtime.getHeap());
439+
runtime, selfHandle->propertyMap_, runtime.getHeap(), *childHandle);
440440
} else {
441441
LLVM_DEBUG(
442442
dbgs() << "Adding property " << runtime.formatSymbolID(name)
@@ -512,7 +512,7 @@ CallResult<std::pair<Handle<HiddenClass>, SlotIndex>> HiddenClass::addProperty(
512512

513513
// Move the map to the child class.
514514
childHandle->propertyMap_.set(
515-
runtime, selfHandle->propertyMap_, runtime.getHeap());
515+
runtime, selfHandle->propertyMap_, runtime.getHeap(), *childHandle);
516516
selfHandle->propertyMap_.setNull(runtime.getHeap());
517517

518518
if (LLVM_UNLIKELY(
@@ -589,7 +589,7 @@ Handle<HiddenClass> HiddenClass::updateProperty(
589589

590590
descPair->second.flags = newFlags;
591591
existingChild->propertyMap_.set(
592-
runtime, selfHandle->propertyMap_, runtime.getHeap());
592+
runtime, selfHandle->propertyMap_, runtime.getHeap(), existingChild);
593593
} else {
594594
LLVM_DEBUG(
595595
dbgs() << "Updating property " << runtime.formatSymbolID(name)
@@ -634,7 +634,7 @@ Handle<HiddenClass> HiddenClass::updateProperty(
634634

635635
// Move the updated map to the child class.
636636
childHandle->propertyMap_.set(
637-
runtime, selfHandle->propertyMap_, runtime.getHeap());
637+
runtime, selfHandle->propertyMap_, runtime.getHeap(), *childHandle);
638638
selfHandle->propertyMap_.setNull(runtime.getHeap());
639639

640640
return childHandle;
@@ -915,7 +915,8 @@ void HiddenClass::stealPropertyMapFromParent(
915915
self->propertyMap_.set(
916916
runtime,
917917
self->parent_.getNonNull(runtime)->propertyMap_,
918-
runtime.getHeap());
918+
runtime.getHeap(),
919+
self);
919920
self->parent_.getNonNull(runtime)->propertyMap_.setNull(runtime.getHeap());
920921

921922
// Does our class add a new property?

lib/VM/JSObject.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -3015,9 +3015,11 @@ JSObject::checkPropertyUpdate(
30153015

30163016
// If not setting the getter or the setter, re-use the current one.
30173017
if (!dpFlags.setGetter)
3018-
newAccessor->getter.set(runtime, curAccessor->getter, runtime.getHeap());
3018+
newAccessor->getter.set(
3019+
runtime, curAccessor->getter, runtime.getHeap(), newAccessor);
30193020
if (!dpFlags.setSetter)
3020-
newAccessor->setter.set(runtime, curAccessor->setter, runtime.getHeap());
3021+
newAccessor->setter.set(
3022+
runtime, curAccessor->setter, runtime.getHeap(), newAccessor);
30213023
}
30223024

30233025
// 8.12.9 [12] For each attribute field of Desc that is present, set the

lib/VM/OrderedHashMap.cpp

+14-7
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,18 @@ void OrderedHashMapBase<BucketType, Derived>::removeLinkedListNode(
8383
entry != lastIterationEntry_.get(runtime) &&
8484
"Cannot remove the last entry");
8585
if (entry->prevIterationEntry) {
86-
entry->prevIterationEntry.getNonNull(runtime)->nextIterationEntry.set(
87-
runtime, entry->nextIterationEntry, gc);
86+
auto *prevIterationEntry = entry->prevIterationEntry.getNonNull(runtime);
87+
prevIterationEntry->nextIterationEntry.set(
88+
runtime, entry->nextIterationEntry, gc, prevIterationEntry);
8889
}
8990
if (entry->nextIterationEntry) {
90-
entry->nextIterationEntry.getNonNull(runtime)->prevIterationEntry.set(
91-
runtime, entry->prevIterationEntry, gc);
91+
auto *nextIterationEntry = entry->nextIterationEntry.getNonNull(runtime);
92+
nextIterationEntry->prevIterationEntry.set(
93+
runtime, entry->prevIterationEntry, gc, nextIterationEntry);
9294
}
9395
if (entry == firstIterationEntry_.get(runtime)) {
94-
firstIterationEntry_.set(runtime, entry->nextIterationEntry, gc);
96+
firstIterationEntry_.set(
97+
runtime, entry->nextIterationEntry, gc, static_cast<Derived *>(this));
9598
}
9699
entry->prevIterationEntry.setNull(runtime.getHeap());
97100
}
@@ -346,7 +349,7 @@ ExecutionStatus OrderedHashMapBase<BucketType, Derived>::doInsert(
346349
previousLastEntry->nextIterationEntry.set(
347350
runtime, newMapEntry.get(), heap, previousLastEntry);
348351
newMapEntry->prevIterationEntry.set(
349-
runtime, rawSelf->lastIterationEntry_, heap);
352+
runtime, rawSelf->lastIterationEntry_, heap, *newMapEntry);
350353

351354
rawSelf->lastIterationEntry_.set(runtime, newMapEntry.get(), heap, *self);
352355

@@ -443,7 +446,11 @@ void OrderedHashMapBase<BucketType, Derived>::clear(Runtime &runtime) {
443446
// in case there is an iterator out there
444447
// pointing to the middle of the iteration chain. We need it to be
445448
// able to merge back eventually.
446-
firstIterationEntry_.set(runtime, lastIterationEntry_, runtime.getHeap());
449+
firstIterationEntry_.set(
450+
runtime,
451+
lastIterationEntry_,
452+
runtime.getHeap(),
453+
static_cast<Derived *>(this));
447454
firstIterationEntry_.getNonNull(runtime)->prevIterationEntry.setNull(
448455
runtime.getHeap());
449456
size_ = 0;

0 commit comments

Comments
 (0)