mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
SF #561244, Micro optimizations
Initialize the small integers and __builtins__ in startup. This removes some if conditions. Change XDECREF to DECREF for values which shouldn't be NULL.
This commit is contained in:
parent
83f898c86c
commit
c91ed400e0
5 changed files with 44 additions and 19 deletions
|
@ -78,7 +78,7 @@ fill_free_list(void)
|
|||
#define NSMALLPOSINTS 100
|
||||
#endif
|
||||
#ifndef NSMALLNEGINTS
|
||||
#define NSMALLNEGINTS 1
|
||||
#define NSMALLNEGINTS 5
|
||||
#endif
|
||||
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
|
||||
/* References to small integers are saved in this array so that they
|
||||
|
@ -97,8 +97,8 @@ PyInt_FromLong(long ival)
|
|||
{
|
||||
register PyIntObject *v;
|
||||
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
|
||||
if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
|
||||
(v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
|
||||
if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
|
||||
v = small_ints[ival + NSMALLNEGINTS];
|
||||
Py_INCREF(v);
|
||||
#ifdef COUNT_ALLOCS
|
||||
if (ival >= 0)
|
||||
|
@ -118,13 +118,6 @@ PyInt_FromLong(long ival)
|
|||
free_list = (PyIntObject *)v->ob_type;
|
||||
PyObject_INIT(v, &PyInt_Type);
|
||||
v->ob_ival = ival;
|
||||
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
|
||||
if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
|
||||
/* save this one for a following allocation */
|
||||
Py_INCREF(v);
|
||||
small_ints[ival + NSMALLNEGINTS] = v;
|
||||
}
|
||||
#endif
|
||||
return (PyObject *) v;
|
||||
}
|
||||
|
||||
|
@ -945,6 +938,26 @@ PyTypeObject PyInt_Type = {
|
|||
(freefunc)int_free, /* tp_free */
|
||||
};
|
||||
|
||||
int
|
||||
PyInt_Init(void)
|
||||
{
|
||||
PyIntObject *v;
|
||||
int ival;
|
||||
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
|
||||
for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
|
||||
if ((free_list = fill_free_list()) == NULL)
|
||||
return 0;
|
||||
/* PyObject_New is inlined */
|
||||
v = free_list;
|
||||
free_list = (PyIntObject *)v->ob_type;
|
||||
PyObject_INIT(v, &PyInt_Type);
|
||||
v->ob_ival = ival;
|
||||
small_ints[ival + NSMALLNEGINTS] = v;
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
PyInt_Fini(void)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue