summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2002-12-30 22:29:22 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2002-12-30 22:29:22 (GMT)
commitc91ed400e053dc9f11dd30c84e2bb611999dce50 (patch)
treef190a1d4d9d3dbdb7d60afda9f7ea643e4f63b1b
parent83f898c86c5ce68eaddd8f729a67ae2d7d0666ec (diff)
downloadcpython-c91ed400e053dc9f11dd30c84e2bb611999dce50.zip
cpython-c91ed400e053dc9f11dd30c84e2bb611999dce50.tar.gz
cpython-c91ed400e053dc9f11dd30c84e2bb611999dce50.tar.bz2
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.
-rw-r--r--Include/intobject.h1
-rw-r--r--Include/pythonrun.h1
-rw-r--r--Objects/frameobject.c22
-rw-r--r--Objects/intobject.c33
-rw-r--r--Python/pythonrun.c6
5 files changed, 44 insertions, 19 deletions
diff --git a/Include/intobject.h b/Include/intobject.h
index ab936b2..50e6a73 100644
--- a/Include/intobject.h
+++ b/Include/intobject.h
@@ -30,6 +30,7 @@ PyAPI_DATA(PyTypeObject) PyInt_Type;
#define PyInt_Check(op) PyObject_TypeCheck(op, &PyInt_Type)
#define PyInt_CheckExact(op) ((op)->ob_type == &PyInt_Type)
+PyAPI_FUNC(int) PyInt_Init(void);
PyAPI_FUNC(PyObject *) PyInt_FromString(char*, char**, int);
#ifdef Py_USING_UNICODE
PyAPI_FUNC(PyObject *) PyInt_FromUnicode(Py_UNICODE*, int, int);
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index b888193..898eead 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -100,6 +100,7 @@ PyAPI_FUNC(PyObject *) _PySys_Init(void);
PyAPI_FUNC(void) _PyImport_Init(void);
PyAPI_FUNC(void) _PyExc_Init(void);
PyAPI_FUNC(void) _PyImportHooks_Init(void);
+PyAPI_FUNC(int) PyFrame_Init(void);
/* Various internal finalizers */
PyAPI_FUNC(void) _PyExc_Fini(void);
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 9123d94..b982064 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -401,9 +401,9 @@ frame_dealloc(PyFrameObject *f)
}
Py_XDECREF(f->f_back);
- Py_XDECREF(f->f_code);
- Py_XDECREF(f->f_builtins);
- Py_XDECREF(f->f_globals);
+ Py_DECREF(f->f_code);
+ Py_DECREF(f->f_builtins);
+ Py_DECREF(f->f_globals);
Py_XDECREF(f->f_locals);
Py_XDECREF(f->f_trace);
Py_XDECREF(f->f_exc_type);
@@ -525,21 +525,23 @@ PyTypeObject PyFrame_Type = {
0, /* tp_dict */
};
+static PyObject *builtin_object;
+
+int PyFrame_Init()
+{
+ builtin_object = PyString_InternFromString("__builtins__");
+ return (builtin_object != NULL);
+}
+
PyFrameObject *
PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
PyObject *locals)
{
PyFrameObject *back = tstate->frame;
- static PyObject *builtin_object;
PyFrameObject *f;
PyObject *builtins;
int extras, ncells, nfrees;
- if (builtin_object == NULL) {
- builtin_object = PyString_InternFromString("__builtins__");
- if (builtin_object == NULL)
- return NULL;
- }
#ifdef Py_DEBUG
if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
(locals != NULL && !PyDict_Check(locals))) {
@@ -802,4 +804,6 @@ PyFrame_Fini(void)
--numfree;
}
assert(numfree == 0);
+ Py_XDECREF(builtin_object);
+ builtin_object = NULL;
}
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 19d18d3..10587ac 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -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)
{
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 7469cb8..81543cc 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -124,6 +124,12 @@ Py_Initialize(void)
_Py_ReadyTypes();
+ if (!PyFrame_Init())
+ Py_FatalError("Py_Initialize: can't init frames");
+
+ if (!PyInt_Init())
+ Py_FatalError("Py_Initialize: can't init ints");
+
interp->modules = PyDict_New();
if (interp->modules == NULL)
Py_FatalError("Py_Initialize: can't make modules dictionary");