FFI: Record ffi.errno().

This commit is contained in:
Mike Pall 2011-11-26 16:54:52 +01:00
parent 1a42c03807
commit e3c7476533
7 changed files with 24 additions and 2 deletions

View File

@ -1119,7 +1119,7 @@ value.</li>
<li>Calls to the following <a href="ext_ffi_api.html">ffi.* API</a>
functions: <tt>cdef</tt>, <tt>load</tt>, <tt>typeof</tt>,
<tt>metatype</tt>, <tt>gc</tt>, <tt>sizeof</tt>, <tt>alignof</tt>,
<tt>offsetof</tt>, <tt>errno</tt>.</li>
<tt>offsetof</tt>.</li>
</ul>
<p>
Other missing features:

View File

@ -603,7 +603,7 @@ LJLIB_CF(ffi_offsetof)
return 0;
}
LJLIB_CF(ffi_errno)
LJLIB_CF(ffi_errno) LJLIB_REC(.)
{
int err = errno;
if (L->top > L->base)

View File

@ -1205,6 +1205,14 @@ void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)
crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0]));
}
void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd)
{
UNUSED(rd);
if (J->base[0])
lj_trace_err(J, LJ_TRERR_NYICALL);
J->base[0] = lj_ir_call(J, IRCALL_lj_vm_errno);
}
void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)
{
CTState *cts = ctype_ctsG(J2G(J));

View File

@ -16,6 +16,7 @@ LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);
LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd);
@ -28,6 +29,7 @@ LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
#define recff_cdata_arith recff_nyi
#define recff_clib_index recff_nyi
#define recff_ffi_new recff_nyi
#define recff_ffi_errno recff_nyi
#define recff_ffi_string recff_nyi
#define recff_ffi_copy recff_nyi
#define recff_ffi_fill recff_nyi

View File

@ -171,6 +171,7 @@ typedef struct CCallInfo {
_(FFI, strlen, 1, N, INTP, 0) \
_(FFI, memcpy, 3, S, PTR, 0) \
_(FFI, memset, 3, S, PTR, 0) \
_(FFI, lj_vm_errno, 0, S, INT, CCI_NOFPRCLOBBER) \
_(FFI32, lj_carith_mul64, ARG2_64, N, I64, CCI_NOFPRCLOBBER)
\
/* End of list. */

View File

@ -78,6 +78,9 @@ LJ_ASMF double lj_vm_exp2(double);
#endif
#endif
LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t);
#if LJ_HASFFI
LJ_ASMF int lj_vm_errno(void);
#endif
#endif
/* Continuations for metamethods. */

View File

@ -6,6 +6,7 @@
#define lj_vmmath_c
#define LUA_CORE
#include <errno.h>
#include <math.h>
#include "lj_obj.h"
@ -108,4 +109,11 @@ double lj_vm_foldfpm(double x, int fpm)
}
#endif
#if LJ_HASFFI
int lj_vm_errno(void)
{
return errno;
}
#endif
#endif