diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index fbd2a0cc6ba3e69399210bccb7a004336e26f4ce..24a1ac5ceb4573d8dd0042696da731adc230422f 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -150,12 +150,21 @@ def _generic_info_to_python(info): _lib.CLASS_COMMAND_QUEUE: CommandQueue }[info.opaque_class] + if klass is _Program: + def create_inst(val): + from pyopencl import Program + return Program(_Program._create(val)) + + else: + create_inst = klass._create + if type_.endswith(']'): - ret = list(map(klass._create, value)) + ret = list(map(create_inst, value)) _lib.free_pointer(info.value) return ret else: - return klass._create(value) + return create_inst(value) + if type_ == 'char*': ret = _ffi_pystr(value) elif type_.startswith('char*['): diff --git a/test/test_wrapper.py b/test/test_wrapper.py index aef813a965699dca473744d4fd5d50544718107a..1f13b9cd9e12bd4497a33a14b956c4b86ed44c5b 100644 --- a/test/test_wrapper.py +++ b/test/test_wrapper.py @@ -764,6 +764,23 @@ def test_buffer_get_host_array(ctx_factory): pass +def test_program_valued_get_info(ctx_factory): + ctx = ctx_factory() + + prg = cl.Program(ctx, """ + __kernel void + reverse(__global float *out) + { + out[get_global_id(0)] *= 2; + } + """).build() + + knl = prg.reverse + + assert knl.program == prg + knl.program.binaries[0] + + if __name__ == "__main__": # make sure that import failures get reported, instead of skipping the tests. import pyopencl # noqa