summaryrefslogtreecommitdiffstats
path: root/Source/JavaScriptCore/runtime/WriteBarrier.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/runtime/WriteBarrier.h')
-rw-r--r--Source/JavaScriptCore/runtime/WriteBarrier.h155
1 files changed, 90 insertions, 65 deletions
diff --git a/Source/JavaScriptCore/runtime/WriteBarrier.h b/Source/JavaScriptCore/runtime/WriteBarrier.h
index 64150ed..32cb968 100644
--- a/Source/JavaScriptCore/runtime/WriteBarrier.h
+++ b/Source/JavaScriptCore/runtime/WriteBarrier.h
@@ -32,62 +32,59 @@ namespace JSC {
class JSCell;
class JSGlobalData;
-typedef enum { } Unknown;
-
-template <class T> class DeprecatedPtr {
-public:
- DeprecatedPtr() : m_cell(0) { }
- DeprecatedPtr(T* cell) : m_cell(reinterpret_cast<JSCell*>(cell)) { }
- T* get() const { return reinterpret_cast<T*>(m_cell); }
- T* operator*() const { return static_cast<T*>(m_cell); }
- T* operator->() const { return static_cast<T*>(m_cell); }
-
- JSCell** slot() { return &m_cell; }
-
- typedef T* (DeprecatedPtr::*UnspecifiedBoolType);
- operator UnspecifiedBoolType*() const { return m_cell ? reinterpret_cast<UnspecifiedBoolType*>(1) : 0; }
-
- bool operator!() const { return !m_cell; }
+inline void writeBarrier(JSGlobalData&, const JSCell*, JSValue)
+{
+}
-protected:
- JSCell* m_cell;
-};
+inline void writeBarrier(JSGlobalData&, const JSCell*, JSCell*)
+{
+}
-template <> class DeprecatedPtr<Unknown> {
-public:
- DeprecatedPtr() { }
- DeprecatedPtr(JSValue value) : m_value(value) { }
- DeprecatedPtr(JSCell* value) : m_value(value) { }
- const JSValue& get() const { return m_value; }
- const JSValue* operator*() const { return &m_value; }
- const JSValue* operator->() const { return &m_value; }
-
- JSValue* slot() { return &m_value; }
-
- typedef JSValue (DeprecatedPtr::*UnspecifiedBoolType);
- operator UnspecifiedBoolType*() const { return m_value ? reinterpret_cast<UnspecifiedBoolType*>(1) : 0; }
- bool operator!() const { return !m_value; }
-
-private:
- JSValue m_value;
-};
+typedef enum { } Unknown;
+typedef JSValue* HandleSlot;
-template <typename T> struct WriteBarrierCheck {
+template <typename T> struct JSValueChecker {
static const bool IsJSValue = false;
};
-template <> struct WriteBarrierCheck<JSValue> {
+template <> struct JSValueChecker<JSValue> {
static const bool IsJSValue = true;
};
+// We have a separate base class with no constructors for use in Unions.
template <typename T> class WriteBarrierBase {
public:
- COMPILE_ASSERT(!WriteBarrierCheck<T>::IsJSValue, WriteBarrier_JSValue_is_invalid__use_unknown);
- void set(JSGlobalData&, const JSCell*, T* value) { this->m_cell = reinterpret_cast<JSCell*>(value); }
+ COMPILE_ASSERT(!JSValueChecker<T>::IsJSValue, WriteBarrier_JSValue_is_invalid__use_unknown);
+ void set(JSGlobalData& globalData, const JSCell* owner, T* value)
+ {
+ this->m_cell = reinterpret_cast<JSCell*>(value);
+ writeBarrier(globalData, owner, this->m_cell);
+#if ENABLE(JSC_ZOMBIES)
+ ASSERT(!isZombie(owner));
+ ASSERT(!isZombie(m_cell));
+#endif
+ }
- T* get() const { return reinterpret_cast<T*>(m_cell); }
- T* operator*() const { return static_cast<T*>(m_cell); }
- T* operator->() const { return static_cast<T*>(m_cell); }
+ T* get() const
+ {
+ return reinterpret_cast<T*>(m_cell);
+ }
+
+ T* operator*() const
+ {
+ ASSERT(m_cell);
+#if ENABLE(JSC_ZOMBIES)
+ ASSERT(!isZombie(m_cell));
+#endif
+ return static_cast<T*>(m_cell);
+ }
+
+ T* operator->() const
+ {
+ ASSERT(m_cell);
+ return static_cast<T*>(m_cell);
+ }
+
void clear() { m_cell = 0; }
JSCell** slot() { return &m_cell; }
@@ -97,30 +94,46 @@ public:
bool operator!() const { return !m_cell; }
- void setWithoutWriteBarrier(T* value) { this->m_cell = reinterpret_cast<JSCell*>(value); }
+ void setWithoutWriteBarrier(T* value)
+ {
+ this->m_cell = reinterpret_cast<JSCell*>(value);
+#if ENABLE(JSC_ZOMBIES)
+ ASSERT(!m_cell || !isZombie(m_cell));
+#endif
+ }
-protected:
+private:
JSCell* m_cell;
};
-template <typename T> class WriteBarrier : public WriteBarrierBase<T> {
+template <> class WriteBarrierBase<Unknown> {
public:
- WriteBarrier() { this->m_cell = 0; }
- WriteBarrier(JSGlobalData& globalData, const JSCell* owner, T* value)
+ void set(JSGlobalData& globalData, const JSCell* owner, JSValue value)
{
- this->set(globalData, owner, value);
+#if ENABLE(JSC_ZOMBIES)
+ ASSERT(!isZombie(owner));
+ ASSERT(!value.isZombie());
+#endif
+ m_value = JSValue::encode(value);
+ writeBarrier(globalData, owner, value);
+ }
+ void setWithoutWriteBarrier(JSValue value)
+ {
+#if ENABLE(JSC_ZOMBIES)
+ ASSERT(!value.isZombie());
+#endif
+ m_value = JSValue::encode(value);
}
-};
-
-template <> class WriteBarrierBase<Unknown> {
-public:
- void set(JSGlobalData&, const JSCell*, JSValue value) { m_value = JSValue::encode(value); }
- void setWithoutWriteBarrier(JSValue value) { m_value = JSValue::encode(value); }
- JSValue get() const { return JSValue::decode(m_value); }
+ JSValue get() const
+ {
+ return JSValue::decode(m_value);
+ }
void clear() { m_value = JSValue::encode(JSValue()); }
void setUndefined() { m_value = JSValue::encode(jsUndefined()); }
bool isNumber() const { return get().isNumber(); }
+ bool isObject() const { return get().isObject(); }
+ bool isNull() const { return get().isNull(); }
bool isGetterSetter() const { return get().isGetterSetter(); }
JSValue* slot()
@@ -137,29 +150,41 @@ public:
operator UnspecifiedBoolType*() const { return get() ? reinterpret_cast<UnspecifiedBoolType*>(1) : 0; }
bool operator!() const { return !get(); }
-protected:
+private:
EncodedJSValue m_value;
};
+template <typename T> class WriteBarrier : public WriteBarrierBase<T> {
+public:
+ WriteBarrier()
+ {
+ this->setWithoutWriteBarrier(0);
+ }
+
+ WriteBarrier(JSGlobalData& globalData, const JSCell* owner, T* value)
+ {
+ this->set(globalData, owner, value);
+ }
+};
+
template <> class WriteBarrier<Unknown> : public WriteBarrierBase<Unknown> {
public:
- WriteBarrier() { m_value = JSValue::encode(JSValue()); }
+ WriteBarrier()
+ {
+ this->setWithoutWriteBarrier(JSValue());
+ }
+
WriteBarrier(JSGlobalData& globalData, const JSCell* owner, JSValue value)
{
this->set(globalData, owner, value);
}
};
-template <typename U, typename V> inline bool operator==(const DeprecatedPtr<U>& lhs, const DeprecatedPtr<V>& rhs)
-{
- return lhs.get() == rhs.get();
-}
-
template <typename U, typename V> inline bool operator==(const WriteBarrierBase<U>& lhs, const WriteBarrierBase<V>& rhs)
{
return lhs.get() == rhs.get();
}
-}
+} // namespace JSC
#endif // WriteBarrier_h