8
8
#include "Python.h"
9
9
#include "pycore_code.h" // _PyCode_HAS_EXECUTORS()
10
10
#include "pycore_crossinterp.h" // _PyXIData_t
11
+ #include "pycore_pyerrors.h" // _PyErr_GetRaisedException()
12
+ #include "pycore_function.h" // _PyFunction_VerifyStateless()
11
13
#include "pycore_interp.h" // _PyInterpreterState_IDIncref()
12
14
#include "pycore_modsupport.h" // _PyArg_BadArgument()
13
15
#include "pycore_namespace.h" // _PyNamespace_New()
@@ -374,34 +376,17 @@ check_code_str(PyUnicodeObject *text)
374
376
return NULL ;
375
377
}
376
378
377
- static const char *
378
- check_code_object (PyCodeObject * code )
379
+ #ifndef NDEBUG
380
+ static int
381
+ code_has_args (PyCodeObject * code )
379
382
{
380
383
assert (code != NULL );
381
- if (code -> co_argcount > 0
384
+ return (code -> co_argcount > 0
382
385
|| code -> co_posonlyargcount > 0
383
386
|| code -> co_kwonlyargcount > 0
384
- || code -> co_flags & (CO_VARARGS |CO_VARKEYWORDS ))
385
- {
386
- return "arguments not supported" ;
387
- }
388
- if (code -> co_ncellvars > 0 ) {
389
- return "closures not supported" ;
390
- }
391
- // We trust that no code objects under co_consts have unbound cell vars.
392
-
393
- if (_PyCode_HAS_EXECUTORS (code )|| _PyCode_HAS_INSTRUMENTATION (code )) {
394
- return "only basic functions are supported" ;
395
- }
396
- if (code -> _co_monitoring != NULL ) {
397
- return "only basic functions are supported" ;
398
- }
399
- if (code -> co_extra != NULL ) {
400
- return "only basic functions are supported" ;
401
- }
402
-
403
- return NULL ;
387
+ || code -> co_flags & (CO_VARARGS |CO_VARKEYWORDS ));
404
388
}
389
+ #endif
405
390
406
391
#define RUN_TEXT 1
407
392
#define RUN_CODE 2
@@ -429,8 +414,10 @@ get_code_str(PyObject *arg, Py_ssize_t *len_p, PyObject **bytes_p, int *flags_p)
429
414
flags = RUN_TEXT ;
430
415
}
431
416
else {
432
- assert (PyCode_Check (arg )
433
- && (check_code_object ((PyCodeObject * )arg )== NULL ));
417
+ assert (PyCode_Check (arg ));
418
+ assert (_PyCode_VerifyStateless (
419
+ PyThreadState_Get (), (PyCodeObject * )arg ,NULL ,NULL ,NULL )== 0 );
420
+ assert (!code_has_args ((PyCodeObject * )arg ));
434
421
flags = RUN_CODE ;
435
422
436
423
// Serialize the code object.
@@ -949,7 +936,8 @@ Bind the given attributes in the interpreter's __main__ module.");
949
936
950
937
951
938
static PyUnicodeObject *
952
- convert_script_arg (PyObject * arg ,const char * fname ,const char * displayname ,
939
+ convert_script_arg (PyThreadState * tstate ,
940
+ PyObject * arg ,const char * fname ,const char * displayname ,
953
941
const char * expected )
954
942
{
955
943
PyUnicodeObject * str = NULL ;
@@ -968,60 +956,50 @@ convert_script_arg(PyObject *arg, const char *fname, const char *displayname,
968
956
const char * err = check_code_str (str );
969
957
if (err != NULL ) {
970
958
Py_DECREF (str );
971
- PyErr_Format ( PyExc_ValueError ,
972
- "%.200s(): bad script text (%s)" ,fname ,err );
959
+ _PyErr_Format ( tstate , PyExc_ValueError ,
960
+ "%.200s(): bad script text (%s)" ,fname ,err );
973
961
return NULL ;
974
962
}
975
963
976
964
return str ;
977
965
}
978
966
979
967
static PyCodeObject *
980
- convert_code_arg (PyObject * arg ,const char * fname ,const char * displayname ,
968
+ convert_code_arg (PyThreadState * tstate ,
969
+ PyObject * arg ,const char * fname ,const char * displayname ,
981
970
const char * expected )
982
971
{
983
- const char * kind = NULL ;
972
+ PyObject * cause ;
984
973
PyCodeObject * code = NULL ;
985
974
if (PyFunction_Check (arg )) {
986
- if (PyFunction_GetClosure (arg )!= NULL ) {
987
- PyErr_Format (PyExc_ValueError ,
988
- "%.200s(): closures not supported" ,fname );
989
- return NULL ;
975
+ if (_PyFunction_VerifyStateless (tstate ,arg )< 0 ) {
976
+ gotochained ;
990
977
}
991
978
code = (PyCodeObject * )PyFunction_GetCode (arg );
992
- if (code == NULL ) {
993
- if (PyErr_Occurred ()) {
994
- // This chains.
995
- PyErr_Format (PyExc_ValueError ,
996
- "%.200s(): bad func" ,fname );
997
- }
998
- else {
999
- PyErr_Format (PyExc_ValueError ,
1000
- "%.200s(): func.__code__ missing" ,fname );
1001
- }
1002
- return NULL ;
1003
- }
1004
979
Py_INCREF (code );
1005
- kind = "func" ;
1006
980
}
1007
981
else if (PyCode_Check (arg )) {
982
+ if (_PyCode_VerifyStateless (
983
+ tstate , (PyCodeObject * )arg ,NULL ,NULL ,NULL )< 0 ) {
984
+ gotochained ;
985
+ }
1008
986
code = (PyCodeObject * )Py_NewRef (arg );
1009
- kind = "code object" ;
1010
987
}
1011
988
else {
1012
989
_PyArg_BadArgument (fname ,displayname ,expected ,arg );
1013
990
return NULL ;
1014
991
}
1015
992
1016
- const char * err = check_code_object (code );
1017
- if (err != NULL ) {
1018
- Py_DECREF (code );
1019
- PyErr_Format (PyExc_ValueError ,
1020
- "%.200s(): bad %s (%s)" ,fname ,kind ,err );
1021
- return NULL ;
1022
- }
1023
-
1024
993
return code ;
994
+
995
+ chained :
996
+ cause = _PyErr_GetRaisedException (tstate );
997
+ assert (cause != NULL );
998
+ _PyArg_BadArgument (fname ,displayname ,expected ,arg );
999
+ PyObject * exc = _PyErr_GetRaisedException (tstate );
1000
+ PyException_SetCause (exc ,cause );
1001
+ _PyErr_SetRaisedException (tstate ,exc );
1002
+ return NULL ;
1025
1003
}
1026
1004
1027
1005
static int
@@ -1057,12 +1035,14 @@ _interp_exec(PyObject *self, PyInterpreterState *interp,
1057
1035
static PyObject *
1058
1036
interp_exec (PyObject * self ,PyObject * args ,PyObject * kwds )
1059
1037
{
1038
+ #define FUNCNAME MODULE_NAME_STR ".exec"
1039
+ PyThreadState * tstate = _PyThreadState_GET ();
1060
1040
static char * kwlist []= {"id" ,"code" ,"shared" ,"restrict" ,NULL };
1061
1041
PyObject * id ,* code ;
1062
1042
PyObject * shared = NULL ;
1063
1043
int restricted = 0 ;
1064
1044
if (!PyArg_ParseTupleAndKeywords (args ,kwds ,
1065
- "OO|O$p:" MODULE_NAME_STR ".exec" ,kwlist ,
1045
+ "OO|O$p:" FUNCNAME ,kwlist ,
1066
1046
& id ,& code ,& shared ,& restricted ))
1067
1047
{
1068
1048
return NULL ;
@@ -1077,12 +1057,12 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds)
1077
1057
1078
1058
const char * expected = "a string, a function, or a code object" ;
1079
1059
if (PyUnicode_Check (code )) {
1080
- code = (PyObject * )convert_script_arg (code ,MODULE_NAME_STR ".exec" ,
1081
- "argument 2" ,expected );
1060
+ code = (PyObject * )convert_script_arg (tstate , code ,FUNCNAME ,
1061
+ "argument 2" ,expected );
1082
1062
}
1083
1063
else {
1084
- code = (PyObject * )convert_code_arg (code ,MODULE_NAME_STR ".exec" ,
1085
- "argument 2" ,expected );
1064
+ code = (PyObject * )convert_code_arg (tstate , code ,FUNCNAME ,
1065
+ "argument 2" ,expected );
1086
1066
}
1087
1067
if (code == NULL ) {
1088
1068
return NULL ;
@@ -1096,6 +1076,7 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds)
1096
1076
return excinfo ;
1097
1077
}
1098
1078
Py_RETURN_NONE ;
1079
+ #undef FUNCNAME
1099
1080
}
1100
1081
1101
1082
PyDoc_STRVAR (exec_doc ,
@@ -1118,13 +1099,15 @@ is ignored, including its __globals__ dict.");
1118
1099
static PyObject *
1119
1100
interp_run_string (PyObject * self ,PyObject * args ,PyObject * kwds )
1120
1101
{
1102
+ #define FUNCNAME MODULE_NAME_STR ".run_string"
1103
+ PyThreadState * tstate = _PyThreadState_GET ();
1121
1104
static char * kwlist []= {"id" ,"script" ,"shared" ,"restrict" ,NULL };
1122
1105
PyObject * id ,* script ;
1123
1106
PyObject * shared = NULL ;
1124
1107
int restricted = 0 ;
1125
1108
if (!PyArg_ParseTupleAndKeywords (args ,kwds ,
1126
- "OU|O$p:" MODULE_NAME_STR ".run_string" ,
1127
- kwlist , & id ,& script ,& shared ,& restricted ))
1109
+ "OU|O$p:" FUNCNAME , kwlist ,
1110
+ & id ,& script ,& shared ,& restricted ))
1128
1111
{
1129
1112
return NULL ;
1130
1113
}
@@ -1136,7 +1119,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds)
1136
1119
return NULL ;
1137
1120
}
1138
1121
1139
- script = (PyObject * )convert_script_arg (script ,MODULE_NAME_STR ".run_string" ,
1122
+ script = (PyObject * )convert_script_arg (tstate , script ,FUNCNAME ,
1140
1123
"argument 2" ,"a string" );
1141
1124
if (script == NULL ) {
1142
1125
return NULL ;
@@ -1150,6 +1133,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds)
1150
1133
return excinfo ;
1151
1134
}
1152
1135
Py_RETURN_NONE ;
1136
+ #undef FUNCNAME
1153
1137
}
1154
1138
1155
1139
PyDoc_STRVAR (run_string_doc ,
@@ -1162,13 +1146,15 @@ Execute the provided string in the identified interpreter.\n\
1162
1146
static PyObject *
1163
1147
interp_run_func (PyObject * self ,PyObject * args ,PyObject * kwds )
1164
1148
{
1149
+ #define FUNCNAME MODULE_NAME_STR ".run_func"
1150
+ PyThreadState * tstate = _PyThreadState_GET ();
1165
1151
static char * kwlist []= {"id" ,"func" ,"shared" ,"restrict" ,NULL };
1166
1152
PyObject * id ,* func ;
1167
1153
PyObject * shared = NULL ;
1168
1154
int restricted = 0 ;
1169
1155
if (!PyArg_ParseTupleAndKeywords (args ,kwds ,
1170
- "OO|O$p:" MODULE_NAME_STR ".run_func" ,
1171
- kwlist , & id ,& func ,& shared ,& restricted ))
1156
+ "OO|O$p:" FUNCNAME , kwlist ,
1157
+ & id ,& func ,& shared ,& restricted ))
1172
1158
{
1173
1159
return NULL ;
1174
1160
}
@@ -1180,7 +1166,7 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds)
1180
1166
return NULL ;
1181
1167
}
1182
1168
1183
- PyCodeObject * code = convert_code_arg (func ,MODULE_NAME_STR ".exec" ,
1169
+ PyCodeObject * code = convert_code_arg (tstate , func ,FUNCNAME ,
1184
1170
"argument 2" ,
1185
1171
"a function or a code object" );
1186
1172
if (code == NULL ) {
@@ -1195,6 +1181,7 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds)
1195
1181
return excinfo ;
1196
1182
}
1197
1183
Py_RETURN_NONE ;
1184
+ #undef FUNCNAME
1198
1185
}
1199
1186
1200
1187
PyDoc_STRVAR (run_func_doc ,
@@ -1209,14 +1196,16 @@ are not supported. Methods and other callables are not supported either.\n\
1209
1196
static PyObject *
1210
1197
interp_call (PyObject * self ,PyObject * args ,PyObject * kwds )
1211
1198
{
1199
+ #define FUNCNAME MODULE_NAME_STR ".call"
1200
+ PyThreadState * tstate = _PyThreadState_GET ();
1212
1201
static char * kwlist []= {"id" ,"callable" ,"args" ,"kwargs" ,
1213
1202
"restrict" ,NULL };
1214
1203
PyObject * id ,* callable ;
1215
1204
PyObject * args_obj = NULL ;
1216
1205
PyObject * kwargs_obj = NULL ;
1217
1206
int restricted = 0 ;
1218
1207
if (!PyArg_ParseTupleAndKeywords (args ,kwds ,
1219
- "OO|OO$p:" MODULE_NAME_STR ".call" ,kwlist ,
1208
+ "OO|OO$p:" FUNCNAME ,kwlist ,
1220
1209
& id ,& callable ,& args_obj ,& kwargs_obj ,
1221
1210
& restricted ))
1222
1211
{
@@ -1231,15 +1220,15 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds)
1231
1220
}
1232
1221
1233
1222
if (args_obj != NULL ) {
1234
- PyErr_SetString ( PyExc_ValueError ,"got unexpected args" );
1223
+ _PyErr_SetString ( tstate , PyExc_ValueError ,"got unexpected args" );
1235
1224
return NULL ;
1236
1225
}
1237
1226
if (kwargs_obj != NULL ) {
1238
- PyErr_SetString ( PyExc_ValueError ,"got unexpected kwargs" );
1227
+ _PyErr_SetString ( tstate , PyExc_ValueError ,"got unexpected kwargs" );
1239
1228
return NULL ;
1240
1229
}
1241
1230
1242
- PyObject * code = (PyObject * )convert_code_arg (callable ,MODULE_NAME_STR ".call" ,
1231
+ PyObject * code = (PyObject * )convert_code_arg (tstate , callable ,FUNCNAME ,
1243
1232
"argument 2" ,"a function" );
1244
1233
if (code == NULL ) {
1245
1234
return NULL ;
@@ -1253,6 +1242,7 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds)
1253
1242
return excinfo ;
1254
1243
}
1255
1244
Py_RETURN_NONE ;
1245
+ #undef FUNCNAME
1256
1246
}
1257
1247
1258
1248
PyDoc_STRVAR (call_doc ,