mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-15 05:43:19 -08:00
Implemented SI:FOREIGN-DATA-P and used it to optimize (and inline) (TYPEP x 'SI:FOREIGN-DATA)
This commit is contained in:
parent
6a57070b93
commit
905a0bd4d8
8 changed files with 21 additions and 1 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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"},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue