JSBool xpc_DumpEvalInJSStackFrame(JSContext* cx, JSUint32 frameno, const char* text) { JSStackFrame* fp; JSStackFrame* iter = nsnull; JSUint32 num = 0; if(!cx || !text) { puts("invalid params passed to xpc_DumpEvalInJSStackFrame!"); return JS_FALSE; } printf("js[%d]> %s\n", frameno, text); while(nsnull != (fp = JS_FrameIterator(cx, &iter))) { if(num == frameno) break; num++; } if(!fp) { puts("invalid frame number!"); return JS_FALSE; } JSAutoRequest ar(cx); JSExceptionState* exceptionState = JS_SaveExceptionState(cx); JSErrorReporter older = JS_SetErrorReporter(cx, xpcDumpEvalErrorReporter); jsval rval; JSString* str; JSAutoByteString bytes; if(JS_EvaluateInStackFrame(cx, fp, text, strlen(text), "eval", 1, &rval) && nsnull != (str = JS_ValueToString(cx, rval)) && bytes.encode(cx, str)) { printf("%s\n", bytes.ptr()); } else puts("eval failed!"); JS_SetErrorReporter(cx, older); JS_RestoreExceptionState(cx, exceptionState); return JS_TRUE; }
JSBool xpc_DumpEvalInJSStackFrame(JSContext* cx, uint32_t frameno, const char* text) { JSStackFrame* fp; JSStackFrame* iter = nullptr; uint32_t num = 0; if (!cx || !text) { DebugDump("%s", "invalid params passed to xpc_DumpEvalInJSStackFrame!\n"); return false; } DebugDump("js[%d]> %s\n", frameno, text); while (nullptr != (fp = JS_BrokenFrameIterator(cx, &iter))) { if (num == frameno) break; num++; } if (!fp) { DebugDump("%s", "invalid frame number!\n"); return false; } JSAutoRequest ar(cx); JSExceptionState* exceptionState = JS_SaveExceptionState(cx); JSErrorReporter older = JS_SetErrorReporter(cx, xpcDumpEvalErrorReporter); jsval rval; JSString* str; JSAutoByteString bytes; if (JS_EvaluateInStackFrame(cx, fp, text, strlen(text), "eval", 1, &rval) && nullptr != (str = JS_ValueToString(cx, rval)) && bytes.encode(cx, str)) { DebugDump("%s\n", bytes.ptr()); } else DebugDump("%s", "eval failed!\n"); JS_SetErrorReporter(cx, older); JS_RestoreExceptionState(cx, exceptionState); return true; }
JSBool jsd_EvaluateScriptInStackFrame(JSDContext* jsdc, JSDThreadState* jsdthreadstate, JSDStackFrameInfo* jsdframe, const char *bytes, uintN length, const char *filename, uintN lineno, JSBool eatExceptions, jsval *rval) { JSBool retval; JSBool valid; JSExceptionState* exceptionState = NULL; JSContext *cx; JS_ASSERT(JSD_CURRENT_THREAD() == jsdthreadstate->thread); JSD_LOCK_THREADSTATES(jsdc); valid = jsd_IsValidFrameInThreadState(jsdc, jsdthreadstate, jsdframe); JSD_UNLOCK_THREADSTATES(jsdc); if (!valid) return JS_FALSE; cx = jsdthreadstate->context; JS_ASSERT(cx); if (eatExceptions) exceptionState = JS_SaveExceptionState(cx); JS_ClearPendingException(cx); jsd_StartingEvalUsingFilename(jsdc, filename); retval = JS_EvaluateInStackFrame(cx, jsdframe->fp, bytes, length, filename, lineno, rval); jsd_FinishedEvalUsingFilename(jsdc, filename); if (eatExceptions) JS_RestoreExceptionState(cx, exceptionState); return retval; }