Bug 1435483 part 10. Add infallible "asyncCaller" and "caller" getters on nsIStackFrame. r=qdot

MozReview-Commit-ID: 8pdMDFHWlVt
This commit is contained in:
Boris Zbarsky 2018-02-05 16:34:05 -05:00
Родитель b7eaf4b6ae
Коммит c8bd8682bf
5 изменённых файлов: 44 добавлений и 48 удалений

Просмотреть файл

@ -546,12 +546,19 @@ JSStackFrame::GetAsyncCause(JSContext* aCx,
}
}
NS_IMETHODIMP JSStackFrame::GetAsyncCaller(JSContext* aCx,
nsIStackFrame** aAsyncCaller)
NS_IMETHODIMP
JSStackFrame::GetAsyncCallerXPCOM(JSContext* aCx,
nsIStackFrame** aAsyncCaller)
{
*aAsyncCaller = GetAsyncCaller(aCx).take();
return NS_OK;
}
already_AddRefed<nsIStackFrame>
JSStackFrame::GetAsyncCaller(JSContext* aCx)
{
if (!mStack) {
*aAsyncCaller = nullptr;
return NS_OK;
return nullptr;
}
JS::Rooted<JSObject*> asyncCallerObj(aCx);
@ -561,27 +568,33 @@ NS_IMETHODIMP JSStackFrame::GetAsyncCaller(JSContext* aCx,
&asyncCallerObj);
if (useCachedValue) {
NS_IF_ADDREF(*aAsyncCaller = mAsyncCaller);
return NS_OK;
nsCOMPtr<nsIStackFrame> asyncCaller = mAsyncCaller;
return asyncCaller.forget();
}
nsCOMPtr<nsIStackFrame> asyncCaller =
asyncCallerObj ? new JSStackFrame(asyncCallerObj) : nullptr;
asyncCaller.forget(aAsyncCaller);
if (canCache) {
mAsyncCaller = *aAsyncCaller;
mAsyncCaller = asyncCaller;
mAsyncCallerInitialized = true;
}
return asyncCaller.forget();
}
NS_IMETHODIMP
JSStackFrame::GetCallerXPCOM(JSContext* aCx, nsIStackFrame** aCaller)
{
*aCaller = GetCaller(aCx).take();
return NS_OK;
}
NS_IMETHODIMP JSStackFrame::GetCaller(JSContext* aCx, nsIStackFrame** aCaller)
already_AddRefed<nsIStackFrame>
JSStackFrame::GetCaller(JSContext* aCx)
{
if (!mStack) {
*aCaller = nullptr;
return NS_OK;
return nullptr;
}
JS::Rooted<JSObject*> callerObj(aCx);
@ -590,20 +603,19 @@ NS_IMETHODIMP JSStackFrame::GetCaller(JSContext* aCx, nsIStackFrame** aCaller)
&canCache, &useCachedValue, &callerObj);
if (useCachedValue) {
NS_IF_ADDREF(*aCaller = mCaller);
return NS_OK;
nsCOMPtr<nsIStackFrame> caller = mCaller;
return caller.forget();
}
nsCOMPtr<nsIStackFrame> caller =
callerObj ? new JSStackFrame(callerObj) : nullptr;
caller.forget(aCaller);
if (canCache) {
mCaller = *aCaller;
mCaller = caller;
mCallerInitialized = true;
}
return NS_OK;
return caller.forget();
}
NS_IMETHODIMP JSStackFrame::GetFormattedStack(JSContext* aCx, nsAString& aStack)

Просмотреть файл

@ -1174,7 +1174,7 @@ StackFrameToStackEntry(JSContext* aCx, nsIStackFrame* aStackFrame,
}
}
nsresult
void
ReifyStack(JSContext* aCx, nsIStackFrame* aStack,
nsTArray<ConsoleStackEntry>& aRefiedStack)
{
@ -1184,18 +1184,13 @@ ReifyStack(JSContext* aCx, nsIStackFrame* aStack,
ConsoleStackEntry& data = *aRefiedStack.AppendElement();
StackFrameToStackEntry(aCx, stack, data);
nsCOMPtr<nsIStackFrame> caller;
nsresult rv = stack->GetCaller(aCx, getter_AddRefs(caller));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIStackFrame> caller = stack->GetCaller(aCx);
if (!caller) {
rv = stack->GetAsyncCaller(aCx, getter_AddRefs(caller));
NS_ENSURE_SUCCESS(rv, rv);
caller = stack->GetAsyncCaller(aCx);
}
stack.swap(caller);
}
return NS_OK;
}
} // anonymous namespace
@ -1297,10 +1292,7 @@ Console::MethodInternal(JSContext* aCx, MethodName aMethodName,
// nsIStackFrame is not threadsafe, so we need to snapshot it now,
// before we post our runnable to the main thread.
callData->mReifiedStack.emplace();
nsresult rv = ReifyStack(aCx, stack, *callData->mReifiedStack);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
ReifyStack(aCx, stack, *callData->mReifiedStack);
}
DOMHighResTimeStamp monotonicTimer;
@ -1403,11 +1395,7 @@ LazyStackGetter(JSContext* aCx, unsigned aArgc, JS::Value* aVp)
nsIStackFrame* stack = reinterpret_cast<nsIStackFrame*>(v.toPrivate());
nsTArray<ConsoleStackEntry> reifiedStack;
nsresult rv = ReifyStack(aCx, stack, reifiedStack);
if (NS_WARN_IF(NS_FAILED(rv))) {
Throw(aCx, rv);
return false;
}
ReifyStack(aCx, stack, reifiedStack);
JS::Rooted<JS::Value> stackVal(aCx);
if (NS_WARN_IF(!ToJSValue(aCx, reifiedStack, &stackVal))) {
@ -2690,13 +2678,10 @@ Console::MaybeExecuteDumpFunctionForTrace(JSContext* aCx, nsIStackFrame* aStack)
message.Append(filename);
message.AppendLiteral("\n");
nsCOMPtr<nsIStackFrame> caller;
nsresult rv = stack->GetCaller(aCx, getter_AddRefs(caller));
NS_ENSURE_SUCCESS_VOID(rv);
nsCOMPtr<nsIStackFrame> caller = stack->GetCaller(aCx);
if (!caller) {
rv = stack->GetAsyncCaller(aCx, getter_AddRefs(caller));
NS_ENSURE_SUCCESS_VOID(rv);
caller = stack->GetAsyncCaller(aCx);
}
stack.swap(caller);

Просмотреть файл

@ -385,10 +385,7 @@ class BlobURLsReporter final : public nsIMemoryReporter
stack += ")/";
}
nsCOMPtr<nsIStackFrame> caller;
nsresult rv = frame->GetCaller(cx, getter_AddRefs(caller));
NS_ENSURE_SUCCESS_VOID(rv);
caller.swap(frame);
frame = frame->GetCaller(cx);
}
}

Просмотреть файл

@ -67,10 +67,7 @@ SandboxLogJSStack(void)
lineNumber);
}
nsCOMPtr<nsIStackFrame> nextFrame;
nsresult rv = frame->GetCaller(cx, getter_AddRefs(nextFrame));
NS_ENSURE_SUCCESS_VOID(rv);
frame = nextFrame;
frame = frame->GetCaller(cx);
}
}

Просмотреть файл

@ -9,6 +9,7 @@
#include "nsISupports.idl"
[ptr] native JSContext(JSContext);
native StackFrameRef(already_AddRefed<nsIStackFrame>);
[scriptable, builtinclass, uuid(28bfb2a2-5ea6-4738-918b-049dc4d51f0b)]
interface nsIStackFrame : nsISupports
@ -25,9 +26,9 @@ interface nsIStackFrame : nsISupports
readonly attribute AUTF8String sourceLine;
[implicit_jscontext, binaryname(AsyncCauseXPCOM)]
readonly attribute AString asyncCause;
[implicit_jscontext]
[implicit_jscontext, binaryname(AsyncCallerXPCOM)]
readonly attribute nsIStackFrame asyncCaller;
[implicit_jscontext]
[implicit_jscontext, binaryname(CallerXPCOM)]
readonly attribute nsIStackFrame caller;
// Returns a formatted stack string that looks like the sort of
@ -54,6 +55,10 @@ interface nsIStackFrame : nsISupports
int32_t getColumnNumber(in JSContext aCx);
[notxpcom, nostdcall]
void getAsyncCause(in JSContext aCx, out AString aAsyncCause);
[notxpcom, nostdcall]
StackFrameRef getAsyncCaller(in JSContext aCx);
[notxpcom, nostdcall]
StackFrameRef getCaller(in JSContext aCx);
};
[scriptable, builtinclass, uuid(4371b5bf-6845-487f-8d9d-3f1e4a9badd2)]