chore: some minor CPython API cleanup (#6005)

* chore: use PyType_GetFlags

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>

* chore: use public VectorCall in 3.9+

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>

---------

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>
diff --git a/include/pybind11/attr.h b/include/pybind11/attr.h
index b4486dc..d337595 100644
--- a/include/pybind11/attr.h
+++ b/include/pybind11/attr.h
@@ -378,7 +378,7 @@
 #ifdef PYBIND11_BACKWARD_COMPATIBILITY_TP_DICTOFFSET
         dynamic_attr |= base_info->type->tp_dictoffset != 0;
 #else
-        dynamic_attr |= (base_info->type->tp_flags & Py_TPFLAGS_MANAGED_DICT) != 0;
+        dynamic_attr |= (PyType_GetFlags(base_info->type) & Py_TPFLAGS_MANAGED_DICT) != 0;
 #endif
 
         if (caster) {
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index 6d0e851..9c8cdd0 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -2240,8 +2240,13 @@
         if (m_names) {
             nargs -= m_names.size();
         }
-        PyObject *result = _PyObject_Vectorcall(
-            ptr, m_args.data() + 1, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, m_names.ptr());
+        PyObject *result =
+#if PY_VERSION_HEX >= 0x03090000
+            PyObject_Vectorcall(
+#else
+            _PyObject_Vectorcall(
+#endif
+                ptr, m_args.data() + 1, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, m_names.ptr());
         if (!result) {
             throw error_already_set();
         }