bpo-38631: Avoid Py_FatalError() in handle_legacy_finalizers() (GH-17266)

* Rename _PyGC_Initialize() to _PyGC_InitializeRuntime()
* Add _PyGC_Init(): initialize _PyRuntime.gc.garbage list
* Call _PyGC_Init() before _PyTypes_Init()
diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h
index d89dbea..16baf10 100644
--- a/Include/internal/pycore_pylifecycle.h
+++ b/Include/internal/pycore_pylifecycle.h
@@ -57,6 +57,7 @@
 
 extern PyStatus _PyTypes_Init(void);
 extern PyStatus _PyImportZip_Init(PyThreadState *tstate);
+extern PyStatus _PyGC_Init(struct pyruntimestate *runtime);
 
 
 /* Various internal finalizers */
diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h
index 535f99e..97d8fd9 100644
--- a/Include/internal/pycore_pymem.h
+++ b/Include/internal/pycore_pymem.h
@@ -144,7 +144,7 @@
     Py_ssize_t long_lived_pending;
 };
 
-PyAPI_FUNC(void) _PyGC_Initialize(struct _gc_runtime_state *);
+PyAPI_FUNC(void) _PyGC_InitializeRuntime(struct _gc_runtime_state *);
 
 
 /* Set the memory allocator of the specified domain to the default.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index cb7a3de..d2e3937 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -25,6 +25,7 @@
 
 #include "Python.h"
 #include "pycore_context.h"
+#include "pycore_initconfig.h"
 #include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
@@ -129,7 +130,7 @@
 #define GEN_HEAD(state, n) (&(state)->generations[n].head)
 
 void
-_PyGC_Initialize(struct _gc_runtime_state *state)
+_PyGC_InitializeRuntime(struct _gc_runtime_state *state)
 {
     state->enabled = 1; /* automatic collection enabled? */
 
@@ -151,6 +152,21 @@
     state->permanent_generation = permanent_generation;
 }
 
+
+PyStatus
+_PyGC_Init(_PyRuntimeState *runtime)
+{
+    struct _gc_runtime_state *state = &runtime->gc;
+    if (state->garbage == NULL) {
+        state->garbage = PyList_New(0);
+        if (state->garbage == NULL) {
+            return _PyStatus_NO_MEMORY();
+        }
+    }
+    return _PyStatus_OK();
+}
+
+
 /*
 _gc_prev values
 ---------------
@@ -905,13 +921,9 @@
                          PyGC_Head *finalizers, PyGC_Head *old)
 {
     assert(!PyErr_Occurred());
+    assert(state->garbage != NULL);
 
     PyGC_Head *gc = GC_NEXT(finalizers);
-    if (state->garbage == NULL) {
-        state->garbage = PyList_New(0);
-        if (state->garbage == NULL)
-            Py_FatalError("gc couldn't create gc.garbage list");
-    }
     for (; gc != finalizers; gc = GC_NEXT(gc)) {
         PyObject *op = FROM_GC(gc);
 
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 1bfc7c1..9739bb1 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -558,9 +558,16 @@
 
 
 static PyStatus
-pycore_init_types(void)
+pycore_init_types(_PyRuntimeState *runtime)
 {
-    PyStatus status = _PyTypes_Init();
+    PyStatus status;
+
+    status = _PyGC_Init(runtime);
+    if (_PyStatus_EXCEPTION(status)) {
+        return status;
+    }
+
+    status = _PyTypes_Init();
     if (_PyStatus_EXCEPTION(status)) {
         return status;
     }
@@ -683,7 +690,7 @@
     config = &tstate->interp->config;
     *tstate_p = tstate;
 
-    status = pycore_init_types();
+    status = pycore_init_types(runtime);
     if (_PyStatus_EXCEPTION(status)) {
         return status;
     }
@@ -1447,7 +1454,7 @@
     }
     config = &interp->config;
 
-    status = pycore_init_types();
+    status = pycore_init_types(runtime);
 
     /* XXX The following is lax in error checking */
     PyObject *modules = PyDict_New();
diff --git a/Python/pystate.c b/Python/pystate.c
index b4b1247..06cc9a8 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -58,7 +58,7 @@
     runtime->open_code_userdata = open_code_userdata;
     runtime->audit_hook_head = audit_hook_head;
 
-    _PyGC_Initialize(&runtime->gc);
+    _PyGC_InitializeRuntime(&runtime->gc);
     _PyEval_Initialize(&runtime->ceval);
 
     PyPreConfig_InitPythonConfig(&runtime->preconfig);