Boost logo

Boost-Commit :

From: ghost_at_[hidden]
Date: 2007-10-27 05:55:59


Author: vladimir_prus
Date: 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
New Revision: 40497
URL: http://svn.boost.org/trac/boost/changeset/40497

Log:
New Python rule -- 'backtrace'.

Text files modified:
   trunk/tools/jam/src/builtins.c | 26 ++++++++++++++++++++++++++
   trunk/tools/jam/src/compile.c | 3 +++
   trunk/tools/jam/src/frames.c | 1 -
   trunk/tools/jam/src/frames.h | 8 ++++++++
   trunk/tools/jam/src/jam.c | 5 +++++
   5 files changed, 42 insertions(+), 1 deletions(-)

Modified: trunk/tools/jam/src/builtins.c
==============================================================================
--- trunk/tools/jam/src/builtins.c (original)
+++ trunk/tools/jam/src/builtins.c 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
@@ -1775,6 +1775,32 @@
     return result;
 }
 
+PyObject*
+bjam_backtrace(PyObject* self, PyObject *args)
+{
+ PyObject *result = PyList_New(0);
+ struct frame *f = frame_before_python_call;
+
+ for(; f = f->prev;)
+ {
+ PyObject *tuple = PyTuple_New(4);
+ char* file;
+ int line;
+ char buf[32];
+ get_source_line( f->procedure, &file, &line );
+ sprintf( buf, "%d", line );
+
+ /* PyTuple_SetItem steals reference. */
+ PyTuple_SetItem(tuple, 0, PyString_FromString(file));
+ PyTuple_SetItem(tuple, 1, PyString_FromString(buf));
+ PyTuple_SetItem(tuple, 2, PyString_FromString(f->module->name));
+ PyTuple_SetItem(tuple, 3, PyString_FromString(f->rulename));
+
+ PyList_Append(result, tuple);
+ Py_DECREF(tuple);
+ }
+ return result;
+}
 
 #endif
 

Modified: trunk/tools/jam/src/compile.c
==============================================================================
--- trunk/tools/jam/src/compile.c (original)
+++ trunk/tools/jam/src/compile.c 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
@@ -94,6 +94,8 @@
 void print_source_line( PARSE* p );
 
 
+struct frame *frame_before_python_call;
+
 void frame_init( FRAME* frame )
 {
     frame->prev = 0;
@@ -827,6 +829,7 @@
         PyTuple_SetItem(arguments, i, arg);
     }
 
+ frame_before_python_call = frame;
     py_result = PyObject_CallObject(r->python_function, arguments);
     Py_DECREF(arguments);
     if (py_result != NULL) {

Modified: trunk/tools/jam/src/frames.c
==============================================================================
--- trunk/tools/jam/src/frames.c (original)
+++ trunk/tools/jam/src/frames.c 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
@@ -7,7 +7,6 @@
 # include "frames.h"
 # include "lists.h"
 
-
 void frame_init( FRAME* frame )
 {
     frame->prev = 0;

Modified: trunk/tools/jam/src/frames.h
==============================================================================
--- trunk/tools/jam/src/frames.h (original)
+++ trunk/tools/jam/src/frames.h 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
@@ -24,6 +24,14 @@
     char* rulename;
 };
 
+/* When call into Python is in progress, this
+ variable points to the bjam frame that
+ was current at the moment of call. When the call
+ completes, the variable is not defined. Further,
+ if Jam calls Python which calls Jam and so on,
+ this variable only keeps the most recent Jam frame. */
+extern struct frame *frame_before_python_call;
+
 void frame_init( FRAME* ); /* implemented in compile.c */
 void frame_free( FRAME* ); /* implemented in compile.c */
 

Modified: trunk/tools/jam/src/jam.c
==============================================================================
--- trunk/tools/jam/src/jam.c (original)
+++ trunk/tools/jam/src/jam.c 2007-10-27 05:55:58 EDT (Sat, 27 Oct 2007)
@@ -212,6 +212,9 @@
 
     extern PyObject*
     bjam_variable(PyObject* self, PyObject* args);
+
+ extern PyObject*
+ bjam_backtrace(PyObject* self, PyObject *args);
 #endif
 
 int main( int argc, char **argv, char **arg_environ )
@@ -349,6 +352,8 @@
                  "Defines a command line action."},
                 {"variable", bjam_variable, METH_VARARGS,
                  "Obtains a variable from bjam's global module."},
+ {"backtrace", bjam_backtrace, METH_VARARGS,
+ "Returns bjam backtrace from the last call into Python."},
                 {NULL, NULL, 0, NULL}
             };
     


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk