diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 594bacd9660e4091ac2fe29c703e33b2ee0aaba1..1393b0e8cff954e90efced39b72f2e37b732c604 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -42,7 +42,7 @@ error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *n
 error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices);
 error *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties);
 error *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf);
-error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src);
+error *_create_program_with_source(void **ptr_program, void *ptr_context, const char *src);
 error *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries, size_t *binary_sizes);
 error *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices);
 error *program__kind(void *ptr_program, int *kind);
@@ -57,7 +57,8 @@ error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name);
 error *kernel__set_arg_null(void *ptr_kernel, cl_uint arg_index);
 error *kernel__set_arg_mem(void *ptr_kernel, cl_uint arg_index, void *ptr_mem);
 error *kernel__set_arg_sampler(void *ptr_kernel, cl_uint arg_index, void *ptr_sampler);
-error *kernel__set_arg_buf(void *ptr_kernel, cl_uint arg_index, void *buffer, size_t size);
+error *kernel__set_arg_buf(void *ptr_kernel, cl_uint arg_index,
+                           const void *buffer, size_t size);
 
 error *kernel__get_work_group_info(void *ptr_kernel, cl_kernel_work_group_info param, void *ptr_device, generic_info *out);
 
@@ -80,7 +81,7 @@ error *_enqueue_marker(void **ptr_event, void *ptr_command_queue);
 error *_enqueue_barrier(void *ptr_command_queue);
 error *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_mem, void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking);
 error *_enqueue_copy_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_src, void *ptr_dst, ptrdiff_t byte_count, size_t src_offset, size_t dst_offset, void **wait_for, uint32_t num_wait_for);
-error *_enqueue_write_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking);
+error *_enqueue_write_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, const void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking);
 error *_enqueue_read_image(void **ptr_event, void *ptr_command_queue, void *ptr_mem, size_t *origin, size_t *region, void *buffer, size_t size, size_t row_pitch, size_t slice_pitch, void **wait_for, uint32_t num_wait_for, int is_blocking);
 void populate_constants(void(*add)(const char*, const char*, long value));
 
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 19a847241774fe995d9f7fdf3ac6498bb7ea1656..c82a4ae65e5591ddf516ce3a21bed3c816fdddde 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -471,9 +471,11 @@ def _c_buffer_from_obj(obj, writable=False):
                     s_array.nbytes,
                     s_array)
         elif isinstance(obj, bytes):
-            # There sould be better ways to pass arguments
-            p = _ffi.new('char[]', obj)
-            return (_ffi.cast('void *', p), len(obj), p)
+            if writable:
+                # There sould be better ways to pass arguments
+                p = _ffi.new('char[]', obj)
+                return (_ffi.cast('void *', p), len(obj), p)
+            return (obj, len(obj), None)
         else:
             raise LogicError("", status_code.INVALID_VALUE,
                     "PyOpencl on PyPy only accepts numpy arrays "
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 74c47cb8990edf674743a97f7f901c3ce10294b6..ba0cf69e0cf766a8766102246361a59ff139b081 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -2418,10 +2418,9 @@ namespace pyopencl
   inline
   program *create_program_with_source(
       context &ctx,
-      std::string const &src)
+      const char *string)
   {
-    const char *string = src.c_str();
-    size_t length = src.size();
+    size_t length = strlen(string);
 
     cl_int status_code;
     PYOPENCL_PRINT_CALL_TRACE("clCreateProgramWithSource");
@@ -2571,7 +2570,7 @@ namespace pyopencl
           clSetKernelArg, (m_kernel, arg_index, sizeof(cl_sampler), &s));
     }
 
-    void set_arg_buf(cl_uint arg_index, void *buffer, size_t size)
+    void set_arg_buf(cl_uint arg_index, const void *buffer, size_t size)
     {
       PYOPENCL_CALL_GUARDED(
           clSetKernelArg, (m_kernel, arg_index, size, buffer));
@@ -2774,7 +2773,7 @@ namespace pyopencl
   event *enqueue_write_buffer(
                               command_queue &cq,
                               memory_object_holder &mem,
-                              void *buffer,
+                              const void *buffer,
                               size_t size,
                               size_t device_offset,
                               void **wait_for, uint32_t num_wait_for,
@@ -3000,13 +2999,14 @@ void pyopencl_free_pointer_array(void **p, uint32_t size)
 
 // {{{ program
 
-::error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src)
+::error *_create_program_with_source(void **ptr_program, void *ptr_context,
+                                     const char *src)
 {
   pyopencl::context *ctx = static_cast<pyopencl::context*>(ptr_context);
 
   BEGIN_C_HANDLE_ERROR
 
-                 *ptr_program = create_program_with_source(*ctx, src);
+  *ptr_program = create_program_with_source(*ctx, src);
 
   END_C_HANDLE_ERROR
 
@@ -3166,7 +3166,7 @@ void pyopencl_free_pointer_array(void **p, uint32_t size)
 }
 
 ::error *kernel__set_arg_buf(
-    void *ptr_kernel, cl_uint arg_index, void *buffer, size_t size)
+    void *ptr_kernel, cl_uint arg_index, const void *buffer, size_t size)
 {
   BEGIN_C_HANDLE_ERROR
 
@@ -3356,7 +3356,7 @@ error *_create_image_3d(
 
 ::error *_enqueue_write_buffer(
     void **ptr_event, void *ptr_command_queue, void *ptr_mem,
-    void *buffer, size_t size, size_t device_offset, void **wait_for,
+    const void *buffer, size_t size, size_t device_offset, void **wait_for,
     uint32_t num_wait_for, int is_blocking)
 {
   BEGIN_C_HANDLE_ERROR