unsigned jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, uintptr_t pc) { JSCompartment* oldCompartment; unsigned first = jsdscript->lineBase; unsigned last = first + jsd_GetScriptLineExtent(jsdc, jsdscript) - 1; unsigned line = 0; oldCompartment = JS_EnterCompartmentOfScript(jsdc->dumbContext, jsdscript->script); if (pc) line = JS_PCToLineNumber(jsdc->dumbContext, jsdscript->script, (jsbytecode*)pc); JS_LeaveCompartment(jsdc->dumbContext, oldCompartment); if( line < first ) return first; if( line > last ) return last; #ifdef LIVEWIRE if( jsdscript && jsdscript->lwscript ) { unsigned newline; jsdlw_ProcessedToRawLineNumber(jsdc, jsdscript, line, &newline); line = newline; } #endif return line; }
JSBool jsd_GetLinePCs(JSDContext* jsdc, JSDScript* jsdscript, unsigned startLine, unsigned maxLines, unsigned* count, unsigned** retLines, uintptr_t** retPCs) { JSCompartment* oldCompartment; unsigned first = jsdscript->lineBase; unsigned last = first + jsd_GetScriptLineExtent(jsdc, jsdscript) - 1; JSBool ok; jsbytecode **pcs; unsigned i; if (last < startLine) return JS_TRUE; oldCompartment = JS_EnterCompartmentOfScript(jsdc->dumbContext, jsdscript->script); ok = JS_GetLinePCs(jsdc->dumbContext, jsdscript->script, startLine, maxLines, count, retLines, &pcs); if (ok) { if (retPCs) { for (i = 0; i < *count; ++i) { (*retPCs)[i] = (*pcs)[i]; } } JS_free(jsdc->dumbContext, pcs); } JS_LeaveCompartment(jsdc->dumbContext, oldCompartment); return ok; }
static void _dumpJSDScript(JSDContext* jsdc, JSDScript* jsdscript, const char* leadingtext) { const char* name; JSString* fun; unsigned base; unsigned extent; char Buf[256]; size_t n; name = jsd_GetScriptFilename(jsdc, jsdscript); fun = jsd_GetScriptFunctionId(jsdc, jsdscript); base = jsd_GetScriptBaseLineNumber(jsdc, jsdscript); extent = jsd_GetScriptLineExtent(jsdc, jsdscript); n = size_t(snprintf(Buf, sizeof(Buf), "%sscript=%08X, %s, ", leadingtext, (unsigned) jsdscript->script, name ? name : "no URL")); if (n + 1 < sizeof(Buf)) { if (fun) { n += size_t(snprintf(Buf + n, sizeof(Buf) - n, "%s", "no fun")); } else { n += JS_PutEscapedFlatString(Buf + n, sizeof(Buf) - n, JS_ASSERT_STRING_IS_FLAT(fun), 0); Buf[sizeof(Buf) - 1] = '\0'; } if (n + 1 < sizeof(Buf)) snprintf(Buf + n, sizeof(Buf) - n, ", %d-%d\n", base, base + extent - 1); } OutputDebugString( Buf ); }
uintN jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc) { uintN first = jsdscript->lineBase; uintN last = first + jsd_GetScriptLineExtent(jsdc, jsdscript) - 1; uintN line = pc ? JS_PCToLineNumber(jsdc->dumbContext, jsdscript->script, (jsbytecode*)pc) : 0; if( line < first ) return first; if( line > last ) return last; #ifdef LIVEWIRE if( jsdscript && jsdscript->lwscript ) { uintN newline; jsdlw_ProcessedToRawLineNumber(jsdc, jsdscript, line, &newline); line = newline; } #endif return line; }
uintN jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc) { JSCrossCompartmentCall *call; uintN first = jsdscript->lineBase; uintN last = first + jsd_GetScriptLineExtent(jsdc, jsdscript) - 1; uintN line = 0; call = JS_EnterCrossCompartmentCallScript(jsdc->dumbContext, jsdscript->script); if(!call) return 0; if (pc) line = JS_PCToLineNumber(jsdc->dumbContext, jsdscript->script, (jsbytecode*)pc); JS_LeaveCrossCompartmentCall(call); if( line < first ) return first; if( line > last ) return last; #ifdef LIVEWIRE if( jsdscript && jsdscript->lwscript ) { uintN newline; jsdlw_ProcessedToRawLineNumber(jsdc, jsdscript, line, &newline); line = newline; } #endif return line; }
static void _dumpJSDScript(JSDContext* jsdc, JSDScript* jsdscript, const char* leadingtext) { const char* name; const char* fun; uintN base; uintN extent; char Buf[256]; name = jsd_GetScriptFilename(jsdc, jsdscript); fun = jsd_GetScriptFunctionName(jsdc, jsdscript); base = jsd_GetScriptBaseLineNumber(jsdc, jsdscript); extent = jsd_GetScriptLineExtent(jsdc, jsdscript); sprintf( Buf, "%sscript=%08X, %s, %s, %d-%d\n", leadingtext, (unsigned) jsdscript->script, name ? name : "no URL", fun ? fun : "no fun", base, base + extent - 1 ); OutputDebugString( Buf ); }
JSBool jsd_GetLinePCs(JSDContext* jsdc, JSDScript* jsdscript, uintN startLine, uintN maxLines, uintN* count, uintN** retLines, jsuword** retPCs) { JSCrossCompartmentCall *call; uintN first = jsdscript->lineBase; uintN last = first + jsd_GetScriptLineExtent(jsdc, jsdscript) - 1; JSBool ok; uintN *lines; jsbytecode **pcs; uintN i; if (last < startLine) return JS_TRUE; call = JS_EnterCrossCompartmentCallScript(jsdc->dumbContext, jsdscript->script); if (!call) return JS_FALSE; ok = JS_GetLinePCs(jsdc->dumbContext, jsdscript->script, startLine, maxLines, count, retLines, &pcs); if (ok) { if (retPCs) { for (i = 0; i < *count; ++i) { (*retPCs)[i] = (*pcs)[i]; } } JS_free(jsdc->dumbContext, pcs); } JS_LeaveCrossCompartmentCall(call); return ok; }
JSD_GetScriptLineExtent(JSDContext* jsdc, JSDScript *jsdscript) { JSD_ASSERT_VALID_CONTEXT(jsdc); JSD_ASSERT_VALID_SCRIPT(jsdscript); return jsd_GetScriptLineExtent(jsdc, jsdscript); }