void _PyTuple_MaybeUntrack(PyObject *op) { PyTupleObject *t; Py_ssize_t i, n; if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op)) return; t = (PyTupleObject *) op; n = Py_SIZE(t); for (i = 0; i < n; i++) { PyObject *elt = PyTuple_GET_ITEM(t, i); /* Tuple with NULL elements aren't fully constructed, don't untrack them yet. */ if (!elt || _PyObject_GC_MAY_BE_TRACKED(elt)) return; } #ifdef SHOW_TRACK_COUNT count_tracked--; count_untracked++; #endif _PyObject_GC_UNTRACK(op); }
static PyContextVar * contextvar_new(PyObject *name, PyObject *def) { if (!PyUnicode_Check(name)) { PyErr_SetString(PyExc_TypeError, "context variable name must be a str"); return NULL; } PyContextVar *var = PyObject_GC_New(PyContextVar, &PyContextVar_Type); if (var == NULL) { return NULL; } var->var_hash = contextvar_generate_hash(var, name); if (var->var_hash == -1) { Py_DECREF(var); return NULL; } Py_INCREF(name); var->var_name = name; Py_XINCREF(def); var->var_default = def; var->var_cached = NULL; var->var_cached_tsid = 0; var->var_cached_tsver = 0; if (_PyObject_GC_MAY_BE_TRACKED(name) || (def != NULL && _PyObject_GC_MAY_BE_TRACKED(def))) { PyObject_GC_Track(var); } return var; }