diff options
| author | Mike Pall <mike> | 2011-01-12 21:24:15 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-01-12 21:33:58 +0100 |
| commit | a5e48285e39af2e794288091fafc02e113e1fa82 (patch) | |
| tree | f1089c402a2d93fdc3dc5a58559333cfe18fb7ad | |
| parent | 2363399b10cf79196df4dde1554027db2b50faf9 (diff) | |
| download | luajit-a5e48285e39af2e794288091fafc02e113e1fa82.tar.gz luajit-a5e48285e39af2e794288091fafc02e113e1fa82.tar.bz2 luajit-a5e48285e39af2e794288091fafc02e113e1fa82.zip | |
FFI: Rearrange code in lib_ffi.c.
| -rw-r--r-- | src/lib_ffi.c | 98 |
1 files changed, 50 insertions, 48 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 2b895ed5..b040a652 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c | |||
| @@ -77,6 +77,8 @@ static void *ffi_checkptr(lua_State *L, int narg, CTypeID id) | |||
| 77 | return p; | 77 | return p; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | /* -- C data arithmetic --------------------------------------------------- */ | ||
| 81 | |||
| 80 | typedef struct FFIArith { | 82 | typedef struct FFIArith { |
| 81 | uint8_t *p[2]; | 83 | uint8_t *p[2]; |
| 82 | CType *ct[2]; | 84 | CType *ct[2]; |
| @@ -111,54 +113,6 @@ static void ffi_checkarith(lua_State *L, CTState *cts, FFIArith *fa) | |||
| 111 | } | 113 | } |
| 112 | } | 114 | } |
| 113 | 115 | ||
| 114 | /* -- C type metamethods -------------------------------------------------- */ | ||
| 115 | |||
| 116 | #define LJLIB_MODULE_ffi_meta | ||
| 117 | |||
| 118 | LJLIB_CF(ffi_meta___index) LJLIB_REC(cdata_index 0) | ||
| 119 | { | ||
| 120 | CTState *cts = ctype_cts(L); | ||
| 121 | CTInfo qual = 0; | ||
| 122 | CType *ct; | ||
| 123 | uint8_t *p; | ||
| 124 | TValue *o = L->base; | ||
| 125 | if (!(o+1 < L->top && tviscdata(o))) /* Also checks for presence of key. */ | ||
| 126 | lj_err_argt(L, 1, LUA_TCDATA); | ||
| 127 | ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); | ||
| 128 | if (lj_cdata_get(cts, ct, L->top-1, p)) | ||
| 129 | lj_gc_check(L); | ||
| 130 | return 1; | ||
| 131 | } | ||
| 132 | |||
| 133 | LJLIB_CF(ffi_meta___newindex) LJLIB_REC(cdata_index 1) | ||
| 134 | { | ||
| 135 | CTState *cts = ctype_cts(L); | ||
| 136 | CTInfo qual = 0; | ||
| 137 | CType *ct; | ||
| 138 | uint8_t *p; | ||
| 139 | TValue *o = L->base; | ||
| 140 | if (!(o+2 < L->top && tviscdata(o))) /* Also checks for key and value. */ | ||
| 141 | lj_err_argt(L, 1, LUA_TCDATA); | ||
| 142 | ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); | ||
| 143 | lj_cdata_set(cts, ct, p, o+2, qual); | ||
| 144 | return 0; | ||
| 145 | } | ||
| 146 | |||
| 147 | /* Forward declaration. */ | ||
| 148 | static int lj_cf_ffi_new(lua_State *L); | ||
| 149 | |||
| 150 | LJLIB_CF(ffi_meta___call) LJLIB_REC(cdata_call) | ||
| 151 | { | ||
| 152 | GCcdata *cd = ffi_checkcdata(L, 1); | ||
| 153 | int ret; | ||
| 154 | if (cd->typeid == CTID_CTYPEID) | ||
| 155 | return lj_cf_ffi_new(L); | ||
| 156 | if ((ret = lj_ccall_func(L, cd)) < 0) | ||
| 157 | lj_err_callerv(L, LJ_ERR_FFI_BADCALL, | ||
| 158 | strdata(lj_ctype_repr(L, cd->typeid, NULL))); | ||
| 159 | return ret; | ||
| 160 | } | ||
| 161 | |||
| 162 | /* Pointer arithmetic. */ | 116 | /* Pointer arithmetic. */ |
| 163 | static int ffi_arith_ptr(lua_State *L, CTState *cts, FFIArith *fa, MMS mm) | 117 | static int ffi_arith_ptr(lua_State *L, CTState *cts, FFIArith *fa, MMS mm) |
| 164 | { | 118 | { |
| @@ -296,6 +250,54 @@ static int ffi_arith(lua_State *L) | |||
| 296 | return 1; | 250 | return 1; |
| 297 | } | 251 | } |
| 298 | 252 | ||
| 253 | /* -- C type metamethods -------------------------------------------------- */ | ||
| 254 | |||
| 255 | #define LJLIB_MODULE_ffi_meta | ||
| 256 | |||
| 257 | LJLIB_CF(ffi_meta___index) LJLIB_REC(cdata_index 0) | ||
| 258 | { | ||
| 259 | CTState *cts = ctype_cts(L); | ||
| 260 | CTInfo qual = 0; | ||
| 261 | CType *ct; | ||
| 262 | uint8_t *p; | ||
| 263 | TValue *o = L->base; | ||
| 264 | if (!(o+1 < L->top && tviscdata(o))) /* Also checks for presence of key. */ | ||
| 265 | lj_err_argt(L, 1, LUA_TCDATA); | ||
| 266 | ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); | ||
| 267 | if (lj_cdata_get(cts, ct, L->top-1, p)) | ||
| 268 | lj_gc_check(L); | ||
| 269 | return 1; | ||
| 270 | } | ||
| 271 | |||
| 272 | LJLIB_CF(ffi_meta___newindex) LJLIB_REC(cdata_index 1) | ||
| 273 | { | ||
| 274 | CTState *cts = ctype_cts(L); | ||
| 275 | CTInfo qual = 0; | ||
| 276 | CType *ct; | ||
| 277 | uint8_t *p; | ||
| 278 | TValue *o = L->base; | ||
| 279 | if (!(o+2 < L->top && tviscdata(o))) /* Also checks for key and value. */ | ||
| 280 | lj_err_argt(L, 1, LUA_TCDATA); | ||
| 281 | ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); | ||
| 282 | lj_cdata_set(cts, ct, p, o+2, qual); | ||
| 283 | return 0; | ||
| 284 | } | ||
| 285 | |||
| 286 | /* Forward declaration. */ | ||
| 287 | static int lj_cf_ffi_new(lua_State *L); | ||
| 288 | |||
| 289 | LJLIB_CF(ffi_meta___call) LJLIB_REC(cdata_call) | ||
| 290 | { | ||
| 291 | GCcdata *cd = ffi_checkcdata(L, 1); | ||
| 292 | int ret; | ||
| 293 | if (cd->typeid == CTID_CTYPEID) | ||
| 294 | return lj_cf_ffi_new(L); | ||
| 295 | if ((ret = lj_ccall_func(L, cd)) < 0) | ||
| 296 | lj_err_callerv(L, LJ_ERR_FFI_BADCALL, | ||
| 297 | strdata(lj_ctype_repr(L, cd->typeid, NULL))); | ||
| 298 | return ret; | ||
| 299 | } | ||
| 300 | |||
| 299 | LJLIB_CF(ffi_meta___add) LJLIB_REC(cdata_arith MM_add) | 301 | LJLIB_CF(ffi_meta___add) LJLIB_REC(cdata_arith MM_add) |
| 300 | { | 302 | { |
| 301 | return ffi_arith(L); | 303 | return ffi_arith(L); |
