diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py index bc4175c25158a1072575c0e8bb445ab323c8dd02..a87fe48deb904a6e6948ec884b5341c13178a635 100644 --- a/pyopencl/__init__.py +++ b/pyopencl/__init__.py @@ -510,6 +510,17 @@ def _add_functionality(): self._arg_type_chars = arg_type_chars + _size_t_char = ({ + 8: 'Q', + 4: 'L', + 2: 'H', + 1: 'B', + })[_cl._ffi.sizeof('size_t')] + _type_char_map = { + 'n': _size_t_char.lower(), + 'N': _size_t_char + } + del _size_t_char def kernel_set_args(self, *args): assert len(args) == self.num_args, ( "length of argument list (%d) and " @@ -524,15 +535,20 @@ def _add_functionality(): for i, arg in enumerate(args): self.set_arg(i, arg) else: - # TODO: #from pyopencl._pvt_struct import pack from struct import pack for i, (arg, arg_type_char) in enumerate( zip(args, arg_type_chars)): - if arg_type_char and arg_type_char != "V": - self.set_arg(i, pack(arg_type_char, arg)) + if not arg_type_char or arg_type_char == "V": + _arg = arg + elif arg_type_char == "F": + _arg = pack('f', arg.real) + pack('f', arg.imag) + elif arg_type_char == "D": + _arg = pack('d', arg.real) + pack('d', arg.imag) else: - self.set_arg(i, arg) + _arg = pack(_type_char_map.get(arg_type_char, + arg_type_char), arg) + self.set_arg(i, _arg) except LogicError, e: if i is not None: advice = ""