Home | History | Annotate | Download | only in python2.7
      1 #ifndef Py_CEVAL_H
      2 #define Py_CEVAL_H
      3 #ifdef __cplusplus
      4 extern "C" {
      5 #endif
      6 
      7 
      8 /* Interface to random parts in ceval.c */
      9 
     10 PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords(
     11     PyObject *, PyObject *, PyObject *);
     12 
     13 /* Inline this */
     14 #define PyEval_CallObject(func,arg) \
     15     PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
     16 
     17 PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj,
     18                                            const char *format, ...);
     19 PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj,
     20                                          const char *methodname,
     21                                          const char *format, ...);
     22 
     23 PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *);
     24 PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
     25 
     26 struct _frame; /* Avoid including frameobject.h */
     27 
     28 PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
     29 PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
     30 PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
     31 PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
     32 PyAPI_FUNC(int) PyEval_GetRestricted(void);
     33 
     34 /* Look at the current frame's (if any) code's co_flags, and turn on
     35    the corresponding compiler flags in cf->cf_flags.  Return 1 if any
     36    flag was set, else return 0. */
     37 PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
     38 
     39 PyAPI_FUNC(int) Py_FlushLine(void);
     40 
     41 PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg);
     42 PyAPI_FUNC(int) Py_MakePendingCalls(void);
     43 
     44 /* Protection against deeply nested recursive calls */
     45 PyAPI_FUNC(void) Py_SetRecursionLimit(int);
     46 PyAPI_FUNC(int) Py_GetRecursionLimit(void);
     47 
     48 #define Py_EnterRecursiveCall(where)                                    \
     49             (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) &&  \
     50              _Py_CheckRecursiveCall(where))
     51 #define Py_LeaveRecursiveCall()                         \
     52             (--PyThreadState_GET()->recursion_depth)
     53 PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where);
     54 PyAPI_DATA(int) _Py_CheckRecursionLimit;
     55 #ifdef USE_STACKCHECK
     56 #  define _Py_MakeRecCheck(x)  (++(x) > --_Py_CheckRecursionLimit)
     57 #else
     58 #  define _Py_MakeRecCheck(x)  (++(x) > _Py_CheckRecursionLimit)
     59 #endif
     60 
     61 PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *);
     62 PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *);
     63 
     64 PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *);
     65 PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *);
     66 PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc);
     67 
     68 /* this used to be handled on a per-thread basis - now just two globals */
     69 PyAPI_DATA(volatile int) _Py_Ticker;
     70 PyAPI_DATA(int) _Py_CheckInterval;
     71 
     72 /* Interface for threads.
     73 
     74    A module that plans to do a blocking system call (or something else
     75    that lasts a long time and doesn't touch Python data) can allow other
     76    threads to run as follows:
     77 
     78     ...preparations here...
     79     Py_BEGIN_ALLOW_THREADS
     80     ...blocking system call here...
     81     Py_END_ALLOW_THREADS
     82     ...interpret result here...
     83 
     84    The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
     85    {}-surrounded block.
     86    To leave the block in the middle (e.g., with return), you must insert
     87    a line containing Py_BLOCK_THREADS before the return, e.g.
     88 
     89     if (...premature_exit...) {
     90         Py_BLOCK_THREADS
     91         PyErr_SetFromErrno(PyExc_IOError);
     92         return NULL;
     93     }
     94 
     95    An alternative is:
     96 
     97     Py_BLOCK_THREADS
     98     if (...premature_exit...) {
     99         PyErr_SetFromErrno(PyExc_IOError);
    100         return NULL;
    101     }
    102     Py_UNBLOCK_THREADS
    103 
    104    For convenience, that the value of 'errno' is restored across
    105    Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.
    106 
    107    WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
    108    Py_END_ALLOW_THREADS!!!
    109 
    110    The function PyEval_InitThreads() should be called only from
    111    initthread() in "threadmodule.c".
    112 
    113    Note that not yet all candidates have been converted to use this
    114    mechanism!
    115 */
    116 
    117 PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void);
    118 PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
    119 
    120 #ifdef WITH_THREAD
    121 
    122 PyAPI_FUNC(int)  PyEval_ThreadsInitialized(void);
    123 PyAPI_FUNC(void) PyEval_InitThreads(void);
    124 PyAPI_FUNC(void) PyEval_AcquireLock(void);
    125 PyAPI_FUNC(void) PyEval_ReleaseLock(void);
    126 PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate);
    127 PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
    128 PyAPI_FUNC(void) PyEval_ReInitThreads(void);
    129 
    130 #define Py_BEGIN_ALLOW_THREADS { \
    131                         PyThreadState *_save; \
    132                         _save = PyEval_SaveThread();
    133 #define Py_BLOCK_THREADS        PyEval_RestoreThread(_save);
    134 #define Py_UNBLOCK_THREADS      _save = PyEval_SaveThread();
    135 #define Py_END_ALLOW_THREADS    PyEval_RestoreThread(_save); \
    136                  }
    137 
    138 #else /* !WITH_THREAD */
    139 
    140 #define Py_BEGIN_ALLOW_THREADS {
    141 #define Py_BLOCK_THREADS
    142 #define Py_UNBLOCK_THREADS
    143 #define Py_END_ALLOW_THREADS }
    144 
    145 #endif /* !WITH_THREAD */
    146 
    147 PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
    148 
    149 
    150 #ifdef __cplusplus
    151 }
    152 #endif
    153 #endif /* !Py_CEVAL_H */
    154