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.
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 @@
 #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(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 @@
 	}
 	
 	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 @@
 	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 @@
 		--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 @@
 #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 @@
 {
 	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 @@
 	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 @@
 	(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_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");