summaryrefslogtreecommitdiffstats
path: root/Source/JavaScriptCore/runtime/JSCell.h
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-18 13:36:51 +0100
committerSteve Block <steveblock@google.com>2011-05-24 15:38:28 +0100
commit2fc2651226baac27029e38c9d6ef883fa32084db (patch)
treee396d4bf89dcce6ed02071be66212495b1df1dec /Source/JavaScriptCore/runtime/JSCell.h
parentb3725cedeb43722b3b175aaeff70552e562d2c94 (diff)
downloadexternal_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.zip
external_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.tar.gz
external_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.tar.bz2
Merge WebKit at r78450: Initial merge by git.
Change-Id: I6d3e5f1f868ec266a0aafdef66182ddc3f265dc1
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSCell.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSCell.h56
1 files changed, 51 insertions, 5 deletions
diff --git a/Source/JavaScriptCore/runtime/JSCell.h b/Source/JavaScriptCore/runtime/JSCell.h
index 95f4efa..66f6197 100644
--- a/Source/JavaScriptCore/runtime/JSCell.h
+++ b/Source/JavaScriptCore/runtime/JSCell.h
@@ -64,6 +64,7 @@ namespace JSC {
friend class JSZombie;
friend class JSGlobalData;
friend class MarkedSpace;
+ friend class MarkedBlock;
private:
explicit JSCell(Structure*);
@@ -336,22 +337,50 @@ namespace JSC {
{
return isCell() ? asCell()->toThisObject(exec) : toThisObjectSlowCase(exec);
}
+
+ template <typename T> void MarkStack::append(DeprecatedPtr<T>* slot)
+ {
+ internalAppend(slot->get());
+ }
+
+ template <typename T> void MarkStack::append(WriteBarrierBase<T>* slot)
+ {
+ internalAppend(slot->get());
+ }
- ALWAYS_INLINE void MarkStack::append(JSCell* cell)
+ ALWAYS_INLINE void MarkStack::internalAppend(JSCell* cell)
{
ASSERT(!m_isCheckingForDefaultMarkViolation);
ASSERT(cell);
- if (Heap::checkMarkCell(cell))
+ if (Heap::testAndSetMarked(cell))
return;
if (cell->structure()->typeInfo().type() >= CompoundType)
m_values.append(cell);
}
- ALWAYS_INLINE void MarkStack::append(JSValue value)
+ ALWAYS_INLINE void MarkStack::deprecatedAppend(JSCell** value)
+ {
+ ASSERT(value);
+ internalAppend(*value);
+ }
+
+ ALWAYS_INLINE void MarkStack::deprecatedAppend(JSValue* value)
+ {
+ ASSERT(value);
+ internalAppend(*value);
+ }
+
+ ALWAYS_INLINE void MarkStack::deprecatedAppend(Register* value)
+ {
+ ASSERT(value);
+ internalAppend(value->jsValue());
+ }
+
+ ALWAYS_INLINE void MarkStack::internalAppend(JSValue value)
{
ASSERT(value);
if (value.isCell())
- append(value.asCell());
+ internalAppend(value.asCell());
}
inline Heap* Heap::heap(JSValue v)
@@ -363,7 +392,7 @@ namespace JSC {
inline Heap* Heap::heap(JSCell* c)
{
- return MarkedSpace::cellBlock(c)->heap;
+ return MarkedSpace::heap(c);
}
#if ENABLE(JSC_ZOMBIES)
@@ -372,6 +401,23 @@ namespace JSC {
return isCell() && asCell() && asCell()->isZombie();
}
#endif
+
+ inline void* MarkedBlock::allocate(size_t& nextCell)
+ {
+ do {
+ ASSERT(nextCell < CELLS_PER_BLOCK);
+ if (!marked.testAndSet(nextCell)) { // Always false for the last cell in the block
+ JSCell* cell = reinterpret_cast<JSCell*>(&cells[nextCell++]);
+ cell->~JSCell();
+ return cell;
+ }
+ nextCell = marked.nextPossiblyUnset(nextCell);
+ } while (nextCell != CELLS_PER_BLOCK);
+
+ nextCell = 0;
+ return 0;
+ }
+
} // namespace JSC
#endif // JSCell_h