bpo-40170: Convert PyObject_IS_GC() macro to a function (GH-19464)

diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h
index 6634f29..b835936 100644
--- a/Include/cpython/objimpl.h
+++ b/Include/cpython/objimpl.h
@@ -120,10 +120,9 @@
 PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void);
 
 
-/* Test if an object has a GC head */
-#define PyObject_IS_GC(o) \
-    (PyType_IS_GC(Py_TYPE(o)) \
-     && (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o)))
+/* Test if an object implements the garbage collector protocol */
+PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj);
+
 
 /* Code built with Py_BUILD_CORE must include pycore_gc.h instead which
    defines a different _PyGC_FINALIZED() macro. */
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index 7c0f24a..32e86d0 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -102,6 +102,15 @@
     return ((type->tp_flags & feature) != 0);
 }
 
+// Fast inlined version of PyObject_IS_GC()
+static inline int
+_PyObject_IS_GC(PyObject *obj)
+{
+    return (PyType_IS_GC(Py_TYPE(obj))
+            && (Py_TYPE(obj)->tp_is_gc == NULL
+                || Py_TYPE(obj)->tp_is_gc(obj)));
+}
+
 // Fast inlined version of PyType_IS_GC()
 #define _PyType_IS_GC(t) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)