From 35123fa2e020dac7be1b62324507c4ca8cec6b49 Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Sat, 14 Jun 2014 15:21:52 -0400
Subject: [PATCH] make cffi_cl populate_constants less magical. Modifying the
 return value of locals() is not allowed by the standard.

---
 pyopencl/cffi_cl.py | 142 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 129 insertions(+), 13 deletions(-)

diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index c3e78743..e62d7829 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -220,7 +220,6 @@ class _NoInit(object):
 
 
 # {{{ constant classes
-# These will be overwritten below and exist to placate pyflakes.
 
 class status_code(_NoInit):
     pass
@@ -249,25 +248,142 @@ class channel_order(_NoInit):
 class channel_type(_NoInit):
     pass
 
-# }}}
 
+class program_kind(_NoInit):
+    pass
 
-@_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()
+class platform_info(_NoInit):
+    pass
 
-    _constants.setdefault(s_type, {})
-    _constants[s_type][s_name] = value
 
+class device_info(_NoInit):
+    pass
+
+
+class device_fp_config(_NoInit):
+    pass
+
+
+class device_mem_cache_type(_NoInit):
+    pass
+
+
+class device_local_mem_type(_NoInit):
+    pass
+
+
+class device_exec_capabilities(_NoInit):
+    pass
+
+
+class command_queue_properties(_NoInit):
+    pass
+
+
+class context_info(_NoInit):
+    pass
+
+
+class gl_context_info(_NoInit):
+    pass
+
+
+class command_queue_info(_NoInit):
+    pass
+
+
+class mem_info(_NoInit):
+    pass
+
+
+class image_info(_NoInit):
+    pass
+
+
+class addressing_mode(_NoInit):
+    pass
+
+
+class filter_mode(_NoInit):
+    pass
+
+
+class sampler_info(_NoInit):
+    pass
+
+
+class map_flags(_NoInit):
+    pass
+
+
+class program_info(_NoInit):
+    pass
+
+
+class program_build_info(_NoInit):
+    pass
+
+
+class program_binary_type(_NoInit):
+    pass
+
+
+class kernel_info(_NoInit):
+    pass
+
+
+class kernel_arg_info(_NoInit):
+    pass
+
+
+class kernel_work_group_info(_NoInit):
+    pass
+
+
+class event_info(_NoInit):
+    pass
+
+
+class command_type(_NoInit):
+    pass
+
+
+class command_execution_status(_NoInit):
+    pass
+
+
+class profiling_info(_NoInit):
+    pass
+
+
+class affinity_domain_ext(_NoInit):
+    pass
+
+
+class device_affinity_domain(_NoInit):
+    pass
+
+
+class gl_object_type(_NoInit):
+    pass
+
+
+class gl_texture_info(_NoInit):
+    pass
+
+# }}}
+
+_locals = locals()
+
+@_ffi.callback('void(const char*, const char* name, long value)')
+def _constant_callback(type_, name, value):
+    setattr(_locals[_ffi.string(type_).decode()],
+            _ffi.string(name).decode(), value)
 _lib.populate_constants(_constant_callback)
 
-for type_, d in _constants.iteritems():
-    locals()[type_] = x = type(type_, (_NoInit,), d)
+del _locals
+del _constant_callback
 
 # }}}
 
-- 
GitLab