From 7888a507b0be0509d5966493c5fa0b929b6f41c2 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Sun, 5 Jul 2015 13:45:49 -0500 Subject: [PATCH] Do a better job psychoanalyzing POCL's calling convention --- pyopencl/__init__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py index 1fbba357..45e14ed5 100644 --- a/pyopencl/__init__.py +++ b/pyopencl/__init__.py @@ -789,6 +789,8 @@ def _add_functionality(): else: warn_about_arg_count_bug = True + fp_arg_count = 0 + # }}} cl_arg_idx = 0 @@ -832,7 +834,9 @@ def _add_functionality(): else: raise TypeError("unexpected complex type: %s" % arg_dtype) - if work_around_arg_count_bug and arg_dtype == np.complex128: + if (work_around_arg_count_bug + and arg_dtype == np.complex128 + and fp_arg_count + 2 <= 8): gen( "buf = pack('{arg_char}', {arg_var}.real)" .format(arg_char=arg_char, arg_var=arg_var)) @@ -851,6 +855,8 @@ def _add_functionality(): self._generate_buffer_arg_setter(gen, cl_arg_idx, "buf") cl_arg_idx += 1 + fp_arg_count += 2 + elif arg_dtype.char in "IL" and _CPY26: # Prevent SystemError: ../Objects/longobject.c:336: bad # argument to internal function @@ -862,6 +868,9 @@ def _add_functionality(): cl_arg_idx += 1 else: + if arg_dtype.kind == "f": + fp_arg_count += 1 + arg_char = arg_dtype.char arg_char = _type_char_map.get(arg_char, arg_char) gen( -- GitLab