X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/b80e619319b1def83d1e8b4f84042b661be1be7f..14957cd040308e3eeec43d26bae5d76da13fcd85:/runtime/JSPropertyNameIterator.cpp diff --git a/runtime/JSPropertyNameIterator.cpp b/runtime/JSPropertyNameIterator.cpp index a5d4da0..e05bb3f 100644 --- a/runtime/JSPropertyNameIterator.cpp +++ b/runtime/JSPropertyNameIterator.cpp @@ -35,22 +35,17 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSPropertyNameIterator); +const ClassInfo JSPropertyNameIterator::s_info = { "JSPropertyNameIterator", 0, 0, 0 }; + inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, PropertyNameArrayData* propertyNameArrayData, size_t numCacheableSlots) - : JSCell(exec->globalData().propertyNameIteratorStructure.get()) - , m_cachedStructure(0) + : JSCell(exec->globalData(), exec->globalData().propertyNameIteratorStructure.get()) , m_numCacheableSlots(numCacheableSlots) , m_jsStringsSize(propertyNameArrayData->propertyNameVector().size()) - , m_jsStrings(new JSValue[m_jsStringsSize]) + , m_jsStrings(adoptArrayPtr(new WriteBarrier[m_jsStringsSize])) { PropertyNameArrayData::PropertyNameVector& propertyNameVector = propertyNameArrayData->propertyNameVector(); for (size_t i = 0; i < m_jsStringsSize; ++i) - m_jsStrings[i] = jsOwnedString(exec, propertyNameVector[i].ustring()); -} - -JSPropertyNameIterator::~JSPropertyNameIterator() -{ - if (m_cachedStructure) - m_cachedStructure->clearEnumerationCache(this); + m_jsStrings[i].set(exec->globalData(), this, jsOwnedString(exec, propertyNameVector[i].ustring())); } JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSObject* o) @@ -77,22 +72,22 @@ JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSObject size_t count = normalizePrototypeChain(exec, o); StructureChain* structureChain = o->structure()->prototypeChain(exec); - RefPtr* structure = structureChain->head(); + WriteBarrier* structure = structureChain->head(); for (size_t i = 0; i < count; ++i) { if (structure[i]->typeInfo().overridesGetPropertyNames()) return jsPropertyNameIterator; } - jsPropertyNameIterator->setCachedPrototypeChain(structureChain); - jsPropertyNameIterator->setCachedStructure(o->structure()); - o->structure()->setEnumerationCache(jsPropertyNameIterator); + jsPropertyNameIterator->setCachedPrototypeChain(exec->globalData(), structureChain); + jsPropertyNameIterator->setCachedStructure(exec->globalData(), o->structure()); + o->structure()->setEnumerationCache(exec->globalData(), jsPropertyNameIterator); return jsPropertyNameIterator; } JSValue JSPropertyNameIterator::get(ExecState* exec, JSObject* base, size_t i) { - JSValue& identifier = m_jsStrings[i]; - if (m_cachedStructure == base->structure() && m_cachedPrototypeChain == base->structure()->prototypeChain(exec)) + JSValue identifier = m_jsStrings[i].get(); + if (m_cachedStructure.get() == base->structure() && m_cachedPrototypeChain.get() == base->structure()->prototypeChain(exec)) return identifier; if (!base->hasProperty(exec, Identifier(exec, asString(identifier)->value(exec)))) @@ -100,9 +95,13 @@ JSValue JSPropertyNameIterator::get(ExecState* exec, JSObject* base, size_t i) return identifier; } -void JSPropertyNameIterator::markChildren(MarkStack& markStack) +void JSPropertyNameIterator::visitChildren(SlotVisitor& visitor) { - markStack.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues); + ASSERT_GC_OBJECT_INHERITS(this, &s_info); + ASSERT(structure()->typeInfo().overridesVisitChildren()); + visitor.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues); + if (m_cachedPrototypeChain) + visitor.append(&m_cachedPrototypeChain); } } // namespace JSC