From fd6d963f57cc7d840750b65d50958fb9c47d58cc Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Thu, 5 Jun 2014 18:34:53 -0400
Subject: [PATCH] clobj_from_int_ptr

---
 pyopencl/c_wrapper/wrap_cl_core.h |  3 +-
 pyopencl/cffi_cl.py               |  2 +-
 src/c_wrapper/utils.h             |  7 +++
 src/c_wrapper/wrap_cl.cpp         | 86 +++++++++++++------------------
 4 files changed, 46 insertions(+), 52 deletions(-)

diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 051f6b04..250242ec 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -197,5 +197,4 @@ error *enqueue_map_image(clobj_t *_evt, clobj_t *map, clobj_t _queue,
 intptr_t clobj__int_ptr(clobj_t obj);
 error *clobj__get_info(clobj_t obj, cl_uint param, generic_info *out);
 void clobj__delete(clobj_t obj);
-
-error *_from_int_ptr(clobj_t *ptr_out, intptr_t int_ptr_value, class_t);
+error *clobj__from_int_ptr(clobj_t *out, intptr_t ptr, class_t);
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index bbd064b3..8ad154d2 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -194,7 +194,7 @@ class _Common(object):
     @classmethod
     def from_int_ptr(cls, int_ptr_value):
         ptr = _ffi.new('clobj_t*')
-        _handle_error(_lib._from_int_ptr(
+        _handle_error(_lib.clobj__from_int_ptr(
             ptr, int_ptr_value, getattr(_lib, 'CLASS_%s' % cls._id.upper())))
         return _create_instance(cls, ptr[0])
 
diff --git a/src/c_wrapper/utils.h b/src/c_wrapper/utils.h
index 05245378..f5bd7eff 100644
--- a/src/c_wrapper/utils.h
+++ b/src/c_wrapper/utils.h
@@ -130,6 +130,13 @@ public:
     }
 };
 
+template<typename CLObj>
+static PYOPENCL_INLINE CLObj*
+clobj_from_int_ptr(intptr_t ptr)
+{
+    return new CLObj(reinterpret_cast<typename CLObj::cl_type>(ptr), true);
+}
+
 template<typename T, typename T2>
 PYOPENCL_USE_RESULT static inline pyopencl_buf<typename T::cl_type>
 buf_from_class(const T2 *buf2, size_t len)
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index d95adfdc..042da4df 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -35,49 +35,6 @@ pyopencl_get_ext_fun(cl_platform_id, const char *name, const char *err)
 
 // }}}
 
-// {{{ more odds and ends
-
-#ifdef HAVE_GL
-#define GL_SWITCHCLASS(OPERATION) \
-  case ::CLASS_GL_BUFFER: OPERATION(GL_BUFFER, gl_buffer); break; \
-  case ::CLASS_GL_RENDERBUFFER: OPERATION(GL_RENDERBUFFER, gl_renderbuffer); break;
-#else
-#define GL_SWITCHCLASS(OPERATION) \
-  case ::CLASS_GL_BUFFER: \
-  case ::CLASS_GL_RENDERBUFFER:
-#endif
-
-#define SWITCHCLASS(OPERATION)                                          \
-  switch(class_) {                                                      \
-  case ::CLASS_PLATFORM: OPERATION(PLATFORM, platform); break;          \
-  case ::CLASS_DEVICE: OPERATION(DEVICE, device); break;                \
-  case ::CLASS_KERNEL: OPERATION(KERNEL, kernel); break;                \
-  case ::CLASS_CONTEXT: OPERATION(CONTEXT, context); break;             \
-  case ::CLASS_COMMAND_QUEUE: OPERATION(COMMAND_QUEUE, command_queue); break; \
-  case ::CLASS_BUFFER: OPERATION(BUFFER, buffer); break;                \
-  case ::CLASS_PROGRAM: OPERATION(PROGRAM, program); break;             \
-  case ::CLASS_EVENT: OPERATION(EVENT, event); break;                   \
-  case ::CLASS_IMAGE: OPERATION(IMAGE, image); break; \
-  case ::CLASS_SAMPLER: OPERATION(SAMPLER, sampler); break; \
-  GL_SWITCHCLASS(OPERATION) \
-  default: throw pyopencl::clerror("unknown class", CL_INVALID_VALUE);    \
-  }
-
-#define PYOPENCL_CL_PLATFORM cl_platform_id
-#define PYOPENCL_CL_DEVICE cl_device_id
-#define PYOPENCL_CL_KERNEL cl_kernel
-#define PYOPENCL_CL_CONTEXT cl_context
-#define PYOPENCL_CL_COMMAND_QUEUE cl_command_queue
-#define PYOPENCL_CL_BUFFER cl_mem
-#define PYOPENCL_CL_PROGRAM cl_program
-#define PYOPENCL_CL_EVENT cl_event
-#define PYOPENCL_CL_GL_BUFFER cl_mem
-#define PYOPENCL_CL_GL_RENDERBUFFER cl_mem
-#define PYOPENCL_CL_IMAGE cl_mem
-#define PYOPENCL_CL_SAMPLER cl_sampler
-
-// }}}
-
 namespace pyopencl {
 
 // {{{ platform
@@ -2653,15 +2610,46 @@ clobj__int_ptr(clobj_t obj)
     return obj->intptr();
 }
 
+static inline clobj_t
+_from_int_ptr(intptr_t ptr, class_t class_)
+{
+    switch(class_) {
+    case CLASS_PLATFORM:
+        return clobj_from_int_ptr<platform>(ptr);
+    case CLASS_DEVICE:
+        return clobj_from_int_ptr<device>(ptr);
+    case CLASS_KERNEL:
+        return clobj_from_int_ptr<kernel>(ptr);
+    case CLASS_CONTEXT:
+        return clobj_from_int_ptr<context>(ptr);
+    case CLASS_COMMAND_QUEUE:
+        return clobj_from_int_ptr<command_queue>(ptr);
+    case CLASS_BUFFER:
+        return clobj_from_int_ptr<buffer>(ptr);
+    case CLASS_PROGRAM:
+        return clobj_from_int_ptr<program>(ptr);
+    case CLASS_EVENT:
+        return clobj_from_int_ptr<event>(ptr);
+    case CLASS_IMAGE:
+        return clobj_from_int_ptr<image>(ptr);
+    case CLASS_SAMPLER:
+        return clobj_from_int_ptr<sampler>(ptr);
+#ifdef HAVE_GL
+    case CLASS_GL_BUFFER:
+        return clobj_from_int_ptr<gl_buffer>(ptr);
+    case CLASS_GL_RENDERBUFFER:
+        return clobj_from_int_ptr<gl_renderbuffer>(ptr);
+#endif
+    default:
+        throw pyopencl::clerror("unknown class", CL_INVALID_VALUE);
+  }
+}
+
 error*
-_from_int_ptr(clobj_t *ptr_out, intptr_t int_ptr_value, class_t class_)
+clobj__from_int_ptr(clobj_t *out, intptr_t ptr, class_t class_)
 {
-#define FROM_INT_PTR(CLSU, CLS)                                         \
-    *ptr_out = new CLS((PYOPENCL_CL_##CLSU)int_ptr_value,     \
-                                 /* retain */ true);
-
     return c_handle_error([&] {
-            SWITCHCLASS(FROM_INT_PTR);
+            *out = _from_int_ptr(ptr, class_);
         });
 }
 
-- 
GitLab