Index: third_party/cython/src/Cython/Utility/Profile.c |
diff --git a/third_party/cython/src/Cython/Utility/Profile.c b/third_party/cython/src/Cython/Utility/Profile.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf219b3c2c8602ef7f2432843b005203cceb845f |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Utility/Profile.c |
@@ -0,0 +1,194 @@ |
+/////////////// Profile.proto /////////////// |
+//@substitute: naming |
+ |
+// Note that cPython ignores PyTrace_EXCEPTION, |
+// but maybe some other profilers don't. |
+ |
+#ifndef CYTHON_PROFILE |
+ #define CYTHON_PROFILE 1 |
+#endif |
+ |
+#ifndef CYTHON_TRACE |
+ #define CYTHON_TRACE 0 |
+#endif |
+ |
+#if CYTHON_TRACE |
+ #undef CYTHON_PROFILE_REUSE_FRAME |
+#endif |
+ |
+#ifndef CYTHON_PROFILE_REUSE_FRAME |
+ #define CYTHON_PROFILE_REUSE_FRAME 0 |
+#endif |
+ |
+#if CYTHON_PROFILE || CYTHON_TRACE |
+ |
+ #include "compile.h" |
+ #include "frameobject.h" |
+ #include "traceback.h" |
+ |
+ #if CYTHON_PROFILE_REUSE_FRAME |
+ #define CYTHON_FRAME_MODIFIER static |
+ #define CYTHON_FRAME_DEL |
+ #else |
+ #define CYTHON_FRAME_MODIFIER |
+ #define CYTHON_FRAME_DEL Py_CLEAR($frame_cname) |
+ #endif |
+ |
+ #define __Pyx_TraceDeclarations \ |
+ static PyCodeObject *$frame_code_cname = NULL; \ |
+ CYTHON_FRAME_MODIFIER PyFrameObject *$frame_cname = NULL; \ |
+ int __Pyx_use_tracing = 0; |
+ |
+ #define __Pyx_TraceCall(funcname, srcfile, firstlineno) \ |
+ if (unlikely(PyThreadState_GET()->use_tracing && \ |
+ (PyThreadState_GET()->c_profilefunc || (CYTHON_TRACE && PyThreadState_GET()->c_tracefunc)))) { \ |
+ __Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, funcname, srcfile, firstlineno); \ |
+ } |
+ |
+ #define __Pyx_TraceException() \ |
+ if (unlikely(__Pyx_use_tracing) && PyThreadState_GET()->use_tracing && \ |
+ (PyThreadState_GET()->c_profilefunc || (CYTHON_TRACE && PyThreadState_GET()->c_tracefunc))) { \ |
+ PyThreadState* tstate = PyThreadState_GET(); \ |
+ tstate->use_tracing = 0; \ |
+ PyObject *exc_info = __Pyx_GetExceptionTuple(); \ |
+ if (exc_info) { \ |
+ if (CYTHON_TRACE && tstate->c_tracefunc) \ |
+ tstate->c_tracefunc( \ |
+ tstate->c_traceobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \ |
+ tstate->c_profilefunc( \ |
+ tstate->c_profileobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \ |
+ Py_DECREF(exc_info); \ |
+ } \ |
+ tstate->use_tracing = 1; \ |
+ } |
+ |
+ #define __Pyx_TraceReturn(result) \ |
+ if (unlikely(__Pyx_use_tracing) && PyThreadState_GET()->use_tracing) { \ |
+ PyThreadState* tstate = PyThreadState_GET(); \ |
+ tstate->use_tracing = 0; \ |
+ if (CYTHON_TRACE && tstate->c_tracefunc) \ |
+ tstate->c_tracefunc( \ |
+ tstate->c_traceobj, $frame_cname, PyTrace_RETURN, (PyObject*)result); \ |
+ if (tstate->c_profilefunc) \ |
+ tstate->c_profilefunc( \ |
+ tstate->c_profileobj, $frame_cname, PyTrace_RETURN, (PyObject*)result); \ |
+ CYTHON_FRAME_DEL; \ |
+ tstate->use_tracing = 1; \ |
+ } |
+ |
+ static PyCodeObject *__Pyx_createFrameCodeObject(const char *funcname, const char *srcfile, int firstlineno); /*proto*/ |
+ static int __Pyx_TraceSetupAndCall(PyCodeObject** code, PyFrameObject** frame, const char *funcname, const char *srcfile, int firstlineno); /*proto*/ |
+ |
+#else |
+ |
+ #define __Pyx_TraceDeclarations |
+ #define __Pyx_TraceCall(funcname, srcfile, firstlineno) |
+ #define __Pyx_TraceException() |
+ #define __Pyx_TraceReturn(result) |
+ |
+#endif /* CYTHON_PROFILE */ |
+ |
+#if CYTHON_TRACE |
+ #define __Pyx_TraceLine(lineno) \ |
+ if (unlikely(__Pyx_use_tracing) && unlikely(PyThreadState_GET()->use_tracing && PyThreadState_GET()->c_tracefunc)) { \ |
+ PyThreadState* tstate = PyThreadState_GET(); \ |
+ $frame_cname->f_lineno = lineno; \ |
+ tstate->use_tracing = 0; \ |
+ tstate->c_tracefunc(tstate->c_traceobj, $frame_cname, PyTrace_LINE, NULL); \ |
+ tstate->use_tracing = 1; \ |
+ } |
+#else |
+ #define __Pyx_TraceLine(lineno) |
+#endif |
+ |
+/////////////// Profile /////////////// |
+//@substitute: naming |
+ |
+#if CYTHON_PROFILE |
+ |
+static int __Pyx_TraceSetupAndCall(PyCodeObject** code, |
+ PyFrameObject** frame, |
+ const char *funcname, |
+ const char *srcfile, |
+ int firstlineno) { |
+ int retval; |
+ PyThreadState* tstate = PyThreadState_GET(); |
+ if (*frame == NULL || !CYTHON_PROFILE_REUSE_FRAME) { |
+ if (*code == NULL) { |
+ *code = __Pyx_createFrameCodeObject(funcname, srcfile, firstlineno); |
+ if (*code == NULL) return 0; |
+ } |
+ *frame = PyFrame_New( |
+ tstate, /*PyThreadState *tstate*/ |
+ *code, /*PyCodeObject *code*/ |
+ $moddict_cname, /*PyObject *globals*/ |
+ 0 /*PyObject *locals*/ |
+ ); |
+ if (*frame == NULL) return 0; |
+ if (CYTHON_TRACE && (*frame)->f_trace == NULL) { |
+ // this enables "f_lineno" lookup, at least in CPython ... |
+ Py_INCREF(Py_None); |
+ (*frame)->f_trace = Py_None; |
+ } |
+#if PY_VERSION_HEX < 0x030400B1 |
+ } else { |
+ (*frame)->f_tstate = tstate; |
+#endif |
+ } |
+ (*frame)->f_lineno = firstlineno; |
+ tstate->use_tracing = 0; |
+ #if CYTHON_TRACE |
+ if (tstate->c_tracefunc) |
+ tstate->c_tracefunc(tstate->c_traceobj, *frame, PyTrace_CALL, NULL); |
+ if (!tstate->c_profilefunc) |
+ retval = 1; |
+ else |
+ #endif |
+ retval = tstate->c_profilefunc(tstate->c_profileobj, *frame, PyTrace_CALL, NULL) == 0; |
+ tstate->use_tracing = (tstate->c_profilefunc || |
+ (CYTHON_TRACE && tstate->c_tracefunc)); |
+ return tstate->use_tracing && retval; |
+} |
+ |
+static PyCodeObject *__Pyx_createFrameCodeObject(const char *funcname, const char *srcfile, int firstlineno) { |
+ PyObject *py_srcfile = 0; |
+ PyObject *py_funcname = 0; |
+ PyCodeObject *py_code = 0; |
+ |
+ #if PY_MAJOR_VERSION < 3 |
+ py_funcname = PyString_FromString(funcname); |
+ py_srcfile = PyString_FromString(srcfile); |
+ #else |
+ py_funcname = PyUnicode_FromString(funcname); |
+ py_srcfile = PyUnicode_FromString(srcfile); |
+ #endif |
+ if (!py_funcname | !py_srcfile) goto bad; |
+ |
+ py_code = PyCode_New( |
+ 0, /*int argcount,*/ |
+ #if PY_MAJOR_VERSION >= 3 |
+ 0, /*int kwonlyargcount,*/ |
+ #endif |
+ 0, /*int nlocals,*/ |
+ 0, /*int stacksize,*/ |
+ 0, /*int flags,*/ |
+ $empty_bytes, /*PyObject *code,*/ |
+ $empty_tuple, /*PyObject *consts,*/ |
+ $empty_tuple, /*PyObject *names,*/ |
+ $empty_tuple, /*PyObject *varnames,*/ |
+ $empty_tuple, /*PyObject *freevars,*/ |
+ $empty_tuple, /*PyObject *cellvars,*/ |
+ py_srcfile, /*PyObject *filename,*/ |
+ py_funcname, /*PyObject *name,*/ |
+ firstlineno, /*int firstlineno,*/ |
+ $empty_bytes /*PyObject *lnotab*/ |
+ ); |
+ |
+bad: |
+ Py_XDECREF(py_srcfile); |
+ Py_XDECREF(py_funcname); |
+ |
+ return py_code; |
+} |
+ |
+#endif /* CYTHON_PROFILE */ |