From e3c7476533c892ab1ac24dea45efb4204b15c577 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 26 Nov 2011 16:54:52 +0100 Subject: [PATCH] FFI: Record ffi.errno(). --- doc/ext_ffi_semantics.html | 2 +- src/lib_ffi.c | 2 +- src/lj_crecord.c | 8 ++++++++ src/lj_crecord.h | 2 ++ src/lj_ircall.h | 1 + src/lj_vm.h | 3 +++ src/lj_vmmath.c | 8 ++++++++ 7 files changed, 24 insertions(+), 2 deletions(-) diff --git a/doc/ext_ffi_semantics.html b/doc/ext_ffi_semantics.html index f3be0799..b111ed5d 100644 --- a/doc/ext_ffi_semantics.html +++ b/doc/ext_ffi_semantics.html @@ -1119,7 +1119,7 @@ value.
  • Calls to the following ffi.* API functions: cdef, load, typeof, metatype, gc, sizeof, alignof, -offsetof, errno.
  • +offsetof.

    Other missing features: diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 850805e6..0a8a7282 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c @@ -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) diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 313bee81..4cdad9ef 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c @@ -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)); diff --git a/src/lj_crecord.h b/src/lj_crecord.h index fce45afe..fb042c56 100644 --- a/src/lj_crecord.h +++ b/src/lj_crecord.h @@ -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 diff --git a/src/lj_ircall.h b/src/lj_ircall.h index 8ccc852e..5397046e 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h @@ -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. */ diff --git a/src/lj_vm.h b/src/lj_vm.h index 9ce14acc..da940b9f 100644 --- a/src/lj_vm.h +++ b/src/lj_vm.h @@ -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. */ diff --git a/src/lj_vmmath.c b/src/lj_vmmath.c index ec3d98af..8b177207 100644 --- a/src/lj_vmmath.c +++ b/src/lj_vmmath.c @@ -6,6 +6,7 @@ #define lj_vmmath_c #define LUA_CORE +#include #include #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 -- 2.11.4.GIT