changeset 146:b1cf9decc36f

Added 'lineno' and 'pc' attributes to stack frame information.
author Atul Varma <varmaa@toolness.com>
date Sat, 29 Aug 2009 13:16:43 -0700
parents 5d53f6293a81
children ebc0ff767290
files src/context.cpp tests/test_pymonkey.py
diffstat 2 files changed, 20 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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()', '<string>', 1)
-        self.assertEqual(stack_holder[0]['caller']['script'].filename,
-                         '<string>')
+        script = stack_holder[0]['caller']['script']
+        pc = stack_holder[0]['caller']['pc']
+        self.assertEqual(script.filename, '<string>')
+        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()