Skip to content

Commit

Permalink
Apply patch. rdar://problem/97276205
Browse files Browse the repository at this point in the history
  • Loading branch information
alancoon committed Aug 10, 2022
1 parent 5d2cc60 commit 1394b06
Showing 1 changed file with 21 additions and 23 deletions.
44 changes: 21 additions & 23 deletions Source/JavaScriptCore/bytecode/ObjectPropertyConditionSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,9 @@ static constexpr bool verbose = false;
}

ObjectPropertyCondition generateCondition(
VM& vm, JSCell* owner, JSObject* object, UniquedStringImpl* uid, PropertyCondition::Kind conditionKind, Concurrency concurrency)
VM& vm, JSCell* owner, JSObject* object, Structure* structure, UniquedStringImpl* uid, PropertyCondition::Kind conditionKind, Concurrency concurrency)
{
Structure* structure = object->structure(vm);
// The structure of object might change by the time we get here, so we need to make sure that our conditions are built against the structure that is passed in.
if (ObjectPropertyConditionSetInternal::verbose)
dataLog("Creating condition ", conditionKind, " for ", pointerDump(structure), "\n");

Expand All @@ -199,14 +199,14 @@ ObjectPropertyCondition generateCondition(
if (structure->hasPolyProto())
return ObjectPropertyCondition();
result = ObjectPropertyCondition::absence(
vm, owner, object, uid, object->structure(vm)->storedPrototypeObject());
vm, owner, object, uid, structure->storedPrototypeObject());
break;
}
case PropertyCondition::AbsenceOfSetEffect: {
if (structure->hasPolyProto())
return ObjectPropertyCondition();
result = ObjectPropertyCondition::absenceOfSetEffect(
vm, owner, object, uid, object->structure(vm)->storedPrototypeObject());
vm, owner, object, uid, structure->storedPrototypeObject());
break;
}
case PropertyCondition::Equivalence: {
Expand Down Expand Up @@ -290,7 +290,7 @@ ObjectPropertyConditionSet generateConditions(
return ObjectPropertyConditionSet::invalid();
}

if (!functor(conditions, object)) {
if (!functor(conditions, object, structure)) {
if (ObjectPropertyConditionSetInternal::verbose)
dataLog("Functor failed, invalid.\n");
return ObjectPropertyConditionSet::invalid();
Expand All @@ -315,9 +315,9 @@ ObjectPropertyConditionSet generateConditionsForPropertyMiss(
{
return generateConditions(
vm, globalObject, headStructure, nullptr,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&](Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
ObjectPropertyCondition result =
generateCondition(vm, owner, object, uid, PropertyCondition::Absence, Concurrency::MainThread);
generateCondition(vm, owner, object, structure, uid, PropertyCondition::Absence, Concurrency::MainThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -330,9 +330,9 @@ ObjectPropertyConditionSet generateConditionsForPropertySetterMiss(
{
return generateConditions(
vm, globalObject, headStructure, nullptr,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
ObjectPropertyCondition result =
generateCondition(vm, owner, object, uid, PropertyCondition::AbsenceOfSetEffect, Concurrency::MainThread);
generateCondition(vm, owner, object, structure, uid, PropertyCondition::AbsenceOfSetEffect, Concurrency::MainThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -346,11 +346,11 @@ ObjectPropertyConditionSet generateConditionsForPrototypePropertyHit(
{
return generateConditions(
vm, globalObject, headStructure, prototype,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
PropertyCondition::Kind kind =
object == prototype ? PropertyCondition::Presence : PropertyCondition::Absence;
ObjectPropertyCondition result =
generateCondition(vm, owner, object, uid, kind, Concurrency::MainThread);
generateCondition(vm, owner, object, structure, uid, kind, Concurrency::MainThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -364,10 +364,9 @@ ObjectPropertyConditionSet generateConditionsForPrototypePropertyHitCustom(
{
return generateConditions(
vm, globalObject, headStructure, prototype,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
auto kind = PropertyCondition::Absence;
if (object == prototype) {
Structure* structure = object->structure(vm);
PropertyOffset offset = structure->get(vm, uid);
if (isValidOffset(offset)) {
// When we reify custom accessors, we wrap them in a JSFunction that we shove
Expand Down Expand Up @@ -398,7 +397,7 @@ ObjectPropertyConditionSet generateConditionsForPrototypePropertyHitCustom(
return false;
}
}
ObjectPropertyCondition result = generateCondition(vm, owner, object, uid, kind, Concurrency::MainThread);
ObjectPropertyCondition result = generateCondition(vm, owner, object, structure, uid, kind, Concurrency::MainThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -415,7 +414,7 @@ ObjectPropertyConditionSet generateConditionsForInstanceOf(
dataLog("Searching for prototype ", JSValue(prototype), " starting with structure ", RawPointer(headStructure), " with shouldHit = ", shouldHit, "\n");
ObjectPropertyConditionSet result = generateConditions(
vm, globalObject, headStructure, shouldHit ? prototype : nullptr,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
if (ObjectPropertyConditionSetInternal::verbose)
dataLog("Encountered object: ", RawPointer(object), "\n");
if (object == prototype) {
Expand All @@ -424,7 +423,6 @@ ObjectPropertyConditionSet generateConditionsForInstanceOf(
return true;
}

Structure* structure = object->structure(vm);
if (structure->hasPolyProto())
return false;
conditions.append(
Expand All @@ -444,10 +442,10 @@ ObjectPropertyConditionSet generateConditionsForPrototypeEquivalenceConcurrently
VM& vm, JSGlobalObject* globalObject, Structure* headStructure, JSObject* prototype, UniquedStringImpl* uid)
{
return generateConditions(vm, globalObject, headStructure, prototype,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
PropertyCondition::Kind kind =
object == prototype ? PropertyCondition::Equivalence : PropertyCondition::Absence;
ObjectPropertyCondition result = generateCondition(vm, nullptr, object, uid, kind, Concurrency::ConcurrentThread);
ObjectPropertyCondition result = generateCondition(vm, nullptr, object, structure, uid, kind, Concurrency::ConcurrentThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -460,8 +458,8 @@ ObjectPropertyConditionSet generateConditionsForPropertyMissConcurrently(
{
return generateConditions(
vm, globalObject, headStructure, nullptr,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
ObjectPropertyCondition result = generateCondition(vm, nullptr, object, uid, PropertyCondition::Absence, Concurrency::ConcurrentThread);
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
ObjectPropertyCondition result = generateCondition(vm, nullptr, object, structure, uid, PropertyCondition::Absence, Concurrency::ConcurrentThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -474,9 +472,9 @@ ObjectPropertyConditionSet generateConditionsForPropertySetterMissConcurrently(
{
return generateConditions(
vm, globalObject, headStructure, nullptr,
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object) -> bool {
[&] (Vector<ObjectPropertyCondition>& conditions, JSObject* object, Structure* structure) -> bool {
ObjectPropertyCondition result =
generateCondition(vm, nullptr, object, uid, PropertyCondition::AbsenceOfSetEffect, Concurrency::ConcurrentThread);
generateCondition(vm, nullptr, object, structure, uid, PropertyCondition::AbsenceOfSetEffect, Concurrency::ConcurrentThread);
if (!result)
return false;
conditions.append(result);
Expand All @@ -487,7 +485,7 @@ ObjectPropertyConditionSet generateConditionsForPropertySetterMissConcurrently(
ObjectPropertyCondition generateConditionForSelfEquivalence(
VM& vm, JSCell* owner, JSObject* object, UniquedStringImpl* uid)
{
return generateCondition(vm, owner, object, uid, PropertyCondition::Equivalence, Concurrency::MainThread);
return generateCondition(vm, owner, object, object->structure(), uid, PropertyCondition::Equivalence, Concurrency::MainThread);
}

// Current might be null. Structure can't be null.
Expand Down

0 comments on commit 1394b06

Please sign in to comment.