make FFI=1 do something
This commit is contained in:
parent
d186294e28
commit
a938f32631
38
src/ffi.c
38
src/ffi.c
@ -6,6 +6,10 @@
|
|||||||
#include "utils/cstr.h"
|
#include "utils/cstr.h"
|
||||||
#include "nfns.h"
|
#include "nfns.h"
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#if FFI==2
|
||||||
|
#include <ffi.h>
|
||||||
|
#include "utils/mut.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// base interface defs for when GC stuff needs to be added in
|
// base interface defs for when GC stuff needs to be added in
|
||||||
static B getB(BQNV v) {
|
static B getB(BQNV v) {
|
||||||
@ -169,15 +173,11 @@ DEF_FREE(ffiFn) { dec(((BoundFn*)x)->obj); }
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if FFI==2
|
|
||||||
|
|
||||||
#include <ffi.h>
|
|
||||||
#include "utils/mut.h"
|
|
||||||
typedef struct BQNFFIEnt {
|
typedef struct BQNFFIEnt {
|
||||||
B o;
|
B o;
|
||||||
|
#if FFI==2
|
||||||
ffi_type t;
|
ffi_type t;
|
||||||
|
#endif
|
||||||
u8 extra;
|
u8 extra;
|
||||||
u8 extra2;
|
u8 extra2;
|
||||||
} BQNFFIEnt;
|
} BQNFFIEnt;
|
||||||
@ -188,6 +188,14 @@ typedef struct BQNFFIType {
|
|||||||
BQNFFIEnt a[];
|
BQNFFIEnt a[];
|
||||||
} BQNFFIType;
|
} BQNFFIType;
|
||||||
|
|
||||||
|
B vfyStr(B x, char* name, char* arg);
|
||||||
|
static void printFFIType(FILE* f, B x) {
|
||||||
|
if (isC32(x)) fprintf(f, "%d", o2cu(x));
|
||||||
|
else fprint(f, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if FFI==2
|
||||||
|
|
||||||
enum ScalarTy {
|
enum ScalarTy {
|
||||||
sty_void, sty_a,
|
sty_void, sty_a,
|
||||||
sty_u8, sty_u16, sty_u32, sty_u64,
|
sty_u8, sty_u16, sty_u32, sty_u64,
|
||||||
@ -211,11 +219,6 @@ enum CompoundTy {
|
|||||||
cty_repr
|
cty_repr
|
||||||
};
|
};
|
||||||
|
|
||||||
static void printFFIType(FILE* f, B x) {
|
|
||||||
if (isC32(x)) fprintf(f, "%d", o2cu(x));
|
|
||||||
else fprint(f, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
static B m_bqnFFIType(BQNFFIEnt** rp, u8 ty, usz ia) {
|
static B m_bqnFFIType(BQNFFIEnt** rp, u8 ty, usz ia) {
|
||||||
BQNFFIType* r = mm_alloc(fsizeof(BQNFFIType, a, BQNFFIEnt, ia), t_ffiType);
|
BQNFFIType* r = mm_alloc(fsizeof(BQNFFIType, a, BQNFFIEnt, ia), t_ffiType);
|
||||||
r->ty = ty;
|
r->ty = ty;
|
||||||
@ -298,8 +301,6 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr) { // parse actual type; res.ex
|
|||||||
return (BQNFFIEnt){.t=rt, .o=ro, .extra=subParseRepr, .extra2=mut};
|
return (BQNFFIEnt){.t=rt, .o=ro, .extra=subParseRepr, .extra2=mut};
|
||||||
}
|
}
|
||||||
|
|
||||||
B vfyStr(B x, char* name, char* arg);
|
|
||||||
|
|
||||||
BQNFFIEnt ffi_parseType(B arg, bool forRes) { // doesn't consume; parse argument side & other global decorators; .extra=side, .extra2=contains mutation
|
BQNFFIEnt ffi_parseType(B arg, bool forRes) { // doesn't consume; parse argument side & other global decorators; .extra=side, .extra2=contains mutation
|
||||||
vfyStr(arg, "FFI", "type");
|
vfyStr(arg, "FFI", "type");
|
||||||
usz ia = a(arg)->ia;
|
usz ia = a(arg)->ia;
|
||||||
@ -558,6 +559,12 @@ B libffiFn_c2(B t, B w, B x) {
|
|||||||
}
|
}
|
||||||
B libffiFn_c1(B t, B x) { return libffiFn_c2(t, bi_N, x); }
|
B libffiFn_c1(B t, B x) { return libffiFn_c2(t, bi_N, x); }
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
BQNFFIEnt ffi_parseType(B arg, bool forRes) {
|
||||||
|
if (!isArr(arg) || a(arg)->ia!=1 || IGetU(arg,0).u!=m_c32('a').u) thrM("FFI: Only \"a\" arguments & return value supported with compile flag FFI=1");
|
||||||
|
return (BQNFFIEnt){};
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -573,9 +580,14 @@ B ffiload_c2(B t, B w, B x) {
|
|||||||
|
|
||||||
BQNFFIEnt tRes = ffi_parseType(GetU(x,0), true);
|
BQNFFIEnt tRes = ffi_parseType(GetU(x,0), true);
|
||||||
|
|
||||||
|
#if FFI==2
|
||||||
BQNFFIEnt* args; B argObj = m_bqnFFIType(&args, 255, argn+1);
|
BQNFFIEnt* args; B argObj = m_bqnFFIType(&args, 255, argn+1);
|
||||||
args[0] = tRes;
|
args[0] = tRes;
|
||||||
for (usz i = 0; i < argn; i++) args[i+1] = ffi_parseType(GetU(x,i+2), false);
|
for (usz i = 0; i < argn; i++) args[i+1] = ffi_parseType(GetU(x,i+2), false);
|
||||||
|
#else
|
||||||
|
for (usz i = 0; i < argn; i++) ffi_parseType(GetU(x,i+2), false);
|
||||||
|
(void)tRes;
|
||||||
|
#endif
|
||||||
|
|
||||||
char* ws = toCStr(w);
|
char* ws = toCStr(w);
|
||||||
void* dl = dlopen(ws, RTLD_NOW);
|
void* dl = dlopen(ws, RTLD_NOW);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user