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); }
JSTrapStatus jsd_InterruptHandler(JSContext *cx, JSScript *script, jsbytecode *pc, jsval *rval, void *closure) { JSDScript* jsdscript; JSDContext* jsdc = (JSDContext*) closure; JSD_ExecutionHookProc hook; void* hookData; if( ! jsdc || ! jsdc->inited ) return JSTRAP_CONTINUE; if( JSD_IS_DANGEROUS_THREAD(jsdc) ) return JSTRAP_CONTINUE; /* local in case jsdc->interruptHook gets cleared on another thread */ JSD_LOCK(); hook = jsdc->interruptHook; hookData = jsdc->interruptHookData; JSD_UNLOCK(); if (!hook) return JSTRAP_CONTINUE; JSD_LOCK_SCRIPTS(jsdc); jsdscript = jsd_FindOrCreateJSDScript(jsdc, cx, script, JSNullFramePtr()); JSD_UNLOCK_SCRIPTS(jsdc); if( ! jsdscript ) return JSTRAP_CONTINUE; #ifdef LIVEWIRE if( ! jsdlw_UserCodeAtPC(jsdc, jsdscript, (uintptr_t)pc) ) return JSTRAP_CONTINUE; #endif return jsd_CallExecutionHook(jsdc, cx, JSD_HOOK_INTERRUPTED, hook, hookData, rval); }