mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 538143 [@ XPCJSStackFrame::CreateStack] should not use recursion. r=mrbkap
--HG-- extra : rebase_source : 44c9c229412f0d846924c9adbed2dbda72cf890d
This commit is contained in:
parent
a2a2fc35ea
commit
df9707b1ca
@ -66,7 +66,7 @@ public:
|
|||||||
{return mLanguage == nsIProgrammingLanguage::JAVASCRIPT;}
|
{return mLanguage == nsIProgrammingLanguage::JAVASCRIPT;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
nsIStackFrame* mCaller;
|
nsCOMPtr<nsIStackFrame> mCaller;
|
||||||
|
|
||||||
char* mFilename;
|
char* mFilename;
|
||||||
char* mFunname;
|
char* mFunname;
|
||||||
@ -85,7 +85,7 @@ XPCJSStack::CreateStack(JSContext* cx, nsIStackFrame** stack)
|
|||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
JSStackFrame *fp = NULL;
|
JSStackFrame *fp = NULL;
|
||||||
if (!JS_FrameIterator(cx, &fp))
|
if(!JS_FrameIterator(cx, &fp))
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
return XPCJSStackFrame::CreateStack(cx, fp, (XPCJSStackFrame**) stack);
|
return XPCJSStackFrame::CreateStack(cx, fp, (XPCJSStackFrame**) stack);
|
||||||
}
|
}
|
||||||
@ -112,8 +112,7 @@ XPCJSStack::CreateStackFrameLocation(PRUint32 aLanguage,
|
|||||||
/**********************************************/
|
/**********************************************/
|
||||||
|
|
||||||
XPCJSStackFrame::XPCJSStackFrame()
|
XPCJSStackFrame::XPCJSStackFrame()
|
||||||
: mCaller(nsnull),
|
: mFilename(nsnull),
|
||||||
mFilename(nsnull),
|
|
||||||
mFunname(nsnull),
|
mFunname(nsnull),
|
||||||
mLineno(0),
|
mLineno(0),
|
||||||
mLanguage(nsIProgrammingLanguage::UNKNOWN)
|
mLanguage(nsIProgrammingLanguage::UNKNOWN)
|
||||||
@ -126,7 +125,6 @@ XPCJSStackFrame::~XPCJSStackFrame()
|
|||||||
nsMemory::Free(mFilename);
|
nsMemory::Free(mFilename);
|
||||||
if(mFunname)
|
if(mFunname)
|
||||||
nsMemory::Free(mFunname);
|
nsMemory::Free(mFunname);
|
||||||
NS_IF_RELEASE(mCaller);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMPL_THREADSAFE_ISUPPORTS1(XPCJSStackFrame, nsIStackFrame)
|
NS_IMPL_THREADSAFE_ISUPPORTS1(XPCJSStackFrame, nsIStackFrame)
|
||||||
@ -135,78 +133,70 @@ nsresult
|
|||||||
XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
|
XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
|
||||||
XPCJSStackFrame** stack)
|
XPCJSStackFrame** stack)
|
||||||
{
|
{
|
||||||
XPCJSStackFrame* self = new XPCJSStackFrame();
|
nsRefPtr<XPCJSStackFrame> first = new XPCJSStackFrame();
|
||||||
JSBool failed = JS_FALSE;
|
nsRefPtr<XPCJSStackFrame> self = first;
|
||||||
if(self)
|
while(fp && self)
|
||||||
{
|
{
|
||||||
NS_ADDREF(self);
|
if(!JS_IsScriptFrame(cx, fp))
|
||||||
|
|
||||||
JSStackFrame *tmp = fp;
|
|
||||||
if(JSStackFrame *prev = JS_FrameIterator(cx, &tmp))
|
|
||||||
{
|
{
|
||||||
if(NS_FAILED(CreateStack(cx, prev,
|
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
|
||||||
(XPCJSStackFrame**) &self->mCaller)))
|
|
||||||
failed = JS_TRUE;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if(!failed)
|
|
||||||
{
|
{
|
||||||
if (!JS_IsScriptFrame(cx, fp))
|
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
|
||||||
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
|
JSScript* script = JS_GetFrameScript(cx, fp);
|
||||||
else
|
jsbytecode* pc = JS_GetFramePC(cx, fp);
|
||||||
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
|
if(script && pc)
|
||||||
if(self->IsJSFrame())
|
|
||||||
{
|
{
|
||||||
JSScript* script = JS_GetFrameScript(cx, fp);
|
JS::AutoEnterScriptCompartment ac;
|
||||||
jsbytecode* pc = JS_GetFramePC(cx, fp);
|
if(ac.enter(cx, script))
|
||||||
if(script && pc)
|
|
||||||
{
|
{
|
||||||
JS::AutoEnterScriptCompartment ac;
|
const char* filename = JS_GetScriptFilename(cx, script);
|
||||||
if(ac.enter(cx, script))
|
if(filename)
|
||||||
{
|
{
|
||||||
const char* filename = JS_GetScriptFilename(cx, script);
|
self->mFilename = (char*)
|
||||||
if(filename)
|
nsMemory::Clone(filename,
|
||||||
{
|
|
||||||
self->mFilename = (char*)
|
|
||||||
nsMemory::Clone(filename,
|
|
||||||
sizeof(char)*(strlen(filename)+1));
|
sizeof(char)*(strlen(filename)+1));
|
||||||
}
|
}
|
||||||
|
|
||||||
self->mLineno = (PRInt32) JS_PCToLineNumber(cx, script, pc);
|
self->mLineno = (PRInt32) JS_PCToLineNumber(cx, script, pc);
|
||||||
|
|
||||||
|
JSFunction* fun = JS_GetFrameFunction(cx, fp);
|
||||||
JSFunction* fun = JS_GetFrameFunction(cx, fp);
|
if(fun)
|
||||||
if(fun)
|
{
|
||||||
|
JSString *funid = JS_GetFunctionId(fun);
|
||||||
|
if(funid)
|
||||||
{
|
{
|
||||||
JSString *funid = JS_GetFunctionId(fun);
|
size_t length = JS_GetStringEncodingLength(cx, funid);
|
||||||
if(funid)
|
if(length != size_t(-1))
|
||||||
{
|
{
|
||||||
size_t length = JS_GetStringEncodingLength(cx, funid);
|
self->mFunname = static_cast<char *>(nsMemory::Alloc(length + 1));
|
||||||
if(length != size_t(-1))
|
if(self->mFunname)
|
||||||
{
|
{
|
||||||
self->mFunname = static_cast<char *>(nsMemory::Alloc(length + 1));
|
JS_EncodeStringToBuffer(funid, self->mFunname, length);
|
||||||
if(self->mFunname)
|
self->mFunname[length] = '\0';
|
||||||
{
|
|
||||||
JS_EncodeStringToBuffer(funid, self->mFunname, length);
|
|
||||||
self->mFunname[length] = '\0';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
|
{
|
||||||
}
|
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(failed)
|
|
||||||
NS_RELEASE(self);
|
if(JS_FrameIterator(cx, &fp))
|
||||||
|
{
|
||||||
|
XPCJSStackFrame* frame = new XPCJSStackFrame();
|
||||||
|
self->mCaller = frame;
|
||||||
|
self = frame;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*stack = self;
|
*stack = first.forget().get();
|
||||||
return self ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -251,7 +241,6 @@ XPCJSStackFrame::CreateStackFrameLocation(PRUint32 aLanguage,
|
|||||||
|
|
||||||
if(!failed && aCaller)
|
if(!failed && aCaller)
|
||||||
{
|
{
|
||||||
NS_ADDREF(aCaller);
|
|
||||||
self->mCaller = aCaller;
|
self->mCaller = aCaller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,9 +290,6 @@ NS_IMETHODIMP XPCJSStackFrame::GetName(char * *aFunction)
|
|||||||
/* readonly attribute PRInt32 lineNumber; */
|
/* readonly attribute PRInt32 lineNumber; */
|
||||||
NS_IMETHODIMP XPCJSStackFrame::GetLineNumber(PRInt32 *aLineNumber)
|
NS_IMETHODIMP XPCJSStackFrame::GetLineNumber(PRInt32 *aLineNumber)
|
||||||
{
|
{
|
||||||
if(!aLineNumber)
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
*aLineNumber = mLineno;
|
*aLineNumber = mLineno;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@ -311,8 +297,6 @@ NS_IMETHODIMP XPCJSStackFrame::GetLineNumber(PRInt32 *aLineNumber)
|
|||||||
/* readonly attribute string sourceLine; */
|
/* readonly attribute string sourceLine; */
|
||||||
NS_IMETHODIMP XPCJSStackFrame::GetSourceLine(char * *aSourceLine)
|
NS_IMETHODIMP XPCJSStackFrame::GetSourceLine(char * *aSourceLine)
|
||||||
{
|
{
|
||||||
if(!aSourceLine)
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
*aSourceLine = nsnull;
|
*aSourceLine = nsnull;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@ -320,21 +304,13 @@ NS_IMETHODIMP XPCJSStackFrame::GetSourceLine(char * *aSourceLine)
|
|||||||
/* readonly attribute nsIStackFrame caller; */
|
/* readonly attribute nsIStackFrame caller; */
|
||||||
NS_IMETHODIMP XPCJSStackFrame::GetCaller(nsIStackFrame * *aCaller)
|
NS_IMETHODIMP XPCJSStackFrame::GetCaller(nsIStackFrame * *aCaller)
|
||||||
{
|
{
|
||||||
if(!aCaller)
|
NS_IF_ADDREF(*aCaller = mCaller);
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
if(mCaller)
|
|
||||||
NS_ADDREF(mCaller);
|
|
||||||
*aCaller = mCaller;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* string toString (); */
|
/* string toString (); */
|
||||||
NS_IMETHODIMP XPCJSStackFrame::ToString(char **_retval)
|
NS_IMETHODIMP XPCJSStackFrame::ToString(char **_retval)
|
||||||
{
|
{
|
||||||
if(!_retval)
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
const char* frametype = IsJSFrame() ? "JS" : "native";
|
const char* frametype = IsJSFrame() ? "JS" : "native";
|
||||||
const char* filename = mFilename ? mFilename : "<unknown filename>";
|
const char* filename = mFilename ? mFilename : "<unknown filename>";
|
||||||
const char* funname = mFunname ? mFunname : "<TOP_LEVEL>";
|
const char* funname = mFunname ? mFunname : "<TOP_LEVEL>";
|
||||||
|
Loading…
Reference in New Issue
Block a user