@@ -139,6 +139,7 @@ static int maybe_call_line_trace(Py_tracefunc, PyObject *,
139
139
PyThreadState * , PyFrameObject * , int * , int * , int * );
140
140
141
141
static PyObject * cmp_outcome (int , PyObject * , PyObject * );
142
+ static PyObject * import_name (PyFrameObject * , PyObject * , PyObject * , PyObject * );
142
143
static PyObject * import_from (PyObject * , PyObject * );
143
144
static int import_all_from (PyObject * , PyObject * );
144
145
static void format_exc_check_arg (PyObject * , const char * , PyObject * );
@@ -2808,37 +2809,15 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
2808
2809
}
2809
2810
2810
2811
TARGET (IMPORT_NAME ) {
2811
- _Py_IDENTIFIER (__import__ );
2812
2812
PyObject * name = GETITEM (names , oparg );
2813
- PyObject * func = _PyDict_GetItemId (f -> f_builtins , & PyId___import__ );
2814
- PyObject * from , * level , * args , * res ;
2815
- if (func == NULL ) {
2816
- PyErr_SetString (PyExc_ImportError ,
2817
- "__import__ not found" );
2818
- goto error ;
2819
- }
2820
- Py_INCREF (func );
2821
- from = POP ();
2822
- level = TOP ();
2823
- args = PyTuple_Pack (5 ,
2824
- name ,
2825
- f -> f_globals ,
2826
- f -> f_locals == NULL ?
2827
- Py_None : f -> f_locals ,
2828
- from ,
2829
- level );
2830
- Py_DECREF (level );
2831
- Py_DECREF (from );
2832
- if (args == NULL ) {
2833
- Py_DECREF (func );
2834
- STACKADJ (-1 );
2835
- goto error ;
2836
- }
2813
+ PyObject * fromlist = POP ();
2814
+ PyObject * level = TOP ();
2815
+ PyObject * res ;
2837
2816
READ_TIMESTAMP (intr0 );
2838
- res = PyEval_CallObject (func , args );
2817
+ res = import_name (f , name , fromlist , level );
2818
+ Py_DECREF (level );
2819
+ Py_DECREF (fromlist );
2839
2820
READ_TIMESTAMP (intr1 );
2840
- Py_DECREF (args );
2841
- Py_DECREF (func );
2842
2821
SET_TOP (res );
2843
2822
if (res == NULL )
2844
2823
goto error ;
@@ -5158,6 +5137,50 @@ cmp_outcome(int op, PyObject *v, PyObject *w)
5158
5137
return v ;
5159
5138
}
5160
5139
5140
+ static PyObject *
5141
+ import_name (PyFrameObject * f , PyObject * name , PyObject * fromlist , PyObject * level )
5142
+ {
5143
+ _Py_IDENTIFIER (__import__ );
5144
+ PyObject * import_func , * args , * res ;
5145
+
5146
+ import_func = _PyDict_GetItemId (f -> f_builtins , & PyId___import__ );
5147
+ if (import_func == NULL ) {
5148
+ PyErr_SetString (PyExc_ImportError , "__import__ not found" );
5149
+ return NULL ;
5150
+ }
5151
+
5152
+ /* Fast path for not overloaded __import__. */
5153
+ if (import_func == PyThreadState_GET ()-> interp -> import_func ) {
5154
+ int ilevel = _PyLong_AsInt (level );
5155
+ if (ilevel == -1 && PyErr_Occurred ()) {
5156
+ return NULL ;
5157
+ }
5158
+ res = PyImport_ImportModuleLevelObject (
5159
+ name ,
5160
+ f -> f_globals ,
5161
+ f -> f_locals == NULL ? Py_None : f -> f_locals ,
5162
+ fromlist ,
5163
+ ilevel );
5164
+ return res ;
5165
+ }
5166
+
5167
+ Py_INCREF (import_func );
5168
+ args = PyTuple_Pack (5 ,
5169
+ name ,
5170
+ f -> f_globals ,
5171
+ f -> f_locals == NULL ? Py_None : f -> f_locals ,
5172
+ fromlist ,
5173
+ level );
5174
+ if (args == NULL ) {
5175
+ Py_DECREF (import_func );
5176
+ return NULL ;
5177
+ }
5178
+ res = PyEval_CallObject (import_func , args );
5179
+ Py_DECREF (args );
5180
+ Py_DECREF (import_func );
5181
+ return res ;
5182
+ }
5183
+
5161
5184
static PyObject *
5162
5185
import_from (PyObject * v , PyObject * name )
5163
5186
{
0 commit comments