From 243603611b9a43181c5e786182db5181a9f7af1d Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sat, 19 Jul 2014 20:40:08 -0500
Subject: [PATCH] Get the cffi branch closer to working on Py3

---
 pyopencl/__init__.py |  8 ++++----
 pyopencl/_cffi.py    |  2 +-
 pyopencl/cache.py    |  8 ++++++++
 pyopencl/cffi_cl.py  | 28 +++++++++++++++++++++++-----
 setup.py             |  2 --
 5 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index dd5283fd..fc22b8da 100644
--- a/pyopencl/__init__.py
+++ b/pyopencl/__init__.py
@@ -219,7 +219,7 @@ class Program(object):
     def _build_and_catch_errors(self, build_func, options, source=None):
         try:
             return build_func()
-        except _cl.RuntimeError, e:
+        except _cl.RuntimeError as e:
             what = e.what
             if options:
                 what = what + "\n(options: %s)" % " ".join(options)
@@ -418,7 +418,7 @@ def _add_functionality():
         err = None
         try:
             self._build(options=options, devices=devices)
-        except Error, e:
+        except Error as e:
             what = e.what + "\n\n" + (75*"="+"\n").join(
                     "Build on %s:\n\n%s" % (dev, log)
                     for dev, log in self._get_build_logs())
@@ -537,7 +537,7 @@ def _add_functionality():
                         self.set_arg(i, pack(arg_type_char, arg))
                     else:
                         self.set_arg(i, arg)
-        except LogicError, e:
+        except LogicError as e:
             if i is not None:
                 advice = ""
                 from pyopencl.array import Array
@@ -742,7 +742,7 @@ def create_some_context(interactive=None, answers=None):
 
     def cc_print(s):
         if interactive:
-            print s
+            print(s)
 
     def get_input(prompt):
         if answers:
diff --git a/pyopencl/_cffi.py b/pyopencl/_cffi.py
index e58364ad..e48ad1ae 100644
--- a/pyopencl/_cffi.py
+++ b/pyopencl/_cffi.py
@@ -137,7 +137,7 @@ def _get_wrapcl_so_names():
         yield os.path.join(current_directory, "_wrapcl" + ext)
 
     from distutils.sysconfig import get_config_var
-    yield os.path.join(current_directory, "_wrapcl" + get_config_var('SO'))
+    yield os.path.join(current_directory, "_wrapcl" + get_config_var('EXT_SUFFIX'))
 
 
 def _import_library():
diff --git a/pyopencl/cache.py b/pyopencl/cache.py
index 9a6a2cf6..594b9e92 100644
--- a/pyopencl/cache.py
+++ b/pyopencl/cache.py
@@ -470,6 +470,14 @@ def _create_built_program_from_source_cached(ctx, src, options, devices, cache_d
 
 def create_built_program_from_source_cached(ctx, src, options=[], devices=None,
         cache_dir=None):
+    # FIXME REMOVE
+    if cache_dir is not False:
+        prg, already_built = _create_built_program_from_source_cached(
+                ctx, src, options, devices, cache_dir)
+    else:
+        prg = _cl._Program(ctx, src)
+        already_built = False
+    # FIXME END REMOVE
     try:
         if cache_dir is not False:
             prg, already_built = _create_built_program_from_source_cached(
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 583f6b92..b3a77f3c 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -99,6 +99,9 @@ class _CArrays(_CArray):
 
 def _generic_info_to_python(info):
     type_ = _ffi.string(info.type)
+    if sys.version_info >= (3,):
+        type_ = type_.decode()
+
     value = _ffi.cast(type_, info.value)
 
     if info.opaque_class != _lib.CLASS_NONE:
@@ -128,12 +131,22 @@ def _generic_info_to_python(info):
             return ci(value)
     if type_ == 'char*':
         ret = _ffi.string(value)
+        if sys.version_info >= (3,):
+            ret = ret.decode()
     elif type_.startswith('char*['):
         ret = map(_ffi.string, value)
+        if sys.version_info >= (3,):
+            ret = [s.decode() for s in ret]
         _lib.pyopencl_free_pointer_array(info.value, len(value))
     elif type_.endswith(']'):
         if type_.startswith('char['):
-            ret = ''.join(a[0] for a in value)
+            # This is usually a CL binary, which may contain NUL characters
+            # that should be preserved.
+            if sys.version_info < (3,):
+                ret = ''.join(a[0] for a in value)
+            else:
+                ret = bytes(_ffi.buffer(value))
+
         elif type_.startswith('generic_info['):
             ret = list(map(_generic_info_to_python, value))
         elif type_.startswith('cl_image_format['):
@@ -257,14 +270,19 @@ class channel_type(_NoInit):
 @_ffi.callback('void(const char*, const char* name, long value)')
 def _constant_callback(type_, name, value):
     s_type = _ffi.string(type_)
+    s_name = _ffi.string(name)
+
+    if sys.version_info >= (3,):
+        s_type = s_type.decode()
+        s_name = s_name.decode()
+
     _constants.setdefault(s_type, {})
-    _constants[s_type][_ffi.string(name)] = value
+    _constants[s_type][s_name] = value
+
 _lib.populate_constants(_constant_callback)
 
 for type_, d in _constants.iteritems():
-    if sys.version_info >= (3,):
-        type_ = type_.decode()
-    locals()[type_] = type(type_, (_NoInit,), d)
+    locals()[type_] = x = type(type_, (_NoInit,), d)
 
 # }}}
 
diff --git a/setup.py b/setup.py
index a6a220a6..763d5a2c 100644
--- a/setup.py
+++ b/setup.py
@@ -203,8 +203,6 @@ def main():
                 'Programming Language :: C++',
                 'Programming Language :: Python',
                 'Programming Language :: Python :: 2',
-                'Programming Language :: Python :: 2.4',
-                'Programming Language :: Python :: 2.5',
                 'Programming Language :: Python :: 2.6',
                 'Programming Language :: Python :: 2.7',
                 'Programming Language :: Python :: 3',
-- 
GitLab