diff --git a/src/c/ffi.d b/src/c/ffi.d index ba6d3d42c..364357ff1 100644 --- a/src/c/ffi.d +++ b/src/c/ffi.d @@ -269,6 +269,12 @@ si_make_foreign_data_from_array(cl_object array) @(return ecl_make_foreign_data(tag, 0, array->array.self.bc)); } +cl_object +si_foreign_data_p(cl_object f) +{ + @(return (ECL_FOREIGN_DATA_P(f)? Ct : Cnil)) +} + cl_object si_foreign_data_address(cl_object f) { diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index bbcf2266a..b98dc9940 100755 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -1400,6 +1400,7 @@ cl_symbols[] = { {SYS_ "FIND-FOREIGN-SYMBOL", SI_ORDINARY, si_find_foreign_symbol, 4, OBJNULL}, {SYS_ "FOREIGN-DATA", SI_ORDINARY, NULL, -1, OBJNULL}, {SYS_ "FOREIGN-DATA-ADDRESS", SI_ORDINARY, si_foreign_data_address, 1, OBJNULL}, +{SYS_ "FOREIGN-DATA-P", SI_ORDINARY, si_foreign_data_p, 1, OBJNULL}, {SYS_ "FOREIGN-DATA-POINTER", SI_ORDINARY, si_foreign_data_pointer, 4, OBJNULL}, {SYS_ "FOREIGN-DATA-RECAST", SI_ORDINARY, si_foreign_data_recast, 3, OBJNULL}, {SYS_ "FOREIGN-DATA-REF", SI_ORDINARY, si_foreign_data_ref, 4, OBJNULL}, diff --git a/src/c/symbols_list2.h b/src/c/symbols_list2.h index 24f1954fd..f6acef51c 100755 --- a/src/c/symbols_list2.h +++ b/src/c/symbols_list2.h @@ -1400,6 +1400,7 @@ cl_symbols[] = { {SYS_ "FIND-FOREIGN-SYMBOL","si_find_foreign_symbol"}, {SYS_ "FOREIGN-DATA",NULL}, {SYS_ "FOREIGN-DATA-ADDRESS","si_foreign_data_address"}, +{SYS_ "FOREIGN-DATA-P","si_foreign_data_p"}, {SYS_ "FOREIGN-DATA-POINTER","si_foreign_data_pointer"}, {SYS_ "FOREIGN-DATA-RECAST","si_foreign_data_recast"}, {SYS_ "FOREIGN-DATA-REF","si_foreign_data_ref"}, diff --git a/src/cmp/sysfun.lsp b/src/cmp/sysfun.lsp index 36f0c384f..a6ef5c95a 100644 --- a/src/cmp/sysfun.lsp +++ b/src/cmp/sysfun.lsp @@ -400,6 +400,11 @@ (proclaim-function constantp (t) t :predicate t) (proclaim-function si::link-enable (*) t) +;; file ffi.d + +(proclaim-function si:foreign-data-p (t) gen-bool :predicate t) +(def-inline si:foreign-data-p :always (t) :bool "@0;ECL_FOREIGN_DATA_P(#0)") + ;; file file.d (proclaim-function make-synonym-stream (symbol) synonym-stream) diff --git a/src/h/external.h b/src/h/external.h index 365e8e8fd..3614c6da3 100755 --- a/src/h/external.h +++ b/src/h/external.h @@ -590,6 +590,7 @@ extern ECL_API cl_object _ecl_link_call(cl_object sym, cl_objectfn *pLK, cl_obje /* ffi.c */ extern ECL_API cl_object si_allocate_foreign_data(cl_object tag, cl_object size); +extern ECL_API cl_object si_foreign_data_p(cl_object f); extern ECL_API cl_object si_foreign_data_address(cl_object f); extern ECL_API cl_object si_foreign_data_pointer(cl_object f, cl_object ndx, cl_object size, cl_object tag); extern ECL_API cl_object si_foreign_data_ref(cl_object f, cl_object ndx, cl_object size, cl_object tag); diff --git a/src/h/object.h b/src/h/object.h index a3148e4fb..56a4b0282 100644 --- a/src/h/object.h +++ b/src/h/object.h @@ -183,6 +183,7 @@ typedef cl_object (*cl_objectfn_fixed)(); #define ECL_PACKAGEP(x) ((IMMEDIATE(x) == 0) && ((x)->d.t == t_package)) #define ECL_PATHNAMEP(x) ((IMMEDIATE(x) == 0) && ((x)->d.t == t_pathname)) #define ECL_READTABLEP(x) ((IMMEDIATE(x) == 0) && ((x)->d.t == t_readtable)) +#define ECL_FOREIGN_DATA_P(x) ((IMMEDIATE(x) == 0) && ((x)->d.t == t_foreign)) #define HEADER int8_t t, m, padding[2] #define HEADER1(field) int8_t t, m, field, padding diff --git a/src/lsp/predlib.lsp b/src/lsp/predlib.lsp index a42ddb50e..ab7d09ab1 100644 --- a/src/lsp/predlib.lsp +++ b/src/lsp/predlib.lsp @@ -292,6 +292,7 @@ and is not adjustable." (COMPLEX . COMPLEXP) (CONS . CONSP) (FLOAT . FLOATP) + (SI:FOREIGN-DATA . SI:FOREIGN-DATA-P) (FUNCTION . FUNCTIONP) (HASH-TABLE . HASH-TABLE-P) (INTEGER . INTEGERP) diff --git a/src/new-cmp/sysfun.lsp b/src/new-cmp/sysfun.lsp index f338cfa6f..f00bffa1d 100644 --- a/src/new-cmp/sysfun.lsp +++ b/src/new-cmp/sysfun.lsp @@ -1192,7 +1192,7 @@ ;;; (proclaim-function si:pointer (t) unsigned-byte) - +(proclaim-function si:foreign-data-p (t) gen-bool :predicate) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; @@ -1424,6 +1424,10 @@ (def-inline char-int :always (character) :fixnum "#0") +;; file ffi.d + +(def-inline si:foreign-data-p :always (t) :bool "@0;ECL_FOREIGN_DATA_P(#0)") + ;; file file.d (def-inline input-stream-p :always (stream) :bool "ecl_input_stream_p(#0)")