/* * We must call AddRef() on non-NULL COM pointers we receive as arguments * to callback functions - these functions are COM method implementations. * The Python instances we create have a __del__ method which calls Release(). * * The presence of a class attribute named '_needs_com_addref_' triggers this * behaviour. It would also be possible to call the AddRef() Python method, * after checking for PyObject_IsTrue(), but this would probably be somewhat * slower. */ static void TryAddRef(StgDictObject *dict, CDataObject *obj) { IUnknown *punk; _Py_IDENTIFIER(_needs_com_addref_); if (!_PyDict_GetItemIdWithError((PyObject *)dict, &PyId__needs_com_addref_)) { if (PyErr_Occurred()) { PrintError("getting _needs_com_addref_"); } return; } punk = *(IUnknown **)obj->b_ptr; if (punk) punk->lpVtbl->AddRef(punk); return; }
static PyObject * get_source_line(PyObject *module_globals, int lineno) { _Py_IDENTIFIER(get_source); _Py_IDENTIFIER(__loader__); _Py_IDENTIFIER(__name__); PyObject *loader; PyObject *module_name; PyObject *get_source; PyObject *source; PyObject *source_list; PyObject *source_line; /* Check/get the requisite pieces needed for the loader. */ loader = _PyDict_GetItemIdWithError(module_globals, &PyId___loader__); if (loader == NULL) { return NULL; } Py_INCREF(loader); module_name = _PyDict_GetItemIdWithError(module_globals, &PyId___name__); if (!module_name) { Py_DECREF(loader); return NULL; } Py_INCREF(module_name); /* Make sure the loader implements the optional get_source() method. */ get_source = _PyObject_GetAttrId(loader, &PyId_get_source); Py_DECREF(loader); if (!get_source) { Py_DECREF(module_name); if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } return NULL; } /* Call get_source() to get the source code. */ source = PyObject_CallFunctionObjArgs(get_source, module_name, NULL); Py_DECREF(get_source); Py_DECREF(module_name); if (!source) { return NULL; } if (source == Py_None) { Py_DECREF(source); return NULL; } /* Split the source into lines. */ source_list = PyUnicode_Splitlines(source, 0); Py_DECREF(source); if (!source_list) { return NULL; } /* Get the source line. */ source_line = PyList_GetItem(source_list, lineno-1); Py_XINCREF(source_line); Py_DECREF(source_list); return source_line; }