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.
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