diff --git a/Objects/abstract.c b/Objects/abstract.c
index b27d0c7..a8823eb 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -158,7 +158,7 @@
   if(PyInt_Check(key))
     return PySequence_SetItem(o,PyInt_AsLong(key),value);
 
-  PyErr_SetString(PyExc_TypeError,"expeced integer index");
+  PyErr_SetString(PyExc_TypeError,"expected integer index");
   return -1;
 }
 
@@ -176,7 +176,7 @@
   if(PyInt_Check(key))
     return PySequence_SetItem(o,PyInt_AsLong(key),(PyObject*)NULL);
 
-  PyErr_SetString(PyExc_TypeError,"expeced integer index");
+  PyErr_SetString(PyExc_TypeError,"expected integer index");
   return -1;
 }
 
@@ -202,7 +202,7 @@
 
 	BINOP("__or__", "__ror__", PyNumber_Or);
 	if (v->ob_type->tp_as_number != NULL) {
-		PyObject *x;
+		PyObject *x = NULL;
 		PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
 		if (PyNumber_Coerce(&v, &w) != 0)
 			return NULL;
@@ -225,7 +225,7 @@
 
 	BINOP("__xor__", "__rxor__", PyNumber_Xor);
 	if (v->ob_type->tp_as_number != NULL) {
-		PyObject *x;
+		PyObject *x = NULL;
 		PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
 		if (PyNumber_Coerce(&v, &w) != 0)
 			return NULL;
@@ -246,7 +246,7 @@
 {
 	BINOP("__and__", "__rand__", PyNumber_And);
 	if (v->ob_type->tp_as_number != NULL) {
-		PyObject *x;
+		PyObject *x = NULL;
 		PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
 		if (PyNumber_Coerce(&v, &w) != 0)
 			return NULL;
@@ -267,7 +267,7 @@
 {
 	BINOP("__lshift__", "__rlshift__", PyNumber_Lshift);
 	if (v->ob_type->tp_as_number != NULL) {
-		PyObject *x;
+		PyObject *x = NULL;
 		PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
 		if (PyNumber_Coerce(&v, &w) != 0)
 			return NULL;
@@ -288,7 +288,7 @@
 {
 	BINOP("__rshift__", "__rrshift__", PyNumber_Rshift);
 	if (v->ob_type->tp_as_number != NULL) {
-		PyObject *x;
+		PyObject *x = NULL;
 		PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
 		if (PyNumber_Coerce(&v, &w) != 0)
 			return NULL;
@@ -802,7 +802,7 @@
 
   for(i=0; i < l; i++)
     {
-      if(item=PySequence_GetItem(s,i))
+      if((item=PySequence_GetItem(s,i)))
 	{
 	  if(PyTuple_SetItem(t,i,item) == -1)
 	    {
@@ -820,6 +820,35 @@
   return t;
 }
 
+PyObject *
+PySequence_List(s)
+  PyObject *s;
+{
+  int l, i;
+  PyObject *t, *item;
+  if(! s) return Py_ReturnNullError();
+  Py_TRY((l=PySequence_Length(s)) != -1);
+  Py_TRY(t=PyList_New(l));
+  for(i=0; i < l; i++)
+    {
+      if((item=PySequence_GetItem(s,i)))
+      {
+        if(PyList_SetItem(t,i,item) == -1)
+          {
+            Py_DECREF(item);
+            Py_DECREF(t);
+            return NULL;
+          }
+      }
+      else
+      {
+        Py_DECREF(t);
+        return NULL;
+      }
+    }
+  return t;
+}
+
 int 
 PySequence_Count(s, o)
   PyObject *s;
@@ -829,11 +858,11 @@
   PyObject *item;
 
   if(! s || ! o) return Py_ReturnNullError(), -1;
-  Py_TRY((l=PySequence_Length(s)) != -1),-1;
+  if((l=PySequence_Length(s)) == -1) return -1;
 
   for(i=0; i < l; i++)
     {
-      Py_TRY(item=PySequence_GetItem(s,i)),-1;
+      if((item=PySequence_GetItem(s,i)) == NULL) return -1;
       err=PyObject_Cmp(item,o,&not_equal) == -1;
       Py_DECREF(item);
       if(err) return -1;
@@ -851,11 +880,11 @@
   PyObject *item;
 
   if(! o || ! s) return Py_ReturnNullError(), -1;
-  Py_TRY((l=PySequence_Length(s)) != -1),-1;
+  if((l=PySequence_Length(s)) == -1) return -1;
 
   for(i=0; i < l; i++)
     {
-      Py_TRY(item=PySequence_GetItem(s,i)),-1;
+      if((item=PySequence_GetItem(s,i)) == NULL) return -1;
       err=PyObject_Cmp(item,o,&not_equal) == -1;
       Py_DECREF(item);
       if(err) return -1;
@@ -869,15 +898,15 @@
   PyObject *s;
   PyObject *o;
 {
-  int l, i, n=0, not_equal, err;
+  int l, i, not_equal, err;
   PyObject *item;
 
   if(! s || ! o) return Py_ReturnNullError(), -1;
-  Py_TRY((l=PySequence_Length(s)) != -1),-1;
+  if((l=PySequence_Length(s)) == -1) return -1;
 
   for(i=0; i < l; i++)
     {
-      Py_TRY(item=PySequence_GetItem(s,i)),-1;
+      if((item=PySequence_GetItem(s,i)) == NULL) return -1;
       err=PyObject_Cmp(item,o,&not_equal) == -1;
       Py_DECREF(item);
       if(err) return -1;
