cmp: ffi: cast `ecl_make_foreign_data' 3rd argument to *(void **)
authorDaniel Kochmański <daniel@turtleware.eu>
Fri, 31 Jul 2015 12:19:35 +0000 (14:19 +0200)
committerDaniel Kochmański <daniel@turtleware.eu>
Fri, 31 Jul 2015 12:19:35 +0000 (14:19 +0200)
Some compilers doesn't allow putting function pointers when parameter
type is declared (void *), but it's necessary if we want to use
callbacks. Fixes #99.

Signed-off-by: Daniel Kochmański <daniel@turtleware.eu>
src/cmp/cmpcbk.lsp
src/h/external.h
src/lsp/ffi.lsp
src/new-cmp/cmpc-cbk.lsp
src/new-cmp/cmpc-ffi.lsp

index 70deaf9..72873de 100644 (file)
@@ -41,7 +41,7 @@
          (si::put-sysprop ',name :callback
           (list
           (ffi:c-inline () () :object
-           ,(format nil "ecl_make_foreign_data(@':pointer-void,0,~a)" c-name)
+           ,(format nil "ecl_make_foreign_data(@':pointer-void,0,*(void**)~a)" c-name)
            :one-liner t)))))
       )))
 
index 1864ac2..a448749 100755 (executable)
@@ -657,7 +657,7 @@ extern ECL_API cl_object si_make_dynamic_callback(cl_narg, cl_object fun, cl_obj
 extern ECL_API cl_object si_free_ffi_closure(cl_object closure);
 
 /* Only foreign data types can be coerced to a pointer */
-#define ecl_make_pointer(x) ecl_make_foreign_data(ECL_NIL,0,(x))
+#define ecl_make_pointer(x) ecl_make_foreign_data(ECL_NIL,0,*(void **)(x))
 #define ecl_to_pointer(x) ecl_foreign_data_pointer_safe(x)
 extern ECL_API cl_object ecl_make_foreign_data(cl_object tag, cl_index size, void *data);
 extern ECL_API cl_object ecl_allocate_foreign_data(cl_object tag, cl_index size);
index 9dfd6e3..ad34d7d 100644 (file)
 
 (defun make-pointer (addr type)
   (c-inline (type (size-of-foreign-type type) addr) (:object :unsigned-long :unsigned-long) :object
-            "ecl_make_foreign_data(#0, #1, (void*)#2)"
+            "ecl_make_foreign_data(#0, #1, *(void**)#2)"
             :side-effects t
             :one-liner t))
 
                                `(si::find-foreign-symbol ,c-name ,module ',type ,(size-of-foreign-type type)))
                               (t
                                `(c-inline () () :object
-                                          ,(format nil "ecl_make_foreign_data(@~S, ~A, &~A)"
+                                          ,(format nil "ecl_make_foreign_data(@~S, ~A, *(void **)~A)"
                                                    type (size-of-foreign-type type) c-name)
                                           :side-effects t :one-liner t)))))
       (if can-deref
index 262444e..e4c2f00 100644 (file)
@@ -41,7 +41,7 @@
          (si::put-sysprop ',name :callback
           (list
           (ffi:c-inline () () :object
-           ,(format nil "ecl_make_foreign_data(@':pointer-void,0,~a)" c-name)
+           ,(format nil "ecl_make_foreign_data(@':pointer-void,0,*(void**)~a)" c-name)
            :one-liner t)))))
       )))
 
index 7d32074..ba1ffa2 100644 (file)
            ((:cstring)
             (wt "ecl_cstring_to_base_string_or_nil(" loc ")"))
            ((:pointer-void)
-            (wt "ecl_make_foreign_data(Cnil, 0, " loc ")"))
+            (wt "ecl_make_foreign_data(Cnil, 0, *(void**)" loc ")"))
            (otherwise
             (coercion-error))))
         ((:pointer-void)