Two fixes for extended call syntax:
If a non-tuple sequence is passed as the *arg, convert it to a tuple
before checking its length.
If named keyword arguments are used in combination with **kwargs, make
a copy of kwargs before inserting the new keys.
diff --git a/Python/ceval.c b/Python/ceval.c
index d7171c8..6b3b257 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1635,7 +1635,18 @@
 				x = NULL;
 				break;
 			    }
-			    nstar = PySequence_Length(stararg);
+			    /* Convert abstract sequence to concrete tuple */
+			    if (!PyTuple_Check(stararg)) {
+				PyObject *t = NULL;
+				t = PySequence_Tuple(stararg);
+				if (t == NULL) {
+				    x = NULL;
+				    break;
+				}
+				Py_DECREF(stararg);
+				stararg = t;
+			    }
+			    nstar = PyTuple_GET_SIZE(stararg);
 			    if (nstar < 0) {
 				x = NULL;
 				break;
@@ -1649,6 +1660,15 @@
 				    break;
 				}
 			    }
+			    else {
+				    PyObject *d = PyDict_Copy(kwdict);
+				    if (d == NULL) {
+					    x = NULL;
+					    break;
+				    }
+				    Py_DECREF(kwdict);
+				    kwdict = d;
+			    }
 			    err = 0;
 			    while (--nk >= 0) {
 				PyObject *value = POP();
@@ -1678,18 +1698,7 @@
 			    break;
 			}
 			if (stararg) {
-			    PyObject *t = NULL;
 			    int i;
-			    if (!PyTuple_Check(stararg)) {
-				/* must be sequence to pass earlier test */
-				t = PySequence_Tuple(stararg);
-				if (t == NULL) {
-				    x = NULL;
-				    break;
-				}
-				Py_DECREF(stararg);
-				stararg = t;
-			    }
 			    for (i = 0; i < nstar; i++) {
 				PyObject *a = PyTuple_GET_ITEM(stararg, i);
 				Py_INCREF(a);