Commit e49caacd authored by Stefan Behnel's avatar Stefan Behnel

inline PyList_Append() a bit more

parent e0f83b2c
...@@ -277,7 +277,8 @@ builtin_types_table = [ ...@@ -277,7 +277,8 @@ builtin_types_table = [
("list", "PyList_Type", [BuiltinMethod("insert", "TzO", "r", "PyList_Insert"), ("list", "PyList_Type", [BuiltinMethod("insert", "TzO", "r", "PyList_Insert"),
BuiltinMethod("reverse", "T", "r", "PyList_Reverse"), BuiltinMethod("reverse", "T", "r", "PyList_Reverse"),
BuiltinMethod("append", "TO", "r", "PyList_Append"), BuiltinMethod("append", "TO", "r", "__Pyx_PyList_Append",
utility_code=UtilityCode.load("ListAppend", "Optimize.c")),
]), ]),
("dict", "PyDict_Type", [BuiltinMethod("items", "T", "O", "PyDict_Items"), # FIXME: Py3 mode? ("dict", "PyDict_Type", [BuiltinMethod("items", "T", "O", "PyDict_Items"), # FIXME: Py3 mode?
......
...@@ -5899,8 +5899,9 @@ class ComprehensionAppendNode(Node): ...@@ -5899,8 +5899,9 @@ class ComprehensionAppendNode(Node):
def generate_execution_code(self, code): def generate_execution_code(self, code):
if self.target.type is list_type: if self.target.type is list_type:
code.globalstate.use_utility_code(UtilityCode.load_cached("InternalListAppend", "Optimize.c")) code.globalstate.use_utility_code(
function = "__Pyx_PyList_Append" UtilityCode.load_cached("ListCompAppend", "Optimize.c"))
function = "__Pyx_ListComp_Append"
elif self.target.type is set_type: elif self.target.type is set_type:
function = "PySet_Add" function = "PySet_Add"
else: else:
......
...@@ -3,10 +3,11 @@ ...@@ -3,10 +3,11 @@
static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x); /*proto*/ static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x); /*proto*/
/////////////// append /////////////// /////////////// append ///////////////
//@requires: ListAppend
static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) { static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
if (likely(PyList_CheckExact(L))) { if (likely(PyList_CheckExact(L))) {
if (unlikely(PyList_Append(L, x) < 0)) return NULL; if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; /* this is just to have an accurate signature */ return Py_None; /* this is just to have an accurate signature */
} else { } else {
...@@ -14,13 +15,13 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) { ...@@ -14,13 +15,13 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
} }
} }
/////////////// InternalListAppend.proto /////////////// /////////////// ListAppend.proto ///////////////
#if CYTHON_COMPILING_IN_CPYTHON #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
PyListObject* L = (PyListObject*) list; PyListObject* L = (PyListObject*) list;
Py_ssize_t len = Py_SIZE(list); Py_ssize_t len = Py_SIZE(list);
if (likely(L->allocated > len)) { if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
Py_INCREF(x); Py_INCREF(x);
PyList_SET_ITEM(list, len, x); PyList_SET_ITEM(list, len, x);
Py_SIZE(list) = len+1; Py_SIZE(list) = len+1;
...@@ -32,6 +33,24 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { ...@@ -32,6 +33,24 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
#endif #endif
/////////////// ListCompAppend.proto ///////////////
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
PyListObject* L = (PyListObject*) list;
Py_ssize_t len = Py_SIZE(list);
if (likely(L->allocated > len)) {
Py_INCREF(x);
PyList_SET_ITEM(list, len, x);
Py_SIZE(list) = len+1;
return 0;
}
return PyList_Append(list, x);
}
#else
#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x)
#endif
/////////////// pop.proto /////////////// /////////////// pop.proto ///////////////
static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L); /*proto*/ static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L); /*proto*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment