Changeset 49726 in webkit for trunk/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
- Timestamp:
- Oct 16, 2009, 7:31:42 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
r49717 r49726 30 30 #include "JSPropertyNameIterator.h" 31 31 32 #include "JSGlobalObject.h"33 34 32 namespace JSC { 35 33 36 34 ASSERT_CLASS_FITS_IN_CELL(JSPropertyNameIterator); 37 35 38 JSPropertyNameIterator * JSPropertyNameIterator::create(ExecState* exec, JSObject* o)36 JSPropertyNameIterator::~JSPropertyNameIterator() 39 37 { 40 ASSERT(!o->structure()->enumerationCache() ||41 o->structure()->enumerationCache()->cachedStructure() != o->structure() ||42 o->structure()->enumerationCache()->cachedPrototypeChain() != o->structure()->prototypeChain(exec));43 44 PropertyNameArray propertyNames(exec);45 o->getPropertyNames(exec, propertyNames);46 JSPropertyNameIterator* jsPropertyNameIterator = new (exec) JSPropertyNameIterator(exec, propertyNames.data());47 48 if (o->structure()->isDictionary())49 return jsPropertyNameIterator;50 51 if (o->structure()->typeInfo().overridesGetPropertyNames())52 return jsPropertyNameIterator;53 54 size_t count = normalizePrototypeChain(exec, o);55 StructureChain* structureChain = o->structure()->prototypeChain(exec);56 RefPtr<Structure>* structure = structureChain->head();57 for (size_t i = 0; i < count; ++i) {58 if (structure[i]->typeInfo().overridesGetPropertyNames())59 return jsPropertyNameIterator;60 }61 62 jsPropertyNameIterator->setCachedPrototypeChain(structureChain);63 jsPropertyNameIterator->setCachedStructure(o->structure());64 o->structure()->setEnumerationCache(jsPropertyNameIterator);65 return jsPropertyNameIterator;66 }67 68 JSValue JSPropertyNameIterator::get(ExecState* exec, JSObject* base, size_t i)69 {70 JSValue& identifier = m_jsStrings[i];71 if (m_cachedStructure == base->structure() && m_cachedPrototypeChain == base->structure()->prototypeChain(exec))72 return identifier;73 74 if (!base->hasProperty(exec, Identifier(exec, asString(identifier)->value())))75 return JSValue();76 return identifier;77 38 } 78 39 79 40 void JSPropertyNameIterator::markChildren(MarkStack& markStack) 80 41 { 81 markStack.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues); 42 JSCell::markChildren(markStack); 43 if (m_object) 44 markStack.append(m_object); 45 } 46 47 void JSPropertyNameIterator::invalidate() 48 { 49 ASSERT(m_position == m_end); 50 m_object = 0; 51 m_data.clear(); 82 52 } 83 53
Note:
See TracChangeset
for help on using the changeset viewer.