mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 04:15:43 +00:00
Bug 1140435 - Part 1 - Add the asyncCause and asyncCaller properties to nsIStackFrame. r=bz
This commit is contained in:
parent
95e22255ac
commit
6652a00032
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user