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