Changeset 48264 in webkit for trunk/JavaScriptCore/runtime/Structure.h
- Timestamp:
- Sep 10, 2009, 1:01:57 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Structure.h
r48207 r48264 53 53 public: 54 54 friend class JIT; 55 friend class StructureTransitionTable; 55 56 static PassRefPtr<Structure> create(JSValue prototype, const TypeInfo& typeInfo) 56 57 { … … 175 176 JSCell* m_specificValueInPrevious; 176 177 177 union { 178 Structure* singleTransition; 179 StructureTransitionTable* table; 180 } m_transitions; 178 StructureTransitionTable table; 181 179 182 180 RefPtr<PropertyNameArrayData> m_cachedPropertyNameArrayData; … … 190 188 bool m_isPinnedPropertyTable : 1; 191 189 bool m_hasGetterSetterProperties : 1; 192 bool m_usingSingleTransitionSlot : 1;193 190 unsigned m_attributesInPrevious : 7; 194 191 }; … … 241 238 bool StructureTransitionTable::contains(const StructureTransitionTableHash::Key& key, JSCell* specificValue) 242 239 { 243 TransitionTable::iterator find = m_table.find(key); 244 if (find == m_table.end()) 240 if (usingSingleTransitionSlot()) { 241 Structure* existingTransition = singleTransition(); 242 return existingTransition && existingTransition->m_nameInPrevious.get() == key.first 243 && existingTransition->m_attributesInPrevious == key.second 244 && (existingTransition->m_specificValueInPrevious == specificValue || existingTransition->m_specificValueInPrevious == 0); 245 } 246 TransitionTable::iterator find = table()->find(key); 247 if (find == table()->end()) 245 248 return false; 246 249 … … 250 253 Structure* StructureTransitionTable::get(const StructureTransitionTableHash::Key& key, JSCell* specificValue) const 251 254 { 252 Transition transition = m_table.get(key); 255 if (usingSingleTransitionSlot()) { 256 Structure* existingTransition = singleTransition(); 257 if (existingTransition && existingTransition->m_nameInPrevious.get() == key.first 258 && existingTransition->m_attributesInPrevious == key.second 259 && (existingTransition->m_specificValueInPrevious == specificValue || existingTransition->m_specificValueInPrevious == 0)) 260 return existingTransition; 261 return 0; 262 } 263 264 Transition transition = table()->get(key); 253 265 if (transition.second && transition.second->transitionedFor(specificValue)) 254 266 return transition.second; 255 267 return transition.first; 256 268 } 269 270 bool StructureTransitionTable::hasTransition(const StructureTransitionTableHash::Key& key) const 271 { 272 if (usingSingleTransitionSlot()) { 273 Structure* transition = singleTransition(); 274 return transition && transition->m_nameInPrevious == key.first 275 && transition->m_attributesInPrevious == key.second; 276 } 277 return table()->contains(key); 278 } 279 280 void StructureTransitionTable::reifySingleTransition() 281 { 282 ASSERT(usingSingleTransitionSlot()); 283 Structure* existingTransition = singleTransition(); 284 ASSERT(existingTransition); 285 TransitionTable* transitionTable = new TransitionTable; 286 setTransitionTable(transitionTable); 287 add(make_pair(existingTransition->m_nameInPrevious.get(), existingTransition->m_attributesInPrevious), existingTransition, existingTransition->m_specificValueInPrevious); 288 } 257 289 } // namespace JSC 258 290
Note:
See TracChangeset
for help on using the changeset viewer.