Flag the psycopg_ensure_*() functions as stealing a ref

This commit is contained in:
Daniele Varrazzo 2012-02-24 10:41:02 +00:00
parent 5f3f35a2c2
commit a6df55f4e3
3 changed files with 16 additions and 3 deletions

View File

@ -160,7 +160,7 @@ static double round(double num)
#define isinf(x) (!finite((x)) && (x)==(x)) #define isinf(x) (!finite((x)) && (x)==(x))
#endif #endif
/* decorator for the gcc cpychecker plugin */ /* decorators for the gcc cpychecker plugin */
#if defined(WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE) #if defined(WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE)
#define CPYCHECKER_RETURNS_BORROWED_REF \ #define CPYCHECKER_RETURNS_BORROWED_REF \
__attribute__((cpychecker_returns_borrowed_ref)) __attribute__((cpychecker_returns_borrowed_ref))
@ -168,4 +168,11 @@ static double round(double num)
#define CPYCHECKER_RETURNS_BORROWED_REF #define CPYCHECKER_RETURNS_BORROWED_REF
#endif #endif
#if defined(WITH_CPYCHECKER_STEALS_REFERENCE_TO_ARG_ATTRIBUTE)
#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) \
__attribute__((cpychecker_steals_reference_to_arg(n)))
#else
#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n)
#endif
#endif /* !defined(PSYCOPG_CONFIG_H) */ #endif /* !defined(PSYCOPG_CONFIG_H) */

View File

@ -127,10 +127,14 @@ HIDDEN char *psycopg_escape_string(PyObject *conn,
const char *from, Py_ssize_t len, char *to, Py_ssize_t *tolen); const char *from, Py_ssize_t len, char *to, Py_ssize_t *tolen);
HIDDEN char *psycopg_escape_identifier_easy(const char *from, Py_ssize_t len); HIDDEN char *psycopg_escape_identifier_easy(const char *from, Py_ssize_t len);
HIDDEN char *psycopg_strdup(const char *from, Py_ssize_t len); HIDDEN char *psycopg_strdup(const char *from, Py_ssize_t len);
HIDDEN PyObject * psycopg_ensure_bytes(PyObject *obj);
HIDDEN PyObject * psycopg_ensure_text(PyObject *obj);
HIDDEN int psycopg_is_text_file(PyObject *f); HIDDEN int psycopg_is_text_file(PyObject *f);
CPYCHECKER_STEALS_REFERENCE_TO_ARG(1)
HIDDEN PyObject * psycopg_ensure_bytes(PyObject *obj);
CPYCHECKER_STEALS_REFERENCE_TO_ARG(1)
HIDDEN PyObject * psycopg_ensure_text(PyObject *obj);
/* Exceptions docstrings */ /* Exceptions docstrings */
#define Error_doc \ #define Error_doc \
"Base class for error exceptions." "Base class for error exceptions."

View File

@ -139,6 +139,7 @@ psycopg_strdup(const char *from, Py_ssize_t len)
* *
* It is safe to call the function on NULL. * It is safe to call the function on NULL.
*/ */
CPYCHECKER_STEALS_REFERENCE_TO_ARG(1)
PyObject * PyObject *
psycopg_ensure_bytes(PyObject *obj) psycopg_ensure_bytes(PyObject *obj)
{ {
@ -169,6 +170,7 @@ psycopg_ensure_bytes(PyObject *obj)
* The function is ref neutral: steals a ref from obj and adds one to the * The function is ref neutral: steals a ref from obj and adds one to the
* return value. It is safe to call it on NULL. * return value. It is safe to call it on NULL.
*/ */
CPYCHECKER_STEALS_REFERENCE_TO_ARG(1)
PyObject * PyObject *
psycopg_ensure_text(PyObject *obj) psycopg_ensure_text(PyObject *obj)
{ {