FFI: Add support for calling C functions.

This commit is contained in:
Mike Pall
2011-01-06 23:30:04 +01:00
parent 97875c4fa9
commit fb0a18ca0b
11 changed files with 617 additions and 24 deletions

View File

@@ -35,6 +35,9 @@ enum {
CT_KW /* Keyword. */
};
LJ_STATIC_ASSERT(((int)CT_PTR & (int)CT_ARRAY) == CT_PTR);
LJ_STATIC_ASSERT(((int)CT_STRUCT & (int)CT_ARRAY) == CT_STRUCT);
/*
** ---------- info ------------
** |type flags... A cid | size | sib | next | name |
@@ -193,9 +196,8 @@ typedef struct CTState {
(((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, 0))
#define ctype_isbool(info) \
(((info) & (CTMASK_NUM|CTF_BOOL)) == CTINFO(CT_NUM, CTF_BOOL))
#define ctype_isconstchar(ct) \
(((ct)->info & (CTMASK_NUM|CTF_CONST|CTF_BOOL|CTF_FP)) == \
CTINFO(CT_NUM, CTF_CONST) && (ct)->size == 1)
#define ctype_isfp(info) \
(((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, CTF_FP))
#define ctype_ispointer(info) \
((ctype_type(info) >> 1) == (CT_PTR >> 1)) /* Pointer or array. */
@@ -204,8 +206,6 @@ typedef struct CTState {
#define ctype_isrefarray(info) \
(((info) & (CTMASK_NUM|CTF_VECTOR|CTF_COMPLEX)) == CTINFO(CT_ARRAY, 0))
#define ctype_isvalarray(info) \
(ctype_isarray(info) && (info & (CTF_VECTOR|CTF_COMPLEX)))
#define ctype_isvector(info) \
(((info) & (CTMASK_NUM|CTF_VECTOR)) == CTINFO(CT_ARRAY, CTF_VECTOR))
#define ctype_iscomplex(info) \
@@ -216,16 +216,11 @@ typedef struct CTState {
CTINFO(CT_STRUCT, CTF_VLA)) /* VL array or VL struct. */
#define ctype_isvlarray(info) \
(((info) & (CTMASK_NUM|CTF_VLA)) == CTINFO(CT_ARRAY, CTF_VLA))
#define ctype_isvlstruct(info) \
(((info) & (CTMASK_NUM|CTF_VLA)) == CTINFO(CT_STRUCT, CTF_VLA))
#define ctype_isxattrib(info, at) \
(((info) & (CTMASK_NUM|CTATTRIB(CTMASK_ATTRIB))) == \
CTINFO(CT_ATTRIB, CTATTRIB(at)))
LJ_STATIC_ASSERT(((int)CT_PTR & (int)CT_ARRAY) == CT_PTR);
LJ_STATIC_ASSERT(((int)CT_STRUCT & (int)CT_ARRAY) == CT_STRUCT);
/* Target-dependent sizes and alignments. */
#if LJ_64
#define CTSIZE_PTR 8