⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 211112 in webkit


Ignore:
Timestamp:
Jan 24, 2017, 2:40:40 PM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Unreviewed, rolling out r211091.
https://bugs.webkit.org/show_bug.cgi?id=167384

introduces a subtle bug in InferredTypeTable, huge
Octane/deltablue regression (Requested by pizlo on #webkit).

Reverted changeset:

"InferredTypeTable entry manipulation is not TOCTOU race safe"
https://bugs.webkit.org/show_bug.cgi?id=167344
http://trac.webkit.org/changeset/211091

Location:
trunk/Source/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r211111 r211112  
     12017-01-24  Commit Queue  <commit-queue@webkit.org>
     2
     3        Unreviewed, rolling out r211091.
     4        https://bugs.webkit.org/show_bug.cgi?id=167384
     5
     6        introduces a subtle bug in InferredTypeTable, huge
     7        Octane/deltablue regression (Requested by pizlo on #webkit).
     8
     9        Reverted changeset:
     10
     11        "InferredTypeTable entry manipulation is not TOCTOU race safe"
     12        https://bugs.webkit.org/show_bug.cgi?id=167344
     13        http://trac.webkit.org/changeset/211091
     14
    1152017-01-24  Filip Pizlo  <fpizlo@apple.com>
    216
  • trunk/Source/JavaScriptCore/runtime/InferredTypeTable.cpp

    r211091 r211112  
    5858   
    5959    for (auto& entry : inferredTypeTable->m_table) {
    60         auto entryValue = entry.value;
    61 
    62         if (!entryValue)
     60        if (!entry.value)
    6361            continue;
    64         if (entryValue->isRelevant())
    65             visitor.append(entryValue);
     62        if (entry.value->isRelevant())
     63            visitor.append(entry.value);
    6664        else
    6765            entry.value.clear();
     
    7270{
    7371    auto iter = m_table.find(uid);
    74     if (iter == m_table.end())
    75         return nullptr;
    76 
    77     auto entryValue = iter->value;
    78     if (!entryValue)
     72    if (iter == m_table.end() || !iter->value)
    7973        return nullptr;
    8074
    8175    // Take this opportunity to prune invalidated types.
    82     if (!entryValue->isRelevant()) {
     76    if (!iter->value->isRelevant()) {
    8377        iter->value.clear();
    8478        return nullptr;
    8579    }
    8680
    87     return entryValue.get();
     81    return iter->value.get();
    8882}
    8983
     
    106100    if (age == OldProperty) {
    107101        TableType::iterator iter = m_table.find(propertyName.uid());
    108         if (iter == m_table.end())
     102        if (iter == m_table.end() || !iter->value)
    109103            return false; // Absence on replace => top.
    110 
    111         auto entryValue = iter->value;
    112         if (!entryValue)
    113             return false;
    114104       
    115         if (entryValue->willStoreValue(vm, propertyName, value))
     105        if (iter->value->willStoreValue(vm, propertyName, value))
    116106            return true;
    117107       
     
    125115        result = m_table.add(propertyName.uid(), WriteBarrier<InferredType>());
    126116    }
    127     auto entryValue = result.iterator->value;
    128 
    129117    if (result.isNewEntry) {
    130118        InferredType* inferredType = InferredType::create(vm);
    131119        WTF::storeStoreFence();
    132         entryValue.set(vm, this, inferredType);
    133     } else if (!entryValue)
     120        result.iterator->value.set(vm, this, inferredType);
     121    } else if (!result.iterator->value)
    134122        return false;
    135123   
    136     if (entryValue->willStoreValue(vm, propertyName, value))
     124    if (result.iterator->value->willStoreValue(vm, propertyName, value))
    137125        return true;
    138126   
     
    146134    if (age == OldProperty) {
    147135        TableType::iterator iter = m_table.find(propertyName.uid());
    148         if (iter == m_table.end())
     136        if (iter == m_table.end() || !iter->value)
    149137            return; // Absence on replace => top.
    150138
    151         auto entryValue = iter->value;
    152 
    153         if (!entryValue)
    154             return;
    155 
    156         entryValue->makeTop(vm, propertyName);
     139        iter->value->makeTop(vm, propertyName);
    157140        iter->value.clear();
    158141        return;
Note: See TracChangeset for help on using the changeset viewer.