@@ -1589,12 +1589,67 @@ resolve_name(PyObject *name, PyObject *globals, int level)
1589
1589
return NULL ;
1590
1590
}
1591
1591
1592
+ static PyObject *
1593
+ import_find_and_load (PyObject * abs_name )
1594
+ {
1595
+ _Py_IDENTIFIER (_find_and_load );
1596
+ PyObject * mod = NULL ;
1597
+ PyInterpreterState * interp = PyThreadState_GET ()-> interp ;
1598
+ int import_time = interp -> core_config .import_time ;
1599
+ static int import_level ;
1600
+ static _PyTime_t accumulated ;
1601
+
1602
+ _PyTime_t t1 = 0 , accumulated_copy = accumulated ;
1603
+
1604
+ /* XOptions is initialized after first some imports.
1605
+ * So we can't have negative cache before completed initialization.
1606
+ * Anyway, importlib._find_and_load is much slower than
1607
+ * _PyDict_GetItemIdWithError().
1608
+ */
1609
+ if (import_time ) {
1610
+ static int header = 1 ;
1611
+ if (header ) {
1612
+ fputs ("import time: self [us] | cumulative | imported package\n" ,
1613
+ stderr );
1614
+ header = 0 ;
1615
+ }
1616
+
1617
+ import_level ++ ;
1618
+ t1 = _PyTime_GetPerfCounter ();
1619
+ accumulated = 0 ;
1620
+ }
1621
+
1622
+ if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED ())
1623
+ PyDTrace_IMPORT_FIND_LOAD_START (PyUnicode_AsUTF8 (abs_name ));
1624
+
1625
+ mod = _PyObject_CallMethodIdObjArgs (interp -> importlib ,
1626
+ & PyId__find_and_load , abs_name ,
1627
+ interp -> import_func , NULL );
1628
+
1629
+ if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED ())
1630
+ PyDTrace_IMPORT_FIND_LOAD_DONE (PyUnicode_AsUTF8 (abs_name ),
1631
+ mod != NULL );
1632
+
1633
+ if (import_time ) {
1634
+ _PyTime_t cum = _PyTime_GetPerfCounter () - t1 ;
1635
+
1636
+ import_level -- ;
1637
+ fprintf (stderr , "import time: %9ld | %10ld | %*s%s\n" ,
1638
+ (long )_PyTime_AsMicroseconds (cum - accumulated , _PyTime_ROUND_CEILING ),
1639
+ (long )_PyTime_AsMicroseconds (cum , _PyTime_ROUND_CEILING ),
1640
+ import_level * 2 , "" , PyUnicode_AsUTF8 (abs_name ));
1641
+
1642
+ accumulated = accumulated_copy + cum ;
1643
+ }
1644
+
1645
+ return mod ;
1646
+ }
1647
+
1592
1648
PyObject *
1593
1649
PyImport_ImportModuleLevelObject (PyObject * name , PyObject * globals ,
1594
1650
PyObject * locals , PyObject * fromlist ,
1595
1651
int level )
1596
1652
{
1597
- _Py_IDENTIFIER (_find_and_load );
1598
1653
_Py_IDENTIFIER (_handle_fromlist );
1599
1654
PyObject * abs_name = NULL ;
1600
1655
PyObject * final_mod = NULL ;
@@ -1674,55 +1729,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1674
1729
}
1675
1730
}
1676
1731
else {
1677
- int import_time = interp -> core_config .import_time ;
1678
- static int import_level ;
1679
- static _PyTime_t accumulated ;
1680
-
1681
- _PyTime_t t1 = 0 , accumulated_copy = accumulated ;
1682
-
1683
- /* XOptions is initialized after first some imports.
1684
- * So we can't have negative cache before completed initialization.
1685
- * Anyway, importlib._find_and_load is much slower than
1686
- * _PyDict_GetItemIdWithError().
1687
- */
1688
- if (import_time ) {
1689
- static int header = 1 ;
1690
- if (header ) {
1691
- fputs ("import time: self [us] | cumulative | imported package\n" ,
1692
- stderr );
1693
- header = 0 ;
1694
- }
1695
-
1696
- import_level ++ ;
1697
- t1 = _PyTime_GetPerfCounter ();
1698
- accumulated = 0 ;
1699
- }
1700
-
1701
- Py_XDECREF (mod );
1702
-
1703
- if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED ())
1704
- PyDTrace_IMPORT_FIND_LOAD_START (PyUnicode_AsUTF8 (abs_name ));
1705
-
1706
- mod = _PyObject_CallMethodIdObjArgs (interp -> importlib ,
1707
- & PyId__find_and_load , abs_name ,
1708
- interp -> import_func , NULL );
1709
-
1710
- if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED ())
1711
- PyDTrace_IMPORT_FIND_LOAD_DONE (PyUnicode_AsUTF8 (abs_name ),
1712
- mod != NULL );
1713
-
1714
- if (import_time ) {
1715
- _PyTime_t cum = _PyTime_GetPerfCounter () - t1 ;
1716
-
1717
- import_level -- ;
1718
- fprintf (stderr , "import time: %9ld | %10ld | %*s%s\n" ,
1719
- (long )_PyTime_AsMicroseconds (cum - accumulated , _PyTime_ROUND_CEILING ),
1720
- (long )_PyTime_AsMicroseconds (cum , _PyTime_ROUND_CEILING ),
1721
- import_level * 2 , "" , PyUnicode_AsUTF8 (abs_name ));
1722
-
1723
- accumulated = accumulated_copy + cum ;
1724
- }
1725
-
1732
+ mod = import_find_and_load (abs_name );
1726
1733
if (mod == NULL ) {
1727
1734
goto error ;
1728
1735
}
0 commit comments