summaryrefslogtreecommitdiff
path: root/Objects
diff options
context:
space:
mode:
authorINADA Naoki <songofacandy@gmail.com>2016-12-24 20:19:08 +0900
committerINADA Naoki <songofacandy@gmail.com>2016-12-24 20:19:08 +0900
commitfebbf471bd550945621b470089b6c3dc872ae894 (patch)
treeb07486e53a983e83379fb435c668e9386fb974d8 /Objects
parent01918fc00e2dc9846abc9fcc70750f688221d59e (diff)
downloadcpython-febbf471bd550945621b470089b6c3dc872ae894.tar.gz
Issue #29049: Call _PyObject_GC_TRACK() lazily when calling Python function.
Calling function is up to 5% faster.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/frameobject.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index eed538498c..84483195ab 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -415,7 +415,9 @@ frame_dealloc(PyFrameObject *f)
PyObject **p, **valuestack;
PyCodeObject *co;
- PyObject_GC_UnTrack(f);
+ if (_PyObject_GC_IS_TRACKED(f))
+ _PyObject_GC_UNTRACK(f);
+
Py_TRASHCAN_SAFE_BEGIN(f)
/* Kill all local variables */
valuestack = f->f_valuestack;
@@ -606,8 +608,8 @@ int _PyFrame_Init()
}
PyFrameObject* _Py_HOT_FUNCTION
-PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
- PyObject *locals)
+_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code,
+ PyObject *globals, PyObject *locals)
{
PyFrameObject *back = tstate->frame;
PyFrameObject *f;
@@ -727,10 +729,20 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
f->f_executing = 0;
f->f_gen = NULL;
- _PyObject_GC_TRACK(f);
return f;
}
+PyFrameObject*
+PyFrame_New(PyThreadState *tstate, PyCodeObject *code,
+ PyObject *globals, PyObject *locals)
+{
+ PyFrameObject *f = _PyFrame_New_NoTrack(tstate, code, globals, locals);
+ if (f)
+ _PyObject_GC_TRACK(f);
+ return f;
+}
+
+
/* Block management */
void