Backed out changeset 2bdf648e7015

This commit is contained in:
David Anderson 2010-10-15 15:21:51 -07:00
parent c7c5f82ff4
commit 61f242f7aa
12 changed files with 172 additions and 16 deletions

View File

@ -1001,6 +1001,17 @@ interface jsdIScript : jsdIEphemeral
* The |pcmap| argument specifies which pc to source line map to use.
*/
boolean isLineExecutable (in unsigned long line, in unsigned long pcmap);
/**
* Get the first valid PC in the script. This will be either
* (a) the first bytecode in the script, or (b) the next bytecode
* in the script, iff the first bytecode is a JSOP_BEGIN.
*/
unsigned long getFirstValidPC ();
/**
* Return the last valid PC in the script (i.e., the PC just after
* the last bytecode).
*/
unsigned long getEndValidPC ();
/**
* Set a breakpoint at a PC in this script.
*/

View File

@ -478,6 +478,12 @@ jsd_GetScriptHook(JSDContext* jsdc, JSD_ScriptHookProc* hook, void** callerdata)
extern jsuword
jsd_GetClosestPC(JSDContext* jsdc, JSDScript* jsdscript, uintN line);
extern jsuword
jsd_GetFirstValidPC(JSDContext* jsdc, JSDScript* jsdscript);
extern jsuword
jsd_GetEndPC(JSDContext* jsdc, JSDScript* jsdscript);
extern uintN
jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc);

View File

@ -500,20 +500,22 @@ jsd_GetScriptLineExtent(JSDContext* jsdc, JSDScript *jsdscript)
jsuword
jsd_GetClosestPC(JSDContext* jsdc, JSDScript* jsdscript, uintN line)
{
#ifdef LIVEWIRE
if( jsdscript && jsdscript->lwscript )
{
uintN newline;
jsdlw_RawToProcessedLineNumber(jsdc, jsdscript, line, &newline);
if( line != newline )
line = newline;
}
#endif
return (jsuword) JS_LineNumberToPC(jsdc->dumbContext,
jsdscript->script, line );
}
jsuword
jsd_GetFirstValidPC(JSDContext* jsdc, JSDScript* jsdscript)
{
return (jsuword) JS_FirstValidPC(jsdc->dumbContext, jsdscript->script );
}
jsuword
jsd_GetEndPC(JSDContext* jsdc, JSDScript* jsdscript)
{
return (jsuword) JS_EndPC(jsdc->dumbContext, jsdscript->script );
}
uintN
jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc)
{

View File

@ -958,7 +958,9 @@ jsdScript::jsdScript (JSDContext *aCx, JSDScript *aScript) : mValid(PR_FALSE),
mBaseLineNumber(0),
mLineExtent(0),
mPPLineMap(0),
mFirstPC(0)
mFirstValidPC(0),
mFirstPC(0),
mEndPC(0)
{
DEBUG_CREATE ("jsdScript", gScriptCount);
@ -972,6 +974,8 @@ jsdScript::jsdScript (JSDContext *aCx, JSDScript *aScript) : mValid(PR_FALSE),
mBaseLineNumber = JSD_GetScriptBaseLineNumber(mCx, mScript);
mLineExtent = JSD_GetScriptLineExtent(mCx, mScript);
mFirstPC = JSD_GetClosestPC(mCx, mScript, 0);
mFirstValidPC = JSD_GetFirstValidPC(mCx, mScript);
mEndPC = JSD_GetEndPC(mCx, mScript);
JSD_UnlockScriptSubsystem(mCx);
mValid = PR_TRUE;
@ -1475,6 +1479,22 @@ jsdScript::IsLineExecutable(PRUint32 aLine, PRUint32 aPcmap, PRBool *_rval)
return NS_OK;
}
NS_IMETHODIMP
jsdScript::GetFirstValidPC(PRUint32 *_rval)
{
ASSERT_VALID_EPHEMERAL;
*_rval = PRUint32(mFirstValidPC - mFirstPC);
return NS_OK;
}
NS_IMETHODIMP
jsdScript::GetEndValidPC(PRUint32 *_rval)
{
ASSERT_VALID_EPHEMERAL;
*_rval = PRUint32(mEndPC - mFirstPC);
return NS_OK;
}
NS_IMETHODIMP
jsdScript::SetBreakpoint(PRUint32 aPC)
{

View File

@ -182,7 +182,9 @@ class jsdScript : public jsdIScript
PRUint32 mBaseLineNumber, mLineExtent;
PCMapEntry *mPPLineMap;
PRUint32 mPCMapSize;
jsuword mFirstPC;
jsuword mFirstPC; /* address of first PC in script */
jsuword mFirstValidPC; /* address of first valid bkpt PC */
jsuword mEndPC; /* address of end of script code */
};
PRUint32 jsdScript::LastTag = 0;

View File

@ -348,6 +348,22 @@ JSD_GetClosestPC(JSDContext* jsdc, JSDScript* jsdscript, uintN line)
return jsd_GetClosestPC(jsdc, jsdscript, line);
}
JSD_PUBLIC_API(jsuword)
JSD_GetFirstValidPC(JSDContext* jsdc, JSDScript* jsdscript)
{
JSD_ASSERT_VALID_CONTEXT(jsdc);
JSD_ASSERT_VALID_SCRIPT(jsdscript);
return jsd_GetFirstValidPC(jsdc, jsdscript);
}
JSD_PUBLIC_API(jsuword)
JSD_GetEndPC(JSDContext* jsdc, JSDScript* jsdscript)
{
JSD_ASSERT_VALID_CONTEXT(jsdc);
JSD_ASSERT_VALID_SCRIPT(jsdscript);
return jsd_GetEndPC(jsdc, jsdscript);
}
JSD_PUBLIC_API(uintN)
JSD_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc)
{

View File

@ -486,6 +486,19 @@ JSD_GetScriptHook(JSDContext* jsdc, JSD_ScriptHookProc* hook, void** callerdata)
extern JSD_PUBLIC_API(jsuword)
JSD_GetClosestPC(JSDContext* jsdc, JSDScript* jsdscript, uintN line);
/*
* Get the first 'Program Counter' value where a breakpoint can be set.
*/
extern JSD_PUBLIC_API(jsuword)
JSD_GetFirstValidPC(JSDContext* jsdc, JSDScript* jsdscript);
/*
* Get the 'Program Counter' value just after the last byte of the script.
* 0 is returned for invalid scripts.
*/
extern JSD_PUBLIC_API(jsuword)
JSD_GetEndPC(JSDContext* jsdc, JSDScript* jsdscript);
/*
* Get the source line number for a given 'Program Counter' location.
* Returns 0 if no source line information is appropriate (or available) for

View File

@ -48,6 +48,7 @@ MODULE = jsdebug
include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_bug507448.html \
test_bug602003.html \
$(NULL)
libs:: $(_TEST_FILES)

View File

@ -0,0 +1,62 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=507448
-->
<head>
<title>Test for Bug 602003</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=507448">Mozilla Bug 507448</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
/** Test for Bug 602003 **/
// This is somewhat unfortunate: jsd only deals with scripts that have a
// nonzero line number, so we can't just createElement a script here.
// So break the test up into three <script>s, of which the middle one has our test functions.
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var jsdIDebuggerService = Components.interfaces.jsdIDebuggerService;
var jsd = Components.classes['@mozilla.org/js/jsd/debugger-service;1']
.getService(jsdIDebuggerService);
var jsdOn = jsd.isOn;
if (!jsdOn) {
jsd.on();
ok(jsd.isOn, "JSD should be running.");
}
</script>
<script>
function g(a,b) { return a + b }
</script>
<script>
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var script = jsd.wrapValue(g).script;
// Test the script start/end PC APIs.
var start = script.getFirstValidPC();
var end = script.getEndValidPC();
// Start PC should be 1 for a function because it starts with JSOP_BEGIN.
is(start, 1, "Start PC should be 1");
// End PC should be something greater than 1, and not huge. Changes
// in the bytecode will change this, so we'll just be approximate.
ok(1 < end && end < 100, "End PC doesn't seem sane.");
if (!jsdOn) {
jsd.off();
ok(!jsd.isOn, "JSD shouldn't be running anymore.");
}
</script>
</pre>
</body>
</html>

View File

@ -475,7 +475,9 @@ AllFramesIter::operator++()
{
JS_ASSERT(!done());
if (curfp == curcs->getInitialFrame()) {
curcs = curcs->getPreviousInMemory();
do {
curcs = curcs->getPreviousInMemory();
} while (curcs && !curcs->inContext());
curfp = curcs ? curcs->getCurrentFrame() : NULL;
} else {
curfp = curfp->prev();

View File

@ -235,9 +235,11 @@ JS_SetTrap(JSContext *cx, JSScript *script, jsbytecode *pc,
return JS_FALSE;
}
// Do not trap BEGIN, it's a special prologue opcode.
if (JSOp(*pc) == JSOP_BEGIN)
pc += JSOP_BEGIN_LENGTH;
if (JSOp(*pc) == JSOP_BEGIN) {
JS_ReportErrorFlagsAndNumber(cx, JSREPORT_ERROR, js_GetErrorMessage,
NULL, JSMSG_READ_ONLY, "trap invalid on BEGIN opcode");
return JS_FALSE;
}
JS_ASSERT((JSOp) *pc != JSOP_TRAP);
junk = NULL;
@ -1019,6 +1021,19 @@ JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno)
return js_LineNumberToPC(script, lineno);
}
JS_PUBLIC_API(jsbytecode *)
JS_FirstValidPC(JSContext *cx, JSScript *script)
{
jsbytecode *pc = script->code;
return *pc == JSOP_BEGIN ? pc + JSOP_BEGIN_LENGTH : pc;
}
JS_PUBLIC_API(jsbytecode *)
JS_EndPC(JSContext *cx, JSScript *script)
{
return script->code + script->length;
}
JS_PUBLIC_API(uintN)
JS_GetFunctionArgumentCount(JSContext *cx, JSFunction *fun)
{

View File

@ -159,6 +159,12 @@ JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc);
extern JS_PUBLIC_API(jsbytecode *)
JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno);
extern JS_PUBLIC_API(jsbytecode *)
JS_FirstValidPC(JSContext *cx, JSScript *script);
extern JS_PUBLIC_API(jsbytecode *)
JS_EndPC(JSContext *cx, JSScript *script);
extern JS_PUBLIC_API(uintN)
JS_GetFunctionArgumentCount(JSContext *cx, JSFunction *fun);