Merge Py_Cleanup() into Py_Finalize().  Call the various small Fini()
functions.
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index d0fe2fc..4d64114 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -69,6 +69,8 @@
 static void err_input Py_PROTO((perrdetail *));
 static void initsigs Py_PROTO((void));
 static void finisigs Py_PROTO((void));
+static void call_sys_exitfunc Py_PROTO((void));
+static void call_ll_exitfuncs Py_PROTO((void));
 
 int Py_DebugFlag; /* Needed by parser.c */
 int Py_VerboseFlag; /* Needed by import.c */
@@ -162,6 +164,8 @@
 	PyInterpreterState *interp;
 	PyThreadState *tstate;
 
+	call_sys_exitfunc();
+
 	if (!initialized)
 		Py_FatalError("Py_Finalize: not initialized");
 	initialized = 0;
@@ -177,9 +181,38 @@
 	finisigs();
 	_PyImport_Fini();
 	_PyBuiltin_Fini();
+	PyMethod_Fini();
+	PyFrame_Fini();
+	PyCFunction_Fini();
+	PyTuple_Fini();
 	PyString_Fini();
+	PyInt_Fini();
+	PyFloat_Fini();
+
+	/* XXX Still allocated:
+	   - various static ad-hoc pointers to interned strings
+	   - int and float free list blocks
+	   - whatever various modules and libraries allocate
+	*/
 
 	PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
+
+	call_ll_exitfuncs();
+
+#ifdef COUNT_ALLOCS
+	dump_counts();
+#endif
+
+#ifdef Py_REF_DEBUG
+	fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
+#endif
+
+#ifdef Py_TRACE_REFS
+	if (_Py_AskYesNo("Print left references?")) {
+		_Py_PrintReferences(stderr);
+	}
+	_Py_ResetReferences();
+#endif /* Py_TRACE_REFS */
 }
 
 /* Create and initialize a new interpreter and thread, and return the
@@ -297,22 +330,6 @@
 	return progname;
 }
 
-/*
-  Py_Initialize()
-  -- do everything, no-op on second call, call fatal on failure, set path
-
-  #2
-  -- create new interp+tstate & make it current, return NULL on failure,
-     make it current, do all setup, set path
-
-  #3
-  -- #2 without set path
-
-  #4
-  -- is there any point to #3 for caller-provided current interp+tstate?
-
-*/
-
 /* Create __main__ module */
 
 static void
@@ -831,8 +848,8 @@
 	return 0;
 }
 
-void
-Py_Cleanup()
+static void
+call_sys_exitfunc()
 {
 	PyObject *exitfunc = PySys_GetObject("exitfunc");
 
@@ -849,9 +866,11 @@
 	}
 
 	Py_FlushLine();
+}
 
-	Py_Finalize();
-
+static void
+call_ll_exitfuncs()
+{
 	while (nexitfuncs > 0)
 		(*exitfuncs[--nexitfuncs])();
 
@@ -867,21 +886,7 @@
 Py_Exit(sts)
 	int sts;
 {
-	Py_Cleanup();
-
-#ifdef COUNT_ALLOCS
-	dump_counts();
-#endif
-
-#ifdef Py_REF_DEBUG
-	fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
-#endif
-
-#ifdef Py_TRACE_REFS
-	if (_Py_AskYesNo("Print left references?")) {
-		_Py_PrintReferences(stderr);
-	}
-#endif /* Py_TRACE_REFS */
+	Py_Finalize();
 
 #ifdef macintosh
 	PyMac_Exit(sts);
@@ -896,7 +901,9 @@
 	int sig;
 {
 	signal(sig, SIG_DFL); /* Don't catch recursive signals */
-	Py_Cleanup(); /* Do essential clean-up */
+	/* Do essential exit processing only */
+	call_sys_exitfunc();
+	call_ll_exitfuncs();
 #ifdef HAVE_KILL
 	kill(getpid(), sig); /* Pretend the signal killed us */
 #else