From e42eb58d7c4cf1776b83dd2d38585518fc20853d Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Mon, 16 Jun 2014 06:17:43 -0400
Subject: [PATCH] more implicit cffi cast

---
 pyopencl/cffi_cl.py | 33 ++++++++++++---------------------
 1 file changed, 12 insertions(+), 21 deletions(-)

diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 9138b46e..f835cfe2 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -160,7 +160,7 @@ def _generic_info_to_python(info):
 def _clobj_list(objs):
     if objs is None:
         return _ffi.NULL, 0
-    return _ffi.new('clobj_t[]', [ev.ptr for ev in objs]), len(objs)
+    return [ev.ptr for ev in objs], len(objs)
 
 
 # {{{ common base class
@@ -542,11 +542,11 @@ class Context(_Common):
                 raise RuntimeError("Context", status_code.INVALID_VALUE,
                                    "one of 'devices' or 'dev_type' "
                                    "must be None")
-            ptr_devices = _ffi.new('clobj_t[]',
-                                   [device.ptr for device in devices])
+            ptr_devices, num_devices = _clobj_list(devices)
             ptr_ctx = _ffi.new('clobj_t*')
-            _handle_error(_lib.create_context(
-                ptr_ctx, c_props, len(ptr_devices), ptr_devices))
+            # TODO parameter order? (for clobj_list)
+            _handle_error(_lib.create_context(ptr_ctx, c_props,
+                                              num_devices, ptr_devices))
 
         else:  # TODO: from dev_type
             raise NotImplementedError()
@@ -749,13 +749,14 @@ class _Program(_Common):
                                "device and binary counts don't match")
 
         ptr_program = _ffi.new('clobj_t*')
-        ptr_devices = [device.ptr for device in devices]
+        ptr_devices, num_devices = _clobj_list(devices)
         ptr_binaries = [_ffi.new('unsigned char[]', binary)
                         for binary in binaries]
         binary_sizes = [len(b) for b in binaries]
 
+        # TODO parameter order? (for clobj_list)
         _handle_error(_lib.create_program_with_binary(
-            ptr_program, context.ptr, len(ptr_devices), ptr_devices,
+            ptr_program, context.ptr, num_devices, ptr_devices,
             ptr_binaries, binary_sizes))
 
         self.ptr = ptr_program[0]
@@ -768,15 +769,8 @@ class _Program(_Common):
     def _build(self, options=None, devices=None):
         if options is None:
             options = ""
-        #if devices is None: devices = self.get_info(0x1163)
-        if devices is None:
-            num_devices = 0
-            ptr_devices = _ffi.NULL
-        else:
-            ptr_devices = _ffi.new('clobj_t[]',
-                                   [device.ptr for device in devices])
-            num_devices = len(devices)
-
+        # TODO? reverse parameter order
+        ptr_devices, num_devices = _clobj_list(devices)
         _handle_error(_lib.program__build(self.ptr, _to_cstring(options),
                                           num_devices, ptr_devices))
 
@@ -916,17 +910,14 @@ def enqueue_nd_range_kernel(queue, kernel, global_work_size, local_work_size,
         raise NotImplementedError("global_work_offset")
 
     c_global_work_offset = _ffi.NULL
-    c_global_work_size = _ffi.new('const size_t[]', global_work_size)
     if local_work_size is None:
-        c_local_work_size = _ffi.NULL
-    else:
-        c_local_work_size = _ffi.new('const size_t[]', local_work_size)
+        local_work_size = _ffi.NULL
 
     ptr_event = _ffi.new('clobj_t*')
     c_wait_for, num_wait_for = _clobj_list(wait_for)
     _handle_error(_lib.enqueue_nd_range_kernel(
         ptr_event, queue.ptr, kernel.ptr, work_dim, c_global_work_offset,
-        c_global_work_size, c_local_work_size, c_wait_for, num_wait_for))
+        global_work_size, local_work_size, c_wait_for, num_wait_for))
     return Event._create(ptr_event[0])
 
 # }}}
-- 
GitLab