Bug 538143 [@ XPCJSStackFrame::CreateStack] should not use recursion. r=mrbkap

--HG--
extra : rebase_source : 44c9c229412f0d846924c9adbed2dbda72cf890d
This commit is contained in:
timeless@mozdev.org 2010-01-06 05:32:00 +02:00
parent a2a2fc35ea
commit df9707b1ca

View File

@ -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,28 +133,17 @@ 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,
(XPCJSStackFrame**) &self->mCaller)))
failed = JS_TRUE;
}
if(!failed)
{
if (!JS_IsScriptFrame(cx, fp))
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS; self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
}
else else
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
if(self->IsJSFrame())
{ {
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
JSScript* script = JS_GetFrameScript(cx, fp); JSScript* script = JS_GetFrameScript(cx, fp);
jsbytecode* pc = JS_GetFramePC(cx, fp); jsbytecode* pc = JS_GetFramePC(cx, fp);
if(script && pc) if(script && pc)
@ -174,7 +161,6 @@ XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
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)
{ {
@ -200,13 +186,17 @@ XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS; self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
} }
} }
if(JS_FrameIterator(cx, &fp))
{
XPCJSStackFrame* frame = new XPCJSStackFrame();
self->mCaller = frame;
self = frame;
} }
if(failed)
NS_RELEASE(self);
} }
*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>";