From ab50a55fb183d750b3fa356e32bf112c563bed17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Fri, 31 Jul 2015 14:19:35 +0200 Subject: [PATCH] cmp: ffi: cast `ecl_make_foreign_data' 3rd argument to *(void **) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/cmp/cmpcbk.lsp | 2 +- src/h/external.h | 2 +- src/lsp/ffi.lsp | 4 ++-- src/new-cmp/cmpc-cbk.lsp | 2 +- src/new-cmp/cmpc-ffi.lsp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmp/cmpcbk.lsp b/src/cmp/cmpcbk.lsp index 70deaf98f..72873de2e 100644 --- a/src/cmp/cmpcbk.lsp +++ b/src/cmp/cmpcbk.lsp @@ -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))))) ))) diff --git a/src/h/external.h b/src/h/external.h index 1864ac258..a44874900 100755 --- a/src/h/external.h +++ b/src/h/external.h @@ -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); diff --git a/src/lsp/ffi.lsp b/src/lsp/ffi.lsp index 9dfd6e3ca..ad34d7d77 100644 --- a/src/lsp/ffi.lsp +++ b/src/lsp/ffi.lsp @@ -319,7 +319,7 @@ (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)) @@ -548,7 +548,7 @@ `(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 diff --git a/src/new-cmp/cmpc-cbk.lsp b/src/new-cmp/cmpc-cbk.lsp index 262444ee2..e4c2f001a 100644 --- a/src/new-cmp/cmpc-cbk.lsp +++ b/src/new-cmp/cmpc-cbk.lsp @@ -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))))) ))) diff --git a/src/new-cmp/cmpc-ffi.lsp b/src/new-cmp/cmpc-ffi.lsp index 7d3207420..ba1ffa228 100644 --- a/src/new-cmp/cmpc-ffi.lsp +++ b/src/new-cmp/cmpc-ffi.lsp @@ -216,7 +216,7 @@ ((: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)