]> granicus.if.org Git - python/commitdiff
SF #561244, Micro optimizations
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 30 Dec 2002 22:29:22 +0000 (22:29 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 30 Dec 2002 22:29:22 +0000 (22:29 +0000)
Initialize the small integers and __builtins__ in startup.
This removes some if conditions.
Change XDECREF to DECREF for values which shouldn't be NULL.

Include/intobject.h
Include/pythonrun.h
Objects/frameobject.c
Objects/intobject.c
Python/pythonrun.c

index ab936b2615848e7057c691c253a92be2d153084b..50e6a73c6989e9aa1aab6856fecc832db370df24 100644 (file)
@@ -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);
index b888193ad3b6151603d3989b7f95ee9a7909b111..898eead4898dccb6559dcc0790a582aaa360d29a 100644 (file)
@@ -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);
index 9123d94283edc96361903d5f5ade8753a77f1da9..b982064c0e5a5d790a31c79cbe32f51bb99eb7ba 100644 (file)
@@ -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;
 }
index 19d18d30793a7f14cf88c81cf64f6a8f3646bd35..10587ac7bd84b10e4263a127fa26809c841ea02a 100644 (file)
@@ -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)
 {
index 7469cb8d430bb439ddeec8a351fa97225e24fe65..81543cc86f9abc5e2f2216946b22be067d27e422 100644 (file)
@@ -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");