gecko/dom/workers/DOMBindingBase.h
Igor Bukanov 83623b313c Bug 737365 - stop using the cx during finalization, part 1.
This part changes the signatures for various finalization API to take
not JSContext* but rather either JSFreeOp structure or its
library-private counterpart FreeOp. These structures wrap parameters
that are passed to the finalizers removing most of explicit dependencies
on JSContext in the finalization code.
2012-03-19 15:34:55 +01:00

139 lines
2.5 KiB
C++

/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_workers_dombindingbase_h__
#define mozilla_dom_workers_dombindingbase_h__
#include "mozilla/dom/workers/Workers.h"
#include "nsISupportsImpl.h"
#include "nsWrapperCache.h"
class nsIThreadJSContextStack;
BEGIN_WORKERS_NAMESPACE
#define BINDING_ENSURE_TRUE(_cond, _result, _retval) \
PR_BEGIN_MACRO \
if (!(_cond)) { \
NS_WARNING("BINDING_ENSURE failed!"); \
aRv = _result; \
return _retval; \
} \
PR_END_MACRO
#define BINDING_ENSURE_SUCCESS(_cond, _result, _retval) \
BINDING_ENSURE_TRUE(NS_SUCCEEDED(_cond), _result, _retval)
class DOMBindingBase : public nsWrapperCache
{
JSContext* mJSContext;
mutable nsCOMPtr<nsIThreadJSContextStack> mContextStack;
protected:
DOMBindingBase(JSContext* aCx);
virtual ~DOMBindingBase();
virtual void
_Trace(JSTracer* aTrc);
virtual void
_Finalize(JSFreeOp* aFop);
JSContext*
GetJSContextFromContextStack() const;
public:
NS_INLINE_DECL_REFCOUNTING(DOMBindingBase)
JSContext*
GetJSContext() const
{
return mJSContext ? mJSContext : GetJSContextFromContextStack();
}
#ifdef DEBUG
JSObject*
GetJSObject() const;
void
SetJSObject(JSObject* aObject);
#else
JSObject*
GetJSObject() const
{
// Reach in and grab the bits directly.
return GetJSObjectFromBits();
}
void
SetJSObject(JSObject* aObject)
{
// Set the bits directly.
SetWrapperBits(aObject);
}
#endif
};
template <class T>
class DOMBindingAnchor
{
T* mBinding;
JS::Anchor<JSObject*> mAnchor;
public:
DOMBindingAnchor()
: mBinding(NULL)
{ }
DOMBindingAnchor(T* aBinding)
{
*this = aBinding;
}
DOMBindingAnchor&
operator=(T* aBinding)
{
mBinding = aBinding;
if (aBinding) {
JSObject* obj = aBinding->GetJSObject();
MOZ_ASSERT(obj);
mAnchor.set(obj);
}
else {
mAnchor.clear();
}
}
T*
get() const
{
return const_cast<T*>(mBinding);
}
T*
operator->() const
{
return get();
}
operator T*() const
{
return get();
}
private:
DOMBindingAnchor(const DOMBindingAnchor& aOther) MOZ_DELETE;
DOMBindingAnchor&
operator=(const DOMBindingAnchor& aOther) MOZ_DELETE;
};
END_WORKERS_NAMESPACE
#endif // mozilla_dom_workers_dombindingbase_h__