From c384f01244c37312c87867fddf06febe4a3e1c44 Mon Sep 17 00:00:00 2001
From: Robert Bradshaw <robertwb@gmail.com>
Date: Sat, 22 Feb 2014 17:07:59 -0800
Subject: [PATCH] Restore some over-eager 3.1 removals.

---
 Cython/Compiler/ExprNodes.py     |  2 +-
 Cython/Compiler/Main.py          |  4 ++--
 Cython/Utility/Buffer.c          |  3 ---
 Cython/Utility/Builtins.c        |  4 ++++
 Cython/Utility/CythonFunction.c  |  4 ++++
 Cython/Utility/ModuleSetupCode.c | 14 ++++++++------
 Cython/Utility/ObjectHandling.c  |  4 ++--
 Cython/Utility/StringTools.c     |  7 ++++++-
 8 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 4be10d9d5..646e4b98d 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -3995,7 +3995,7 @@ class SliceIndexNode(ExprNode):
                     TempitaUtilityCode.load_cached("SliceTupleAndList", "ObjectHandling.c"))
                 cfunc = '__Pyx_PyTuple_GetSlice'
             else:
-                cfunc = '__Pyx_PySequence_GetSlice'
+                cfunc = 'PySequence_GetSlice'
             code.putln(
                 "%s = %s(%s, %s, %s); %s" % (
                     result,
diff --git a/Cython/Compiler/Main.py b/Cython/Compiler/Main.py
index c53a6e5d3..9e25fd6e6 100644
--- a/Cython/Compiler/Main.py
+++ b/Cython/Compiler/Main.py
@@ -3,8 +3,8 @@
 #
 
 import os, sys, re, codecs
-if sys.version_info[:2] < (2, 6):
-    sys.stderr.write("Sorry, Cython requires Python 2.6 or later\n")
+if sys.version_info[:2] < (2, 6) or (3, 0) <= sys.version_info[:2] < (3, 2):
+    sys.stderr.write("Sorry, Cython requires Python 2.6+ or 3.2+\n")
     sys.exit(1)
 
 import Errors
diff --git a/Cython/Utility/Buffer.c b/Cython/Utility/Buffer.c
index 41e20dbd3..ad8ce0daa 100644
--- a/Cython/Utility/Buffer.c
+++ b/Cython/Utility/Buffer.c
@@ -134,9 +134,6 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
       {{endif}}
     {{endfor}}
 
-    goto nofail;
-
-nofail:
     Py_DECREF(obj);
     view->obj = NULL;
 }
diff --git a/Cython/Utility/Builtins.c b/Cython/Utility/Builtins.c
index 0b815b61a..166240a3a 100644
--- a/Cython/Utility/Builtins.c
+++ b/Cython/Utility/Builtins.c
@@ -130,7 +130,11 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals)
                 "code object passed to exec() may not contain free variables");
             goto bad;
         }
+        #if PY_VERSION_HEX < 0x030200B1
+        result = PyEval_EvalCode((PyCodeObject *)o, globals, locals);
+        #else
         result = PyEval_EvalCode(o, globals, locals);
+        #endif
     } else {
         PyCompilerFlags cf;
         cf.cf_flags = 0;
diff --git a/Cython/Utility/CythonFunction.c b/Cython/Utility/CythonFunction.c
index 80044d318..2d6d0b5ea 100644
--- a/Cython/Utility/CythonFunction.c
+++ b/Cython/Utility/CythonFunction.c
@@ -1147,7 +1147,11 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
     }
     if (PyObject_TypeCheck(method, methoddescr_type)) { /* cdef classes */
         PyMethodDescrObject *descr = (PyMethodDescrObject *)method;
+        #if PY_VERSION_HEX < 0x03020000
+        PyTypeObject *d_type = descr->d_type;
+        #else
         PyTypeObject *d_type = descr->d_common.d_type;
+        #endif
         return PyDescr_NewClassMethod(d_type, descr->d_method);
     }
 #endif
diff --git a/Cython/Utility/ModuleSetupCode.c b/Cython/Utility/ModuleSetupCode.c
index cca3084c7..031c6aa0b 100644
--- a/Cython/Utility/ModuleSetupCode.c
+++ b/Cython/Utility/ModuleSetupCode.c
@@ -157,12 +157,14 @@
   #define PyBoolObject                 PyLongObject
 #endif
 
-#define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
-#define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
-
-#define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
-#define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
-#define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)
+#if PY_VERSION_HEX < 0x030200A4
+  typedef long Py_hash_t;
+  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
+  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
+#else
+  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
+  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
+#endif
 
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
diff --git a/Cython/Utility/ObjectHandling.c b/Cython/Utility/ObjectHandling.c
index 38b78e56c..3df8e2994 100644
--- a/Cython/Utility/ObjectHandling.c
+++ b/Cython/Utility/ObjectHandling.c
@@ -158,7 +158,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject* iterator, PyObject*
     if (likely(next))
         return next;
 #if CYTHON_COMPILING_IN_CPYTHON
-#if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION < 3 && PY_VERSION_HEX >= 0x02070000)
+#if PY_VERSION_HEX >= 0x02070000
     if (unlikely(iternext == &_PyObject_NextNotImplemented))
         return NULL;
 #endif
@@ -1029,7 +1029,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
 /////////////// PyObjectLookupSpecial.proto ///////////////
 //@requires: PyObjectGetAttrStr
 
-#if CYTHON_COMPILING_IN_CPYTHON && (PY_MAJOR_VERSION < 3 && PY_VERSION_HEX >= 0x02070000)
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
 // looks like calling _PyType_Lookup() isn't safe in Py<=2.6/3.1
 static CYTHON_INLINE PyObject* __Pyx_PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name) {
     PyObject *res;
diff --git a/Cython/Utility/StringTools.c b/Cython/Utility/StringTools.c
index 1504ea533..2485d2824 100644
--- a/Cython/Utility/StringTools.c
+++ b/Cython/Utility/StringTools.c
@@ -515,7 +515,12 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
 // Py_UNICODE_ISTITLE() doesn't match unicode.istitle() as the latter
 // additionally allows character that comply with Py_UNICODE_ISUPPER()
 
-static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UCS4 uchar) {
+#if PY_VERSION_HEX < 0x030200A2
+static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UNICODE uchar)
+#else
+static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UCS4 uchar)
+#endif
+{
     return Py_UNICODE_ISTITLE(uchar) || Py_UNICODE_ISUPPER(uchar);
 }
 
-- 
2.30.9