@@ -2237,7 +2237,7 @@ dict_get_version(PyObject *self, PyObject *args)
2237
2237
return NULL ;
2238
2238
2239
2239
_Py_COMP_DIAG_PUSH
2240
- _Py_COMP_DIAG_IGNORE_DEPR_DECLS
2240
+ _Py_COMP_DIAG_IGNORE_DEPR_DECLS
2241
2241
version = dict -> ma_version_tag ;
2242
2242
_Py_COMP_DIAG_POP
2243
2243
@@ -3064,6 +3064,144 @@ eval_get_func_desc(PyObject *self, PyObject *func)
3064
3064
return PyUnicode_FromString (PyEval_GetFuncDesc (func ));
3065
3065
}
3066
3066
3067
+ static PyObject *
3068
+ eval_eval_code_ex (PyObject * mod , PyObject * pos_args )
3069
+ {
3070
+ PyObject * result = NULL ;
3071
+ PyObject * code ;
3072
+ PyObject * globals ;
3073
+ PyObject * locals = NULL ;
3074
+ PyObject * args = NULL ;
3075
+ PyObject * kwargs = NULL ;
3076
+ PyObject * defaults = NULL ;
3077
+ PyObject * kw_defaults = NULL ;
3078
+ PyObject * closure = NULL ;
3079
+
3080
+ PyObject * * c_kwargs = NULL ;
3081
+
3082
+ if (!PyArg_UnpackTuple (pos_args ,
3083
+ "eval_code_ex" ,
3084
+ 2 ,
3085
+ 8 ,
3086
+ & code ,
3087
+ & globals ,
3088
+ & locals ,
3089
+ & args ,
3090
+ & kwargs ,
3091
+ & defaults ,
3092
+ & kw_defaults ,
3093
+ & closure ))
3094
+ {
3095
+ goto exit ;
3096
+ }
3097
+
3098
+ if (!PyCode_Check (code )) {
3099
+ PyErr_SetString (PyExc_TypeError ,
3100
+ "code must be a Python code object" );
3101
+ goto exit ;
3102
+ }
3103
+
3104
+ if (!PyDict_Check (globals )) {
3105
+ PyErr_SetString (PyExc_TypeError , "globals must be a dict" );
3106
+ goto exit ;
3107
+ }
3108
+
3109
+ if (locals && !PyMapping_Check (locals )) {
3110
+ PyErr_SetString (PyExc_TypeError , "locals must be a mapping" );
3111
+ goto exit ;
3112
+ }
3113
+ if (locals == Py_None ) {
3114
+ locals = NULL ;
3115
+ }
3116
+
3117
+ PyObject * * c_args = NULL ;
3118
+ Py_ssize_t c_args_len = 0 ;
3119
+
3120
+ if (args )
3121
+ {
3122
+ if (!PyTuple_Check (args )) {
3123
+ PyErr_SetString (PyExc_TypeError , "args must be a tuple" );
3124
+ goto exit ;
3125
+ } else {
3126
+ c_args = & PyTuple_GET_ITEM (args , 0 );
3127
+ c_args_len = PyTuple_Size (args );
3128
+ }
3129
+ }
3130
+
3131
+ Py_ssize_t c_kwargs_len = 0 ;
3132
+
3133
+ if (kwargs )
3134
+ {
3135
+ if (!PyDict_Check (kwargs )) {
3136
+ PyErr_SetString (PyExc_TypeError , "keywords must be a dict" );
3137
+ goto exit ;
3138
+ } else {
3139
+ c_kwargs_len = PyDict_Size (kwargs );
3140
+ if (c_kwargs_len > 0 ) {
3141
+ c_kwargs = PyMem_NEW (PyObject * , 2 * c_kwargs_len );
3142
+ if (!c_kwargs ) {
3143
+ PyErr_NoMemory ();
3144
+ goto exit ;
3145
+ }
3146
+
3147
+ Py_ssize_t i = 0 ;
3148
+ Py_ssize_t pos = 0 ;
3149
+
3150
+ while (PyDict_Next (kwargs ,
3151
+ & pos ,
3152
+ & c_kwargs [i ],
3153
+ & c_kwargs [i + 1 ]))
3154
+ {
3155
+ i += 2 ;
3156
+ }
3157
+ c_kwargs_len = i / 2 ;
3158
+ /* XXX This is broken if the caller deletes dict items! */
3159
+ }
3160
+ }
3161
+ }
3162
+
3163
+
3164
+ PyObject * * c_defaults = NULL ;
3165
+ Py_ssize_t c_defaults_len = 0 ;
3166
+
3167
+ if (defaults && PyTuple_Check (defaults )) {
3168
+ c_defaults = & PyTuple_GET_ITEM (defaults , 0 );
3169
+ c_defaults_len = PyTuple_Size (defaults );
3170
+ }
3171
+
3172
+ if (kw_defaults && !PyDict_Check (kw_defaults )) {
3173
+ PyErr_SetString (PyExc_TypeError , "kw_defaults must be a dict" );
3174
+ goto exit ;
3175
+ }
3176
+
3177
+ if (closure && !PyTuple_Check (closure )) {
3178
+ PyErr_SetString (PyExc_TypeError , "closure must be a tuple of cells" );
3179
+ goto exit ;
3180
+ }
3181
+
3182
+
3183
+ result = PyEval_EvalCodeEx (
3184
+ code ,
3185
+ globals ,
3186
+ locals ,
3187
+ c_args ,
3188
+ c_args_len ,
3189
+ c_kwargs ,
3190
+ c_kwargs_len ,
3191
+ c_defaults ,
3192
+ c_defaults_len ,
3193
+ kw_defaults ,
3194
+ closure
3195
+ );
3196
+
3197
+ exit :
3198
+ if (c_kwargs ) {
3199
+ PyMem_DEL (c_kwargs );
3200
+ }
3201
+
3202
+ return result ;
3203
+ }
3204
+
3067
3205
static PyObject *
3068
3206
get_feature_macros (PyObject * self , PyObject * Py_UNUSED (args ))
3069
3207
{
@@ -3385,6 +3523,7 @@ static PyMethodDef TestMethods[] = {
3385
3523
{"set_exc_info" , test_set_exc_info , METH_VARARGS },
3386
3524
{"argparsing" , argparsing , METH_VARARGS },
3387
3525
{"code_newempty" , code_newempty , METH_VARARGS },
3526
+ {"eval_code_ex" , eval_eval_code_ex , METH_VARARGS },
3388
3527
{"make_exception_with_doc" , _PyCFunction_CAST (make_exception_with_doc ),
3389
3528
METH_VARARGS | METH_KEYWORDS },
3390
3529
{"make_memoryview_from_NULL_pointer" , make_memoryview_from_NULL_pointer ,
0 commit comments