зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1435483
part 10. Add infallible "asyncCaller" and "caller" getters on nsIStackFrame. r=qdot
MozReview-Commit-ID: 8pdMDFHWlVt
This commit is contained in:
Родитель
b7eaf4b6ae
Коммит
c8bd8682bf
|
@ -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)]
|
||||
|
|
Загрузка…
Ссылка в новой задаче