[Python-checkins] python/dist/src/Modules pyexpat.c,2.57,2.57.6.1

loewis@users.sourceforge.net loewis@users.sourceforge.net
2002年8月04日 01:26:51 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv22813
Modified Files:
 Tag: release22-maint
	pyexpat.c 
Log Message:
Add trace_frame. Fixes #534864.
Index: pyexpat.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/pyexpat.c,v
retrieving revision 2.57
retrieving revision 2.57.6.1
diff -C2 -d -r2.57 -r2.57.6.1
*** pyexpat.c	8 Dec 2001 18:02:57 -0000	2.57
--- pyexpat.c	4 Aug 2002 08:26:49 -0000	2.57.6.1
***************
*** 353,356 ****
--- 353,383 ----
 }
 
+ static int
+ trace_frame(PyThreadState *tstate, PyFrameObject *f, int code, PyObject *val)
+ {
+ int result = 0;
+ if (!tstate->use_tracing || tstate->tracing)
+ 	return 0;
+ if (tstate->c_profilefunc != NULL) {
+ 	tstate->tracing++;
+ 	result = tstate->c_profilefunc(tstate->c_profileobj,
+ 				 f, code , val);
+ 	tstate->use_tracing = ((tstate->c_tracefunc != NULL)
+ 			 || (tstate->c_profilefunc != NULL));
+ 	tstate->tracing--;
+ 	if (result)
+ 	 return result;
+ }
+ if (tstate->c_tracefunc != NULL) {
+ 	tstate->tracing++;
+ 	result = tstate->c_tracefunc(tstate->c_traceobj,
+ 				 f, code , val);
+ 	tstate->use_tracing = ((tstate->c_tracefunc != NULL)
+ 			 || (tstate->c_profilefunc != NULL));
+ 	tstate->tracing--;
+ }	
+ return result;
+ }
+ 
 static PyObject*
 call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
***************
*** 362,365 ****
--- 389,393 ----
 if (c == NULL)
 return NULL;
+ 
 f = PyFrame_New(
 tstate,			/*back*/
***************
*** 371,377 ****
--- 399,415 ----
 return NULL;
 tstate->frame = f;
+ if (trace_frame(tstate, f, PyTrace_CALL, Py_None)) {
+ 	Py_DECREF(f);
+ 	return NULL;
+ }
 res = PyEval_CallObject(func, args);
 if (res == NULL && tstate->curexc_traceback == NULL)
 PyTraceBack_Here(f);
+ else {
+ 	if (trace_frame(tstate, f, PyTrace_RETURN, res)) {
+ 	 Py_XDECREF(res);
+ 	 res = NULL;
+ 	}
+ }
 tstate->frame = f->f_back;
 Py_DECREF(f);

AltStyle によって変換されたページ (->オリジナル) /