ALWAYS_INLINE static void visitChildren(SlotVisitor& visitor, const JSCell* cell) { #if ENABLE(SIMPLE_HEAP_PROFILING) m_visitedTypeCounts.count(cell); #endif ASSERT(Heap::isMarked(cell)); if (isJSString(cell)) { JSString::visitChildren(const_cast<JSCell*>(cell), visitor); return; } if (isJSFinalObject(cell)) { JSObject::visitChildren(const_cast<JSCell*>(cell), visitor); return; } if (isJSArray(cell)) { JSArray::visitChildren(const_cast<JSCell*>(cell), visitor); return; } cell->methodTable()->visitChildren(const_cast<JSCell*>(cell), visitor); }
String JSFunction::displayName(ExecState* exec) { JSValue displayName = getDirect(exec->globalData(), exec->globalData().propertyNames->displayName); if (displayName && isJSString(displayName)) return asString(displayName)->tryGetValue(); return String(); }
const UString InternalFunction::displayName(JSGlobalData* globalData) { JSValue displayName = getDirect(globalData->propertyNames->displayName); if (displayName && isJSString(globalData, displayName)) return asString(displayName)->value(); return UString::null(); }
const String InternalFunction::displayName(ExecState* exec) { JSValue displayName = getDirect(exec->vm(), exec->vm().propertyNames->displayName); if (displayName && isJSString(displayName)) return asString(displayName)->tryGetValue(); return String(); }
const UString InternalFunction::displayName(ExecState* exec) { JSValue displayName = getDirect(exec->globalData().propertyNames->displayName); if (displayName && isJSString(&exec->globalData(), displayName)) return asString(displayName)->value(exec); return UString::null(); }
static ALWAYS_INLINE EncodedJSValue getByVal(ExecState* exec, JSCell* base, uint32_t index) { VM& vm = exec->vm(); NativeCallFrameTracer tracer(&vm, exec); if (base->isObject()) { JSObject* object = asObject(base); if (object->canGetIndexQuickly(index)) return JSValue::encode(object->getIndexQuickly(index)); } if (isJSString(base) && asString(base)->canGetIndex(index)) return JSValue::encode(asString(base)->getIndex(exec, index)); return JSValue::encode(JSValue(base).get(exec, index)); }
static inline EncodedJSValue getByVal(ExecState* exec, JSCell* base, uint32_t index) { // FIXME: the JIT used to handle these in compiled code! if (isJSArray(base) && asArray(base)->canGetIndex(index)) return JSValue::encode(asArray(base)->getIndex(index)); // FIXME: the JITstub used to relink this to an optimized form! if (isJSString(base) && asString(base)->canGetIndex(index)) return JSValue::encode(asString(base)->getIndex(exec, index)); // FIXME: the JITstub used to relink this to an optimized form! if (isJSByteArray(base) && asByteArray(base)->canAccessIndex(index)) return JSValue::encode(asByteArray(base)->getIndex(exec, index)); return JSValue::encode(JSValue(base).get(exec, index)); }
EncodedJSValue operationGetByVal(ExecState* exec, EncodedJSValue encodedBase, EncodedJSValue encodedProperty) { JSValue baseValue = JSValue::decode(encodedBase); JSValue property = JSValue::decode(encodedProperty); if (LIKELY(baseValue.isCell())) { JSCell* base = baseValue.asCell(); if (property.isUInt32()) { JSGlobalData* globalData = &exec->globalData(); uint32_t i = property.asUInt32(); // FIXME: the JIT used to handle these in compiled code! if (isJSArray(globalData, base) && asArray(base)->canGetIndex(i)) return JSValue::encode(asArray(base)->getIndex(i)); // FIXME: the JITstub used to relink this to an optimized form! if (isJSString(globalData, base) && asString(base)->canGetIndex(i)) return JSValue::encode(asString(base)->getIndex(exec, i)); // FIXME: the JITstub used to relink this to an optimized form! if (isJSByteArray(globalData, base) && asByteArray(base)->canAccessIndex(i)) return JSValue::encode(asByteArray(base)->getIndex(exec, i)); return JSValue::encode(baseValue.get(exec, i)); } if (property.isString()) { Identifier propertyName(exec, asString(property)->value(exec)); PropertySlot slot(base); if (base->fastGetOwnPropertySlot(exec, propertyName, slot)) return JSValue::encode(slot.getValue(exec, propertyName)); } } Identifier ident(exec, property.toString(exec)); return JSValue::encode(baseValue.get(exec, ident)); }
ALWAYS_INLINE static void visitChildren(SlotVisitor& visitor, const JSCell* cell) { StackStats::probe(); ASSERT(Heap::isMarked(cell)); if (isJSString(cell)) { JSString::visitChildren(const_cast<JSCell*>(cell), visitor); return; } if (isJSFinalObject(cell)) { JSFinalObject::visitChildren(const_cast<JSCell*>(cell), visitor); return; } if (isJSArray(cell)) { JSArray::visitChildren(const_cast<JSCell*>(cell), visitor); return; } cell->methodTable()->visitChildren(const_cast<JSCell*>(cell), visitor); }
ALWAYS_INLINE void SlotVisitor::visitChildren(const JSCell* cell) { ASSERT(Heap::isMarked(cell)); m_currentObjectCellStateBeforeVisiting = cell->cellState(); cell->setCellState(CellState::OldBlack); if (isJSString(cell)) { JSString::visitChildren(const_cast<JSCell*>(cell), *this); return; } if (isJSFinalObject(cell)) { JSFinalObject::visitChildren(const_cast<JSCell*>(cell), *this); return; } if (isJSArray(cell)) { JSArray::visitChildren(const_cast<JSCell*>(cell), *this); return; } cell->methodTable()->visitChildren(const_cast<JSCell*>(cell), *this); }