ALWAYS_INLINE void SlotVisitor::internalAppend(JSValue* slot) { // This internalAppend is only intended for visits to object and array backing stores. // as it can change the JSValue pointed to be the argument when the original JSValue // is a string that contains the same contents as another string. StackStats::probe(); ASSERT(slot); JSValue value = *slot; ASSERT(value); if (!value.isCell()) return; JSCell* cell = value.asCell(); if (!cell) return; validate(cell); if (m_shouldHashCons && cell->isString()) { JSString* string = jsCast<JSString*>(cell); if (string->shouldTryHashCons() && string->tryHashConsLock()) { UniqueStringMap::AddResult addResult = m_uniqueStrings.add(string->string().impl(), value); if (addResult.isNewEntry) string->setHashConsSingleton(); else { JSValue existingJSValue = addResult.iterator->value; if (value != existingJSValue) jsCast<JSString*>(existingJSValue.asCell())->clearHashConsSingleton(); *slot = existingJSValue; string->releaseHashConsLock(); return; } string->releaseHashConsLock(); } } internalAppend(cell); }