@@ -406,233 +406,6 @@ import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name)
406
406
}
407
407
408
408
409
- /* List of names to clear in sys */
410
- static const char * const sys_deletes [] = {
411
- "path" , "argv" , "ps1" , "ps2" ,
412
- "last_type" , "last_value" , "last_traceback" ,
413
- "path_hooks" , "path_importer_cache" , "meta_path" ,
414
- "__interactivehook__" ,
415
- NULL
416
- };
417
-
418
- static const char * const sys_files [] = {
419
- "stdin" , "__stdin__" ,
420
- "stdout" , "__stdout__" ,
421
- "stderr" , "__stderr__" ,
422
- NULL
423
- };
424
-
425
- /* Un-initialize things, as good as we can */
426
-
427
- void
428
- _PyImport_Cleanup (PyThreadState * tstate )
429
- {
430
- PyInterpreterState * interp = tstate -> interp ;
431
- PyObject * modules = interp -> modules ;
432
- if (modules == NULL ) {
433
- /* Already done */
434
- return ;
435
- }
436
-
437
- /* Delete some special variables first. These are common
438
- places where user values hide and people complain when their
439
- destructors fail. Since the modules containing them are
440
- deleted *last* of all, they would come too late in the normal
441
- destruction order. Sigh. */
442
-
443
- /* XXX Perhaps these precautions are obsolete. Who knows? */
444
-
445
- int verbose = _PyInterpreterState_GetConfig (interp )-> verbose ;
446
- if (verbose ) {
447
- PySys_WriteStderr ("# clear builtins._\n" );
448
- }
449
- if (PyDict_SetItemString (interp -> builtins , "_" , Py_None ) < 0 ) {
450
- PyErr_WriteUnraisable (NULL );
451
- }
452
-
453
- const char * const * p ;
454
- for (p = sys_deletes ; * p != NULL ; p ++ ) {
455
- if (verbose ) {
456
- PySys_WriteStderr ("# clear sys.%s\n" , * p );
457
- }
458
- if (PyDict_SetItemString (interp -> sysdict , * p , Py_None ) < 0 ) {
459
- PyErr_WriteUnraisable (NULL );
460
- }
461
- }
462
- for (p = sys_files ; * p != NULL ; p += 2 ) {
463
- if (verbose ) {
464
- PySys_WriteStderr ("# restore sys.%s\n" , * p );
465
- }
466
- PyObject * value = _PyDict_GetItemStringWithError (interp -> sysdict ,
467
- * (p + 1 ));
468
- if (value == NULL ) {
469
- if (_PyErr_Occurred (tstate )) {
470
- PyErr_WriteUnraisable (NULL );
471
- }
472
- value = Py_None ;
473
- }
474
- if (PyDict_SetItemString (interp -> sysdict , * p , value ) < 0 ) {
475
- PyErr_WriteUnraisable (NULL );
476
- }
477
- }
478
-
479
- /* We prepare a list which will receive (name, weakref) tuples of
480
- modules when they are removed from sys.modules. The name is used
481
- for diagnosis messages (in verbose mode), while the weakref helps
482
- detect those modules which have been held alive. */
483
- PyObject * weaklist = PyList_New (0 );
484
- if (weaklist == NULL ) {
485
- PyErr_WriteUnraisable (NULL );
486
- }
487
-
488
- #define STORE_MODULE_WEAKREF (name , mod ) \
489
- if (weaklist != NULL) { \
490
- PyObject *wr = PyWeakref_NewRef(mod, NULL); \
491
- if (wr) { \
492
- PyObject *tup = PyTuple_Pack(2, name, wr); \
493
- if (!tup || PyList_Append(weaklist, tup) < 0) { \
494
- PyErr_WriteUnraisable(NULL); \
495
- } \
496
- Py_XDECREF(tup); \
497
- Py_DECREF(wr); \
498
- } \
499
- else { \
500
- PyErr_WriteUnraisable(NULL); \
501
- } \
502
- }
503
- #define CLEAR_MODULE (name , mod ) \
504
- if (PyModule_Check(mod)) { \
505
- if (verbose && PyUnicode_Check(name)) { \
506
- PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
507
- } \
508
- STORE_MODULE_WEAKREF(name, mod); \
509
- if (PyObject_SetItem(modules, name, Py_None) < 0) { \
510
- PyErr_WriteUnraisable(NULL); \
511
- } \
512
- }
513
-
514
- /* Remove all modules from sys.modules, hoping that garbage collection
515
- can reclaim most of them. */
516
- if (PyDict_CheckExact (modules )) {
517
- Py_ssize_t pos = 0 ;
518
- PyObject * key , * value ;
519
- while (PyDict_Next (modules , & pos , & key , & value )) {
520
- CLEAR_MODULE (key , value );
521
- }
522
- }
523
- else {
524
- PyObject * iterator = PyObject_GetIter (modules );
525
- if (iterator == NULL ) {
526
- PyErr_WriteUnraisable (NULL );
527
- }
528
- else {
529
- PyObject * key ;
530
- while ((key = PyIter_Next (iterator ))) {
531
- PyObject * value = PyObject_GetItem (modules , key );
532
- if (value == NULL ) {
533
- PyErr_WriteUnraisable (NULL );
534
- continue ;
535
- }
536
- CLEAR_MODULE (key , value );
537
- Py_DECREF (value );
538
- Py_DECREF (key );
539
- }
540
- if (PyErr_Occurred ()) {
541
- PyErr_WriteUnraisable (NULL );
542
- }
543
- Py_DECREF (iterator );
544
- }
545
- }
546
-
547
- /* Clear the modules dict. */
548
- if (PyDict_CheckExact (modules )) {
549
- PyDict_Clear (modules );
550
- }
551
- else {
552
- _Py_IDENTIFIER (clear );
553
- if (_PyObject_CallMethodIdNoArgs (modules , & PyId_clear ) == NULL ) {
554
- PyErr_WriteUnraisable (NULL );
555
- }
556
- }
557
- /* Restore the original builtins dict, to ensure that any
558
- user data gets cleared. */
559
- PyObject * dict = PyDict_Copy (interp -> builtins );
560
- if (dict == NULL ) {
561
- PyErr_WriteUnraisable (NULL );
562
- }
563
- PyDict_Clear (interp -> builtins );
564
- if (PyDict_Update (interp -> builtins , interp -> builtins_copy )) {
565
- _PyErr_Clear (tstate );
566
- }
567
- Py_XDECREF (dict );
568
- /* Collect references */
569
- _PyGC_CollectNoFail (tstate );
570
- /* Dump GC stats before it's too late, since it uses the warnings
571
- machinery. */
572
- _PyGC_DumpShutdownStats (tstate );
573
-
574
- /* Now, if there are any modules left alive, clear their globals to
575
- minimize potential leaks. All C extension modules actually end
576
- up here, since they are kept alive in the interpreter state.
577
-
578
- The special treatment of "builtins" here is because even
579
- when it's not referenced as a module, its dictionary is
580
- referenced by almost every module's __builtins__. Since
581
- deleting a module clears its dictionary (even if there are
582
- references left to it), we need to delete the "builtins"
583
- module last. Likewise, we don't delete sys until the very
584
- end because it is implicitly referenced (e.g. by print). */
585
- if (weaklist != NULL ) {
586
- Py_ssize_t i ;
587
- /* Since dict is ordered in CPython 3.6+, modules are saved in
588
- importing order. First clear modules imported later. */
589
- for (i = PyList_GET_SIZE (weaklist ) - 1 ; i >= 0 ; i -- ) {
590
- PyObject * tup = PyList_GET_ITEM (weaklist , i );
591
- PyObject * name = PyTuple_GET_ITEM (tup , 0 );
592
- PyObject * mod = PyWeakref_GET_OBJECT (PyTuple_GET_ITEM (tup , 1 ));
593
- if (mod == Py_None )
594
- continue ;
595
- assert (PyModule_Check (mod ));
596
- dict = PyModule_GetDict (mod );
597
- if (dict == interp -> builtins || dict == interp -> sysdict )
598
- continue ;
599
- Py_INCREF (mod );
600
- if (verbose && PyUnicode_Check (name )) {
601
- PySys_FormatStderr ("# cleanup[3] wiping %U\n" , name );
602
- }
603
- _PyModule_Clear (mod );
604
- Py_DECREF (mod );
605
- }
606
- Py_DECREF (weaklist );
607
- }
608
-
609
- /* Next, delete sys and builtins (in that order) */
610
- if (verbose ) {
611
- PySys_FormatStderr ("# cleanup[3] wiping sys\n" );
612
- }
613
- _PyModule_ClearDict (interp -> sysdict );
614
- if (verbose ) {
615
- PySys_FormatStderr ("# cleanup[3] wiping builtins\n" );
616
- }
617
- _PyModule_ClearDict (interp -> builtins );
618
-
619
- /* Clear module dict copies stored in the interpreter state */
620
- _PyInterpreterState_ClearModules (interp );
621
-
622
- /* Clear and delete the modules directory. Actual modules will
623
- still be there only if imported during the execution of some
624
- destructor. */
625
- interp -> modules = NULL ;
626
- Py_DECREF (modules );
627
-
628
- /* Once more */
629
- _PyGC_CollectNoFail (tstate );
630
-
631
- #undef CLEAR_MODULE
632
- #undef STORE_MODULE_WEAKREF
633
- }
634
-
635
-
636
409
/* Helper for pythonrun.c -- return magic number and tag. */
637
410
638
411
long
0 commit comments