[Python-checkins] python/dist/src/Objects frameobject.c,2.66,2.67

mwh@users.sourceforge.net mwh@users.sourceforge.net
Wed, 11 Sep 2002 08:36:34 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv29209/Objects

Modified Files:
	frameobject.c 
Log Message:
A slight change to SET_LINENO-less tracing.

This makes things a touch more like 2.2.  Read the comments in 
Python/ceval.c for more details.


Index: frameobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v
retrieving revision 2.66
retrieving revision 2.67
diff -C2 -d -r2.66 -r2.67
*** frameobject.c	29 Aug 2002 20:25:46 -0000	2.66
--- frameobject.c	11 Sep 2002 15:36:32 -0000	2.67
***************
*** 18,22 ****
  	{"f_lasti",	T_INT,		OFF(f_lasti),	RO},
  	{"f_restricted",T_INT,		OFF(f_restricted),RO},
- 	{"f_trace",	T_OBJECT,	OFF(f_trace)},
  	{"f_exc_type",	T_OBJECT,	OFF(f_exc_type)},
  	{"f_exc_value",	T_OBJECT,	OFF(f_exc_value)},
--- 18,21 ----
***************
*** 38,49 ****
  	int lineno;
  
! 	lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
  
  	return PyInt_FromLong(lineno);
  }
  
  static PyGetSetDef frame_getsetlist[] = {
  	{"f_locals",	(getter)frame_getlocals, NULL, NULL},
  	{"f_lineno",	(getter)frame_getlineno, NULL, NULL},
  	{0}
  };
--- 37,83 ----
  	int lineno;
  
! 	if (f->f_trace)
! 		lineno = f->f_lineno;
! 	else
! 		lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
  
  	return PyInt_FromLong(lineno);
  }
  
+ static PyObject *
+ frame_gettrace(PyFrameObject *f, void *closure)
+ {
+ 	PyObject* trace = f->f_trace;
+ 
+ 	if (trace == NULL)
+ 		trace = Py_None;
+ 
+ 	Py_INCREF(trace);
+ 
+ 	return trace;
+ }
+ 
+ static int
+ frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
+ {
+ 	/* We rely on f_lineno being accurate when f_trace is set. */
+ 
+ 	PyObject* old_value = f->f_trace;
+ 
+ 	Py_XINCREF(v);
+ 	f->f_trace = v;
+ 	
+ 	if (v != NULL)
+ 		f->f_lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
+ 
+ 	Py_XDECREF(old_value);
+ 
+ 	return 0;
+ }
+ 
  static PyGetSetDef frame_getsetlist[] = {
  	{"f_locals",	(getter)frame_getlocals, NULL, NULL},
  	{"f_lineno",	(getter)frame_getlineno, NULL, NULL},
+ 	{"f_trace",	(getter)frame_gettrace, (setter)frame_settrace, NULL},
  	{0}
  };