Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
da5eb5a3
Kaydet (Commit)
da5eb5a3
authored
May 27, 2013
tarafından
Benjamin Peterson
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
don't expand the operand to Py_XINCREF/XDECREF/CLEAR/DECREF multiple times (closes #17206)
A patch from Illia Polosukhin.
üst
e7b47dda
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
71 additions
and
14 deletions
+71
-14
object.h
Include/object.h
+20
-14
ACKS
Misc/ACKS
+1
-0
NEWS
Misc/NEWS
+4
-0
_testcapimodule.c
Modules/_testcapimodule.c
+46
-0
No files found.
Include/object.h
Dosyayı görüntüle @
da5eb5a3
...
...
@@ -680,12 +680,6 @@ is not considered to be a reference to the type object, to save
complications in the deallocation function. (This is actually a
decision that's up to the implementer of each new type so if you want,
you can count such references to the type object.)
*** WARNING*** The Py_DECREF macro must have a side-effect-free argument
since it may evaluate its argument multiple times. (The alternative
would be to mace it a proper function or assign it to a global temporary
variable first, both of which are slower; and in a multi-threaded
environment the global variable trick is not safe.)
*/
/* First define a pile of simple helper macros, one set per special
...
...
@@ -764,15 +758,16 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
#define Py_INCREF(op) ( \
_Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \
((PyObject*)(op))->ob_refcnt++)
((PyObject
*)(op))->ob_refcnt++)
#define Py_DECREF(op) \
do { \
PyObject *_py_decref_tmp = (PyObject *)(op); \
if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \
--(
(PyObject*)(op))->ob_refcnt != 0)
\
_Py_CHECK_REFCNT(
op)
\
--(
_py_decref_tmp)->ob_refcnt != 0)
\
_Py_CHECK_REFCNT(
_py_decref_tmp)
\
else \
_Py_Dealloc(
(PyObject *)(op));
\
_Py_Dealloc(
_py_decref_tmp);
\
} while (0)
/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear
...
...
@@ -811,16 +806,27 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
*/
#define Py_CLEAR(op) \
do { \
if (op) {
\
PyObject *_py_tmp = (PyObject *)(op);
\
PyObject *_py_tmp = (PyObject *)(op);
\
if (_py_tmp != NULL) {
\
(op) = NULL; \
Py_DECREF(_py_tmp); \
} \
} while (0)
/* Macros to use in case the object pointer may be NULL: */
#define Py_XINCREF(op) do { if ((op) == NULL) ; else Py_INCREF(op); } while (0)
#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0)
#define Py_XINCREF(op) \
do { \
PyObject *_py_xincref_tmp = (PyObject *)(op); \
if (_py_xincref_tmp != NULL) \
Py_INCREF(_py_xincref_tmp); \
} while (0)
#define Py_XDECREF(op) \
do { \
PyObject *_py_xdecref_tmp = (PyObject *)(op); \
if (_py_xdecref_tmp != NULL) \
Py_DECREF(_py_xdecref_tmp); \
} while (0)
/*
These are provided as conveniences to Python runtime embedders, so that
...
...
Misc/ACKS
Dosyayı görüntüle @
da5eb5a3
...
...
@@ -983,6 +983,7 @@ Oleg Plakhotnyuk
Remi Pointel
Ariel Poliak
Guilherme Polo
Illia Polosukhin
Michael Pomraning
Iustin Pop
Claudiu Popa
...
...
Misc/NEWS
Dosyayı görüntüle @
da5eb5a3
...
...
@@ -10,6 +10,10 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins
-----------------
- Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now
expands their arguments once instead of multiple times.
Patch written by Illia Polosukhin.
- Issue #17937: Try harder to collect cyclic garbage at shutdown.
- Issue #12370: Prevent class bodies from interfering with the __class__
...
...
Modules/_testcapimodule.c
Dosyayı görüntüle @
da5eb5a3
...
...
@@ -2468,6 +2468,48 @@ test_pytime_object_to_timespec(PyObject *self, PyObject *args)
return
Py_BuildValue
(
"Nl"
,
_PyLong_FromTime_t
(
sec
),
nsec
);
}
static
PyObject
*
_test_incref
(
PyObject
*
ob
)
{
Py_INCREF
(
ob
);
return
ob
;
}
static
PyObject
*
test_xincref_doesnt_leak
(
PyObject
*
ob
)
{
PyObject
*
obj
=
PyLong_FromLong
(
0
);
Py_XINCREF
(
_test_incref
(
obj
));
Py_DECREF
(
obj
);
Py_DECREF
(
obj
);
Py_DECREF
(
obj
);
Py_RETURN_NONE
;
}
static
PyObject
*
test_incref_doesnt_leak
(
PyObject
*
ob
)
{
PyObject
*
obj
=
PyLong_FromLong
(
0
);
Py_INCREF
(
_test_incref
(
obj
));
Py_DECREF
(
obj
);
Py_DECREF
(
obj
);
Py_DECREF
(
obj
);
Py_RETURN_NONE
;
}
static
PyObject
*
test_xdecref_doesnt_leak
(
PyObject
*
ob
)
{
Py_XDECREF
(
PyLong_FromLong
(
0
));
Py_RETURN_NONE
;
}
static
PyObject
*
test_decref_doesnt_leak
(
PyObject
*
ob
)
{
Py_DECREF
(
PyLong_FromLong
(
0
));
Py_RETURN_NONE
;
}
static
PyMethodDef
TestMethods
[]
=
{
{
"raise_exception"
,
raise_exception
,
METH_VARARGS
},
...
...
@@ -2478,6 +2520,10 @@ static PyMethodDef TestMethods[] = {
{
"test_dict_iteration"
,
(
PyCFunction
)
test_dict_iteration
,
METH_NOARGS
},
{
"test_lazy_hash_inheritance"
,
(
PyCFunction
)
test_lazy_hash_inheritance
,
METH_NOARGS
},
{
"test_long_api"
,
(
PyCFunction
)
test_long_api
,
METH_NOARGS
},
{
"test_xincref_doesnt_leak"
,(
PyCFunction
)
test_xincref_doesnt_leak
,
METH_NOARGS
},
{
"test_incref_doesnt_leak"
,
(
PyCFunction
)
test_incref_doesnt_leak
,
METH_NOARGS
},
{
"test_xdecref_doesnt_leak"
,(
PyCFunction
)
test_xdecref_doesnt_leak
,
METH_NOARGS
},
{
"test_decref_doesnt_leak"
,
(
PyCFunction
)
test_decref_doesnt_leak
,
METH_NOARGS
},
{
"test_long_and_overflow"
,
(
PyCFunction
)
test_long_and_overflow
,
METH_NOARGS
},
{
"test_long_as_double"
,
(
PyCFunction
)
test_long_as_double
,
METH_NOARGS
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment