Changeset 211112 in webkit
- Timestamp:
- Jan 24, 2017, 2:40:40 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
-
ChangeLog (modified) (1 diff)
-
runtime/InferredTypeTable.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r211111 r211112 1 2017-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 1 15 2017-01-24 Filip Pizlo <fpizlo@apple.com> 2 16 -
trunk/Source/JavaScriptCore/runtime/InferredTypeTable.cpp
r211091 r211112 58 58 59 59 for (auto& entry : inferredTypeTable->m_table) { 60 auto entryValue = entry.value; 61 62 if (!entryValue) 60 if (!entry.value) 63 61 continue; 64 if (entry Value->isRelevant())65 visitor.append(entry Value);62 if (entry.value->isRelevant()) 63 visitor.append(entry.value); 66 64 else 67 65 entry.value.clear(); … … 72 70 { 73 71 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) 79 73 return nullptr; 80 74 81 75 // Take this opportunity to prune invalidated types. 82 if (! entryValue->isRelevant()) {76 if (!iter->value->isRelevant()) { 83 77 iter->value.clear(); 84 78 return nullptr; 85 79 } 86 80 87 return entryValue.get();81 return iter->value.get(); 88 82 } 89 83 … … 106 100 if (age == OldProperty) { 107 101 TableType::iterator iter = m_table.find(propertyName.uid()); 108 if (iter == m_table.end() )102 if (iter == m_table.end() || !iter->value) 109 103 return false; // Absence on replace => top. 110 111 auto entryValue = iter->value;112 if (!entryValue)113 return false;114 104 115 if ( entryValue->willStoreValue(vm, propertyName, value))105 if (iter->value->willStoreValue(vm, propertyName, value)) 116 106 return true; 117 107 … … 125 115 result = m_table.add(propertyName.uid(), WriteBarrier<InferredType>()); 126 116 } 127 auto entryValue = result.iterator->value;128 129 117 if (result.isNewEntry) { 130 118 InferredType* inferredType = InferredType::create(vm); 131 119 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) 134 122 return false; 135 123 136 if ( entryValue->willStoreValue(vm, propertyName, value))124 if (result.iterator->value->willStoreValue(vm, propertyName, value)) 137 125 return true; 138 126 … … 146 134 if (age == OldProperty) { 147 135 TableType::iterator iter = m_table.find(propertyName.uid()); 148 if (iter == m_table.end() )136 if (iter == m_table.end() || !iter->value) 149 137 return; // Absence on replace => top. 150 138 151 auto entryValue = iter->value; 152 153 if (!entryValue) 154 return; 155 156 entryValue->makeTop(vm, propertyName); 139 iter->value->makeTop(vm, propertyName); 157 140 iter->value.clear(); 158 141 return;
Note:
See TracChangeset
for help on using the changeset viewer.