# HG changeset patch # User Atul Varma # Date 1251577003 25200 # Node ID b1cf9decc36f30d63ebf0e70ea19f4adc0562e4d # Parent 5d53f6293a81444b3510bbdede2f7e79305f2beb Added 'lineno' and 'pc' attributes to stack frame information. diff -r 5d53f6293a81 -r b1cf9decc36f src/context.cpp --- a/src/context.cpp Fri Aug 28 22:46:07 2009 -0700 +++ b/src/context.cpp Sat Aug 29 13:16:43 2009 -0700 @@ -41,6 +41,7 @@ #include "utils.h" #include "jsdbgapi.h" +#include "jsscript.h" // This is the default JSOperationCallback for pymonkey-owned JS contexts, // when they've defined one in Python. @@ -140,20 +141,29 @@ while ((frame = JS_FrameIterator(self->cx, &iteratorp)) != NULL) { bool success = true; JSScript *script = JS_GetFrameScript(self->cx, frame); + unsigned int pc = 0; + unsigned int lineno = 0; PyObject *pyScript; - if (script) + if (script) { pyScript = (PyObject *) PYM_newJSScript(self, script); - else { + if (pyScript == NULL) + return NULL; + jsbytecode *pcByte = JS_GetFramePC(self->cx, frame); + pc = pcByte - script->code; + lineno = JS_PCToLineNumber(self->cx, script, pcByte); + } else { pyScript = Py_None; Py_INCREF(pyScript); } PyObject *frameDict = Py_BuildValue( - "{sO}", - "script", pyScript + "{sOsIsI}", + "script", pyScript, + "pc", pc, + "lineno", lineno ); - Py_XDECREF(pyScript); + Py_DECREF(pyScript); if (frameDict) { if (last) { diff -r 5d53f6293a81 -r b1cf9decc36f tests/test_pymonkey.py --- a/tests/test_pymonkey.py Fri Aug 28 22:46:07 2009 -0700 +++ b/tests/test_pymonkey.py Sat Aug 29 13:16:43 2009 -0700 @@ -60,8 +60,11 @@ jsfunc = cx.new_function(func, func.__name__) cx.define_property(obj, func.__name__, jsfunc) cx.evaluate_script(obj, 'func()', '', 1) - self.assertEqual(stack_holder[0]['caller']['script'].filename, - '') + script = stack_holder[0]['caller']['script'] + pc = stack_holder[0]['caller']['pc'] + self.assertEqual(script.filename, '') + self.assertEqual(stack_holder[0]['caller']['lineno'], 1) + self.assertTrue(pc >= 0 and pc < len(buffer(script))) def testScriptHasFilenameMember(self): cx = pymonkey.Runtime().new_context()