Bug 1140435 - Part 1 - Add the asyncCause and asyncCaller properties to nsIStackFrame. r=bz

This commit is contained in:
Paolo Amadini 2015-03-07 13:30:34 +00:00
parent 95e22255ac
commit 6652a00032
2 changed files with 90 additions and 2 deletions

View File

@ -256,8 +256,10 @@ protected:
}
nsCOMPtr<nsIStackFrame> mCaller;
nsCOMPtr<nsIStackFrame> mAsyncCaller;
nsString mFilename;
nsString mFunname;
nsString mAsyncCause;
int32_t mLineno;
int32_t mColNo;
uint32_t mLanguage;
@ -280,7 +282,7 @@ StackFrame::~StackFrame()
{
}
NS_IMPL_CYCLE_COLLECTION(StackFrame, mCaller)
NS_IMPL_CYCLE_COLLECTION(StackFrame, mCaller, mAsyncCaller)
NS_IMPL_CYCLE_COLLECTING_ADDREF(StackFrame)
NS_IMPL_CYCLE_COLLECTING_RELEASE(StackFrame)
@ -305,6 +307,8 @@ public:
NS_IMETHOD GetLanguageName(nsACString& aLanguageName) MOZ_OVERRIDE;
NS_IMETHOD GetFilename(nsAString& aFilename) MOZ_OVERRIDE;
NS_IMETHOD GetName(nsAString& aFunction) MOZ_OVERRIDE;
NS_IMETHOD GetAsyncCause(nsAString& aAsyncCause) MOZ_OVERRIDE;
NS_IMETHOD GetAsyncCaller(nsIStackFrame** aAsyncCaller) MOZ_OVERRIDE;
NS_IMETHOD GetCaller(nsIStackFrame** aCaller) MOZ_OVERRIDE;
NS_IMETHOD GetFormattedStack(nsAString& aStack) MOZ_OVERRIDE;
@ -326,6 +330,8 @@ private:
bool mFunnameInitialized;
bool mLinenoInitialized;
bool mColNoInitialized;
bool mAsyncCauseInitialized;
bool mAsyncCallerInitialized;
bool mCallerInitialized;
bool mFormattedStackInitialized;
};
@ -336,6 +342,8 @@ JSStackFrame::JSStackFrame(JS::Handle<JSObject*> aStack)
, mFunnameInitialized(false)
, mLinenoInitialized(false)
, mColNoInitialized(false)
, mAsyncCauseInitialized(false)
, mAsyncCallerInitialized(false)
, mCallerInitialized(false)
, mFormattedStackInitialized(false)
{
@ -578,6 +586,84 @@ NS_IMETHODIMP StackFrame::GetSourceLine(nsACString& aSourceLine)
return NS_OK;
}
/* readonly attribute AString asyncCause; */
NS_IMETHODIMP JSStackFrame::GetAsyncCause(nsAString& aAsyncCause)
{
NS_ENSURE_TRUE(mStack, NS_ERROR_NOT_AVAILABLE);
ThreadsafeAutoJSContext cx;
JS::Rooted<JSString*> asyncCause(cx);
bool canCache = false, useCachedValue = false;
GetValueIfNotCached(cx, mStack, JS::GetSavedFrameAsyncCause,
mAsyncCauseInitialized, &canCache, &useCachedValue,
&asyncCause);
if (useCachedValue) {
return StackFrame::GetAsyncCause(aAsyncCause);
}
if (asyncCause) {
nsAutoJSString str;
if (!str.init(cx, asyncCause)) {
return NS_ERROR_OUT_OF_MEMORY;
}
aAsyncCause = str;
} else {
aAsyncCause.SetIsVoid(true);
}
if (canCache) {
mAsyncCause = aAsyncCause;
mAsyncCauseInitialized = true;
}
return NS_OK;
}
NS_IMETHODIMP StackFrame::GetAsyncCause(nsAString& aAsyncCause)
{
// The async cause must be set to null if empty.
if (mAsyncCause.IsEmpty()) {
aAsyncCause.SetIsVoid(true);
} else {
aAsyncCause.Assign(mAsyncCause);
}
return NS_OK;
}
/* readonly attribute nsIStackFrame asyncCaller; */
NS_IMETHODIMP JSStackFrame::GetAsyncCaller(nsIStackFrame** aAsyncCaller)
{
NS_ENSURE_TRUE(mStack, NS_ERROR_NOT_AVAILABLE);
ThreadsafeAutoJSContext cx;
JS::Rooted<JSObject*> asyncCallerObj(cx);
bool canCache = false, useCachedValue = false;
GetValueIfNotCached(cx, mStack, JS::GetSavedFrameAsyncParent,
mAsyncCallerInitialized, &canCache, &useCachedValue,
&asyncCallerObj);
if (useCachedValue) {
return StackFrame::GetAsyncCaller(aAsyncCaller);
}
nsCOMPtr<nsIStackFrame> asyncCaller =
asyncCallerObj ? new JSStackFrame(asyncCallerObj) : nullptr;
asyncCaller.forget(aAsyncCaller);
if (canCache) {
mAsyncCaller = *aAsyncCaller;
mAsyncCallerInitialized = true;
}
return NS_OK;
}
NS_IMETHODIMP StackFrame::GetAsyncCaller(nsIStackFrame** aAsyncCaller)
{
NS_IF_ADDREF(*aAsyncCaller = mAsyncCaller);
return NS_OK;
}
/* readonly attribute nsIStackFrame caller; */
NS_IMETHODIMP JSStackFrame::GetCaller(nsIStackFrame** aCaller)
{

View File

@ -10,7 +10,7 @@
#include "nsISupports.idl"
[scriptable, uuid(8272a3d5-2a94-40c0-8ab6-be76583a0221)]
[scriptable, uuid(9787bc41-1ec9-4fe0-8b31-ffee5db6a893)]
interface nsIStackFrame : nsISupports
{
// see nsIProgrammingLanguage for list of language consts
@ -22,6 +22,8 @@ interface nsIStackFrame : nsISupports
readonly attribute int32_t lineNumber;
readonly attribute int32_t columnNumber;
readonly attribute AUTF8String sourceLine;
readonly attribute AString asyncCause;
readonly attribute nsIStackFrame asyncCaller;
readonly attribute nsIStackFrame caller;
// Returns a formatted stack string that looks like the sort of