JSTrapStatus jsd_TrapHandler(JSContext *cx, JSScript *script_, jsbytecode *pc, jsval *rval, jsval closure) { JS::RootedScript script(cx, script_); JSDExecHook* jsdhook = (JSDExecHook*) JSVAL_TO_PRIVATE(closure); JSD_ExecutionHookProc hook; void* hookData; JSDContext* jsdc; JSDScript* jsdscript; JSD_LOCK(); if( NULL == (jsdc = jsd_JSDContextForJSContext(cx)) || ! _isActiveHook(jsdc, script, jsdhook) ) { JSD_UNLOCK(); return JSTRAP_CONTINUE; } JSD_ASSERT_VALID_EXEC_HOOK(jsdhook); JS_ASSERT(!jsdhook->pc || jsdhook->pc == (uintptr_t)pc); JS_ASSERT(jsdhook->jsdscript->script == script); JS_ASSERT(jsdhook->jsdscript->jsdc == jsdc); hook = jsdhook->hook; hookData = jsdhook->callerdata; jsdscript = jsdhook->jsdscript; /* do not use jsdhook-> after this point */ JSD_UNLOCK(); if( ! jsdc || ! jsdc->inited ) return JSTRAP_CONTINUE; if( JSD_IS_DANGEROUS_THREAD(jsdc) ) return JSTRAP_CONTINUE; #ifdef LIVEWIRE if( ! jsdlw_UserCodeAtPC(jsdc, jsdscript, (uintptr_t)pc) ) return JSTRAP_CONTINUE; #endif return jsd_CallExecutionHook(jsdc, cx, JSD_HOOK_BREAKPOINT, hook, hookData, rval); }
JSD_JSDContextForJSContext(JSContext* context) { return jsd_JSDContextForJSContext(context); }
jsd_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) { JSDContextWrapper* wrapper; JSDContext* jsdc; uintN action = JSD_ERROR_REPORTER_PASS_ALONG; JSD_ErrorReporter errorReporter; void* errorReporterData; jsdc = jsd_JSDContextForJSContext(cx); if( ! jsdc ) { PR_ASSERT(0); return; } wrapper = _jsd_JSDContextWrapperForJSContext(jsdc, cx); if( ! wrapper ) { PR_ASSERT(0); return; } /* local in case hook gets cleared on another thread */ JSD_LOCK(); errorReporter = jsdc->errorReporter; errorReporterData = jsdc->errorReporterData; JSD_UNLOCK(); if( errorReporter && ! JSD_IS_DANGEROUS_THREAD(jsdc) ) action = errorReporter(jsdc, cx, message, report, errorReporterData); switch(action) { case JSD_ERROR_REPORTER_PASS_ALONG: if( wrapper->originalErrorReporter ) wrapper->originalErrorReporter(cx, message, report); break; case JSD_ERROR_REPORTER_RETURN: break; case JSD_ERROR_REPORTER_DEBUG: { JSDThreadState* jsdthreadstate; jsdthreadstate = jsd_NewThreadState(jsdc,cx); if( jsdthreadstate ) { JSD_ExecutionHookProc hook; void* hookData; /* local in case hook gets cleared on another thread */ JSD_LOCK(); hook = jsdc->debugBreakHook; hookData = jsdc->debugBreakHookData; JSD_UNLOCK(); if(hook) hook(jsdc, jsdthreadstate, JSD_HOOK_DEBUG_REQUESTED, hookData); jsd_DestroyThreadState(jsdc, jsdthreadstate); } break; } default: PR_ASSERT(0); break; } }