diff --git a/pyopencl/invoker.py b/pyopencl/invoker.py
index 7fad942c770eeb2c54df5889e6ec811e8c236b3f..b580c5375e298ff5d5864c52cebd656af42eac89 100644
--- a/pyopencl/invoker.py
+++ b/pyopencl/invoker.py
@@ -59,11 +59,14 @@ del _size_t_char
 def generate_buffer_arg_setter(gen, arg_idx, buf_var):
     from pytools.py_codegen import Indentation
 
-    if _CPY2:
+    if _CPY2 or _PYPY:
         # https://github.com/numpy/numpy/issues/5381
         gen("if isinstance({buf_var}, np.generic):".format(buf_var=buf_var))
         with Indentation(gen):
-            gen("{buf_var} = np.getbuffer({buf_var})".format(buf_var=buf_var))
+            if _PYPY:
+                gen("{buf_var} = np.asarray({buf_var})".format(buf_var=buf_var))
+            else:
+                gen("{buf_var} = np.getbuffer({buf_var})".format(buf_var=buf_var))
 
     gen("""
         self._set_arg_buf({arg_idx}, {buf_var})
@@ -349,7 +352,7 @@ def _generate_enqueue_and_set_args_module(function_name,
 
 
 invoker_cache = WriteOncePersistentDict(
-        "pyopencl-invoker-cache-v4",
+        "pyopencl-invoker-cache-v6",
         key_builder=_NumpyTypesKeyBuilder())