void jsd_SetUserCallbacks(JSTaskState* jstaskstate, JSD_UserCallbacks* callbacks, void* user) { _jstaskstate = jstaskstate; _user = user; #ifdef JSD_HAS_DANGEROUS_THREAD _dangerousThread = JSD_CURRENT_THREAD(); #endif if( callbacks ) memcpy(&_callbacks, callbacks, sizeof(JSD_UserCallbacks)); else memset(&_callbacks, 0 , sizeof(JSD_UserCallbacks)); }
void jsd_DestroyThreadState(JSDContext* jsdc, JSDThreadState* jsdthreadstate) { JSDStackFrameInfo* jsdframe; JSCList* list; JS_ASSERT(jsdthreadstate); JS_ASSERT(JSD_CURRENT_THREAD() == jsdthreadstate->thread); JSD_LOCK_THREADSTATES(jsdc); JS_REMOVE_LINK(&jsdthreadstate->links); JSD_UNLOCK_THREADSTATES(jsdc); list = &jsdthreadstate->stack; while( (JSDStackFrameInfo*)list != (jsdframe = (JSDStackFrameInfo*)list->next) ) { JS_REMOVE_LINK(&jsdframe->links); _destroyFrame(jsdframe); } free(jsdthreadstate); }
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; }
JSDThreadState* jsd_NewThreadState(JSDContext* jsdc, JSContext *cx ) { JSDThreadState* jsdthreadstate; JSStackFrame * iter = NULL; JSStackFrame * fp; jsdthreadstate = (JSDThreadState*)calloc(1, sizeof(JSDThreadState)); if( ! jsdthreadstate ) return NULL; jsdthreadstate->context = cx; jsdthreadstate->thread = JSD_CURRENT_THREAD(); JS_INIT_CLIST(&jsdthreadstate->stack); jsdthreadstate->stackDepth = 0; JS_BeginRequest(jsdthreadstate->context); while( NULL != (fp = JS_FrameIterator(cx, &iter)) ) { JSScript* script = JS_GetFrameScript(cx, fp); jsuword pc = (jsuword) JS_GetFramePC(cx, fp); /* * don't construct a JSDStackFrame for dummy frames (those without a * |this| object, or native frames, if JSD_INCLUDE_NATIVE_FRAMES * isn't set. */ if (JS_GetFrameThis(cx, fp) && ((jsdc->flags & JSD_INCLUDE_NATIVE_FRAMES) || !JS_IsNativeFrame(cx, fp))) { JSDStackFrameInfo *frame; frame = _addNewFrame( jsdc, jsdthreadstate, script, pc, fp ); if ((jsdthreadstate->stackDepth == 0 && !frame) || (jsdthreadstate->stackDepth == 1 && frame && frame->jsdscript && !JSD_IS_DEBUG_ENABLED(jsdc, frame->jsdscript))) { /* * if we failed to create the first frame, or the top frame * is not enabled for debugging, fail the entire thread state. */ JS_INIT_CLIST(&jsdthreadstate->links); JS_EndRequest(jsdthreadstate->context); jsd_DestroyThreadState(jsdc, jsdthreadstate); return NULL; } } } JS_EndRequest(jsdthreadstate->context); if (jsdthreadstate->stackDepth == 0) { free(jsdthreadstate); return NULL; } JSD_LOCK_THREADSTATES(jsdc); JS_APPEND_LINK(&jsdthreadstate->links, &jsdc->threadsStates); JSD_UNLOCK_THREADSTATES(jsdc); return jsdthreadstate; }
JSD_CurrentThread() { return JSD_CURRENT_THREAD(); }