SF patch #659536: Use PyArg_UnpackTuple where possible.

Obtain cleaner coding and a system wide
performance boost by using the fast, pre-parsed
PyArg_Unpack function instead of PyArg_ParseTuple
function which is driven by a format string.
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 2572886..44c6abb 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -254,7 +254,7 @@
 	PyObject *ans;
 	PyObject *newargs;
 
-	if (! PyArg_ParseTuple(args, "O|O:log", &arg, &base))
+	if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
 		return NULL;
 	if (base == NULL)
 		return loghelper(args, log, "d:log", arg);
@@ -298,7 +298,7 @@
 {
 	PyObject *arg;
 
-	if (! PyArg_ParseTuple(args, "O:log10", &arg))
+	if (!PyArg_UnpackTuple(args, "log10", 1, 1, &arg))
 		return NULL;
 	return loghelper(args, log10, "d:log10", arg);
 }
diff --git a/Modules/operator.c b/Modules/operator.c
index 55c26df..d89564d 100644
--- a/Modules/operator.c
+++ b/Modules/operator.c
@@ -12,12 +12,12 @@
 
 #define spam1(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1; \
-  if(! PyArg_ParseTuple(a,"O:" #OP,&a1)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,1,1,&a1)) return NULL; \
   return AOP(a1); }
 
 #define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2; \
-  if(! PyArg_ParseTuple(a,"OO:" #OP,&a1,&a2)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
   return AOP(a1,a2); }
 
 #define spamoi(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
@@ -27,39 +27,39 @@
 
 #define spam2n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2; \
-  if(! PyArg_ParseTuple(a,"OO:" #OP,&a1,&a2)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
   if(-1 == AOP(a1,a2)) return NULL; \
   Py_INCREF(Py_None); \
   return Py_None; }
 
 #define spam3n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2, *a3; \
-  if(! PyArg_ParseTuple(a,"OOO:" #OP,&a1,&a2,&a3)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,3,3,&a1,&a2,&a3)) return NULL; \
   if(-1 == AOP(a1,a2,a3)) return NULL; \
   Py_INCREF(Py_None); \
   return Py_None; }
 
 #define spami(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1; long r; \
-  if(! PyArg_ParseTuple(a,"O:" #OP,&a1)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,1,1,&a1)) return NULL; \
   if(-1 == (r=AOP(a1))) return NULL; \
   return PyBool_FromLong(r); }
 
 #define spami2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2; long r; \
-  if(! PyArg_ParseTuple(a,"OO:" #OP,&a1,&a2)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
   if(-1 == (r=AOP(a1,a2))) return NULL; \
   return PyInt_FromLong(r); }
 
 #define spami2b(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2; long r; \
-  if(! PyArg_ParseTuple(a,"OO:" #OP,&a1,&a2)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
   if(-1 == (r=AOP(a1,a2))) return NULL; \
   return PyBool_FromLong(r); }
 
 #define spamrc(OP,A) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1, *a2; \
-  if(! PyArg_ParseTuple(a,"OO:" #OP,&a1,&a2)) return NULL; \
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
   return PyObject_RichCompare(a1,a2,A); }
 
 spami(isCallable       , PyCallable_Check)
@@ -105,7 +105,7 @@
 op_pow(PyObject *s, PyObject *a)
 {
 	PyObject *a1, *a2;
-	if (PyArg_ParseTuple(a,"OO:pow",&a1,&a2))
+	if (PyArg_UnpackTuple(a,"pow", 2, 2, &a1, &a2))
 		return PyNumber_Power(a1, a2, Py_None);
 	return NULL;
 }
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 5234a65..bc22345 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -2178,7 +2178,7 @@
 	PyObject *self;
 	PyObject *classObj;
 
-	if (!PyArg_ParseTuple(args, "OOO:instancemethod",
+	if (!PyArg_UnpackTuple(args, "instancemethod", 3, 3,
 			      &func, &self, &classObj))
 		return NULL;
 	if (!PyCallable_Check(func)) {
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 761e1ab..6c78778 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -686,7 +686,7 @@
 {
 	PyObject *key, *def = Py_None;
 
-	if (!PyArg_ParseTuple(args, "O|O:get", &key, &def))
+	if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def))
 		return NULL;
 	return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def);
 }
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 5e39dfa..de7a18e 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -972,7 +972,7 @@
 	PyObject *d;
 	int status;
 
-	if (!PyArg_ParseTuple(args, "O|O:fromkeys", &seq, &value))
+	if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
 		return NULL;
 
 	d = PyObject_CallObject(cls, NULL);
@@ -1479,7 +1479,7 @@
 	PyObject *val = NULL;
 	long hash;
 
-	if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
+	if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
 		return NULL;
 
 	if (!PyString_CheckExact(key) ||
@@ -1505,7 +1505,7 @@
 	PyObject *val = NULL;
 	long hash;
 
-	if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
+	if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
 		return NULL;
 
 	if (!PyString_CheckExact(key) ||
@@ -1834,7 +1834,7 @@
 	PyObject *arg = NULL;
 	int result = 0;
 
-	if (!PyArg_ParseTuple(args, "|O:dict", &arg))
+	if (!PyArg_UnpackTuple(args, "dict", 0, 1, &arg))
 		result = -1;
 
 	else if (arg != NULL) {
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 33fb3bc..fb73385 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -503,7 +503,7 @@
 	if (f->f_fp == NULL)
 		return err_closed();
 	newsizeobj = NULL;
-	if (!PyArg_ParseTuple(args, "|O:truncate", &newsizeobj))
+	if (!PyArg_UnpackTuple(args, "truncate", 0, 1, &newsizeobj))
 		return NULL;
 
 	/* Set newsize to current postion if newsizeobj NULL, else to the
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 4f36df9..6154d99 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -588,7 +588,7 @@
 	classmethod *cm = (classmethod *)self;
 	PyObject *callable;
 
-	if (!PyArg_ParseTuple(args, "O:classmethod", &callable))
+	if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
 		return -1;
 	Py_INCREF(callable);
 	cm->cm_callable = callable;
@@ -720,7 +720,7 @@
 	staticmethod *sm = (staticmethod *)self;
 	PyObject *callable;
 
-	if (!PyArg_ParseTuple(args, "O:staticmethod", &callable))
+	if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
 		return -1;
 	Py_INCREF(callable);
 	sm->sm_callable = callable;
diff --git a/Objects/listobject.c b/Objects/listobject.c
index ba47028..461350c 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1654,7 +1654,7 @@
 
 	assert(self != NULL);
 	if (args != NULL) {
-		if (!PyArg_ParseTuple(args, "|O:sort", &compare))
+		if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
 			return NULL;
 	}
 	merge_init(&ms, compare);
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index 7198cca..796df2b 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -174,7 +174,7 @@
 
 	start = stop = step = NULL;
 
-	if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
+	if (!PyArg_UnpackTuple(args, "slice", 1, 3, &start, &stop, &step))
 		return NULL;
 
 	/* This swapping of stop and start is to maintain similarity with
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 7937b46..1e42856 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -2046,7 +2046,7 @@
 	int trans_table[256];
 	PyObject *tableobj, *delobj = NULL;
 
-	if (!PyArg_ParseTuple(args, "O|O:translate",
+	if (!PyArg_UnpackTuple(args, "translate", 1, 2,
 			      &tableobj, &delobj))
 		return NULL;
 
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ab76006..5cf1d41 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -70,7 +70,7 @@
 	PyObject *func, *alist = NULL, *kwdict = NULL;
 	PyObject *t = NULL, *retval = NULL;
 
-	if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
+	if (!PyArg_UnpackTuple(args, "apply", 1, 3, &func, &alist, &kwdict))
 		return NULL;
 	if (alist != NULL) {
 		if (!PyTuple_Check(alist)) {
@@ -126,7 +126,7 @@
 	int len;   /* guess for result list size */
 	register int j;
 
-	if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
+	if (!PyArg_UnpackTuple(args, "filter", 2, 2, &func, &seq))
 		return NULL;
 
 	/* Strings and tuples return a result of the same type. */
@@ -284,7 +284,7 @@
 	PyObject *a, *b;
 	int c;
 
-	if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
+	if (!PyArg_UnpackTuple(args, "cmp", 2, 2, &a, &b))
 		return NULL;
 	if (PyObject_Cmp(a, b, &c) < 0)
 		return NULL;
@@ -303,7 +303,7 @@
 	PyObject *v, *w;
 	PyObject *res;
 
-	if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
+	if (!PyArg_UnpackTuple(args, "coerce", 2, 2, &v, &w))
 		return NULL;
 	if (PyNumber_Coerce(&v, &w) < 0)
 		return NULL;
@@ -381,7 +381,7 @@
 {
 	PyObject *arg = NULL;
 
-	if (!PyArg_ParseTuple(args, "|O:dir", &arg))
+	if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
 		return NULL;
 	return PyObject_Dir(arg);
 }
@@ -404,7 +404,7 @@
 {
 	PyObject *v, *w;
 
-	if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
+	if (!PyArg_UnpackTuple(args, "divmod", 2, 2, &v, &w))
 		return NULL;
 	return PyNumber_Divmod(v, w);
 }
@@ -580,7 +580,7 @@
 	PyObject *v, *result, *dflt = NULL;
 	PyObject *name;
 
-	if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
+	if (!PyArg_UnpackTuple(args, "getattr", 2, 3, &v, &name, &dflt))
 		return NULL;
 #ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(name)) {
@@ -636,7 +636,7 @@
 	PyObject *v;
 	PyObject *name;
 
-	if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
+	if (!PyArg_UnpackTuple(args, "hasattr", 2, 2, &v, &name))
 		return NULL;
 #ifdef Py_USING_UNICODE
 	if (PyUnicode_Check(name)) {
@@ -856,7 +856,7 @@
 	PyObject *name;
 	PyObject *value;
 
-	if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
+	if (!PyArg_UnpackTuple(args, "setattr", 3, 3, &v, &name, &value))
 		return NULL;
 	if (PyObject_SetAttr(v, name, value) != 0)
 		return NULL;
@@ -877,7 +877,7 @@
 	PyObject *v;
 	PyObject *name;
 
-	if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
+	if (!PyArg_UnpackTuple(args, "delattr", 2, 2, &v, &name))
 		return NULL;
 	if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
 		return NULL;
@@ -990,7 +990,7 @@
 {
 	PyObject *v, *w = NULL;
 
-	if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
+	if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w))
 		return NULL;
 	if (w == NULL)
 		return PyObject_GetIter(v);
@@ -1051,7 +1051,7 @@
 
 	if (PyTuple_Size(args) > 1)
 		v = args;
-	else if (!PyArg_ParseTuple(args, "O:min/max", &v))
+	else if (!PyArg_UnpackTuple(args, "min/max", 1, 1, &v))
 		return NULL;
 
 	it = PyObject_GetIter(v);
@@ -1188,7 +1188,7 @@
 {
 	PyObject *v, *w, *z = Py_None;
 
-	if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
+	if (!PyArg_UnpackTuple(args, "pow", 2, 3, &v, &w, &z))
 		return NULL;
 	return PyNumber_Power(v, w, z);
 }
@@ -1296,7 +1296,7 @@
 	PyObject *fin = PySys_GetObject("stdin");
 	PyObject *fout = PySys_GetObject("stdout");
 
-	if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
+	if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v))
 		return NULL;
 
 	if (fin == NULL) {
@@ -1377,7 +1377,7 @@
 {
 	PyObject *seq, *func, *result = NULL, *it;
 
-	if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
+	if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
 		return NULL;
 	if (result != NULL)
 		Py_INCREF(result);
@@ -1513,7 +1513,7 @@
 	PyObject *v = NULL;
 	PyObject *d;
 
-	if (!PyArg_ParseTuple(args, "|O:vars", &v))
+	if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v))
 		return NULL;
 	if (v == NULL) {
 		d = PyEval_GetLocals();
@@ -1549,7 +1549,7 @@
 	PyObject *cls;
 	int retval;
 
-	if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
+	if (!PyArg_UnpackTuple(args, "isinstance", 2, 2, &inst, &cls))
 		return NULL;
 
 	retval = PyObject_IsInstance(inst, cls);
@@ -1574,7 +1574,7 @@
 	PyObject *cls;
 	int retval;
 
-	if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
+	if (!PyArg_UnpackTuple(args, "issubclass", 2, 2, &derived, &cls))
 		return NULL;
 
 	retval = PyObject_IsSubclass(derived, cls);