Implemented SI:FOREIGN-DATA-P and used it to optimize (and inline) (TYPEP x 'SI:FOREIGN-DATA)

This commit is contained in:
Juan Jose Garcia Ripoll 2010-04-23 20:07:48 +02:00
parent 6a57070b93
commit 905a0bd4d8
8 changed files with 21 additions and 1 deletions

View file

@ -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)
{

View file

@ -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},

View file

@ -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"},

View file

@ -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)

View file

@ -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);

View file

@ -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

View file

@ -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)

View file

@ -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)")