Browse Source

FFI: Record ffi.errno().

Mike Pall 13 years ago
parent
commit
e3c7476533
7 changed files with 24 additions and 2 deletions
  1. 1 1
      doc/ext_ffi_semantics.html
  2. 1 1
      src/lib_ffi.c
  3. 8 0
      src/lj_crecord.c
  4. 2 0
      src/lj_crecord.h
  5. 1 0
      src/lj_ircall.h
  6. 3 0
      src/lj_vm.h
  7. 8 0
      src/lj_vmmath.c

+ 1 - 1
doc/ext_ffi_semantics.html

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

+ 1 - 1
src/lib_ffi.c

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

+ 8 - 0
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]));
   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)
 void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)
 {
 {
   CTState *cts = ctype_ctsG(J2G(J));
   CTState *cts = ctype_ctsG(J2G(J));

+ 2 - 0
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_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_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_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_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_copy(jit_State *J, RecordFFData *rd);
 LJ_FUNC void LJ_FASTCALL recff_ffi_fill(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_cdata_arith	recff_nyi
 #define recff_clib_index	recff_nyi
 #define recff_clib_index	recff_nyi
 #define recff_ffi_new		recff_nyi
 #define recff_ffi_new		recff_nyi
+#define recff_ffi_errno		recff_nyi
 #define recff_ffi_string	recff_nyi
 #define recff_ffi_string	recff_nyi
 #define recff_ffi_copy		recff_nyi
 #define recff_ffi_copy		recff_nyi
 #define recff_ffi_fill		recff_nyi
 #define recff_ffi_fill		recff_nyi

+ 1 - 0
src/lj_ircall.h

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

+ 3 - 0
src/lj_vm.h

@@ -78,6 +78,9 @@ LJ_ASMF double lj_vm_exp2(double);
 #endif
 #endif
 #endif
 #endif
 LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t);
 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
 #endif
 
 
 /* Continuations for metamethods. */
 /* Continuations for metamethods. */

+ 8 - 0
src/lj_vmmath.c

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