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;}
private:
nsIStackFrame* mCaller;
nsCOMPtr<nsIStackFrame> mCaller;
char* mFilename;
char* mFunname;
@ -112,8 +112,7 @@ XPCJSStack::CreateStackFrameLocation(PRUint32 aLanguage,
/**********************************************/
XPCJSStackFrame::XPCJSStackFrame()
: mCaller(nsnull),
mFilename(nsnull),
: mFilename(nsnull),
mFunname(nsnull),
mLineno(0),
mLanguage(nsIProgrammingLanguage::UNKNOWN)
@ -126,7 +125,6 @@ XPCJSStackFrame::~XPCJSStackFrame()
nsMemory::Free(mFilename);
if(mFunname)
nsMemory::Free(mFunname);
NS_IF_RELEASE(mCaller);
}
NS_IMPL_THREADSAFE_ISUPPORTS1(XPCJSStackFrame, nsIStackFrame)
@ -135,28 +133,17 @@ nsresult
XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
XPCJSStackFrame** stack)
{
XPCJSStackFrame* self = new XPCJSStackFrame();
JSBool failed = JS_FALSE;
if(self)
{
NS_ADDREF(self);
JSStackFrame *tmp = fp;
if(JSStackFrame *prev = JS_FrameIterator(cx, &tmp))
{
if(NS_FAILED(CreateStack(cx, prev,
(XPCJSStackFrame**) &self->mCaller)))
failed = JS_TRUE;
}
if(!failed)
nsRefPtr<XPCJSStackFrame> first = new XPCJSStackFrame();
nsRefPtr<XPCJSStackFrame> self = first;
while(fp && self)
{
if(!JS_IsScriptFrame(cx, fp))
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
else
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
if(self->IsJSFrame())
{
self->mLanguage = nsIProgrammingLanguage::CPLUSPLUS;
}
else
{
self->mLanguage = nsIProgrammingLanguage::JAVASCRIPT;
JSScript* script = JS_GetFrameScript(cx, fp);
jsbytecode* pc = JS_GetFramePC(cx, fp);
if(script && pc)
@ -174,7 +161,6 @@ XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
self->mLineno = (PRInt32) JS_PCToLineNumber(cx, script, pc);
JSFunction* fun = JS_GetFrameFunction(cx, fp);
if(fun)
{
@ -200,13 +186,17 @@ XPCJSStackFrame::CreateStack(JSContext* cx, JSStackFrame* fp,
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;
return self ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
*stack = first.forget().get();
return NS_OK;
}
// static
@ -251,7 +241,6 @@ XPCJSStackFrame::CreateStackFrameLocation(PRUint32 aLanguage,
if(!failed && aCaller)
{
NS_ADDREF(aCaller);
self->mCaller = aCaller;
}
@ -301,9 +290,6 @@ NS_IMETHODIMP XPCJSStackFrame::GetName(char * *aFunction)
/* readonly attribute PRInt32 lineNumber; */
NS_IMETHODIMP XPCJSStackFrame::GetLineNumber(PRInt32 *aLineNumber)
{
if(!aLineNumber)
return NS_ERROR_NULL_POINTER;
*aLineNumber = mLineno;
return NS_OK;
}
@ -311,8 +297,6 @@ NS_IMETHODIMP XPCJSStackFrame::GetLineNumber(PRInt32 *aLineNumber)
/* readonly attribute string sourceLine; */
NS_IMETHODIMP XPCJSStackFrame::GetSourceLine(char * *aSourceLine)
{
if(!aSourceLine)
return NS_ERROR_NULL_POINTER;
*aSourceLine = nsnull;
return NS_OK;
}
@ -320,21 +304,13 @@ NS_IMETHODIMP XPCJSStackFrame::GetSourceLine(char * *aSourceLine)
/* readonly attribute nsIStackFrame caller; */
NS_IMETHODIMP XPCJSStackFrame::GetCaller(nsIStackFrame * *aCaller)
{
if(!aCaller)
return NS_ERROR_NULL_POINTER;
if(mCaller)
NS_ADDREF(mCaller);
*aCaller = mCaller;
NS_IF_ADDREF(*aCaller = mCaller);
return NS_OK;
}
/* string toString (); */
NS_IMETHODIMP XPCJSStackFrame::ToString(char **_retval)
{
if(!_retval)
return NS_ERROR_NULL_POINTER;
const char* frametype = IsJSFrame() ? "JS" : "native";
const char* filename = mFilename ? mFilename : "<unknown filename>";
const char* funname = mFunname ? mFunname : "<TOP_LEVEL>";