浏览代码

FFI: Allow 'typedef _Bool int BOOL;' to make Windows users happy.

Mike Pall 13 年之前
父节点
当前提交
886a450a3d
共有 3 个文件被更改,包括 16 次插入9 次删除
  1. 8 6
      src/lj_cconv.c
  2. 7 2
      src/lj_cparse.c
  3. 1 1
      src/lj_ctype.c

+ 8 - 6
src/lj_cconv.c

@@ -131,21 +131,23 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
   /* Some basic sanity checks. */
   lua_assert(!ctype_isnum(dinfo) || dsize > 0);
   lua_assert(!ctype_isnum(sinfo) || ssize > 0);
-  lua_assert(!ctype_isbool(dinfo) || dsize == 1);
-  lua_assert(!ctype_isbool(sinfo) || ssize == 1);
+  lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);
+  lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);
   lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);
   lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);
 
   switch (cconv_idx2(dinfo, sinfo)) {
   /* Destination is a bool. */
   case CCX(B, B):
-    *dp = *sp;  /* Source operand is already normalized. */
+    /* Source operand is already normalized. */
+    if (dsize == 1) *dp = *sp; else *(int *)dp = *sp;
     break;
   case CCX(B, I): {
     MSize i;
     uint8_t b = 0;
     for (i = 0; i < ssize; i++) b |= sp[i];
-    *dp = (b != 0);
+    b = (b != 0);
+    if (dsize == 1) *dp = b; else *(int *)dp = b;
     break;
     }
   case CCX(B, F): {
@@ -153,7 +155,7 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
     if (ssize == sizeof(double)) b = (*(double *)sp != 0);
     else if (ssize == sizeof(float)) b = (*(float *)sp != 0);
     else goto err_conv;  /* NYI: long double. */
-    *dp = b;
+    if (dsize == 1) *dp = b; else *(int *)dp = b;
     break;
     }
 
@@ -391,7 +393,7 @@ int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
 	lua_assert(tvisnum(o));
       }
     } else {
-      uint32_t b = (*sp != 0);
+      uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);
       setboolV(o, b);
       setboolV(&cts->g->tmptv2, b);  /* Remember for trace recorder. */
     }

+ 7 - 2
src/lj_cparse.c

@@ -1502,8 +1502,13 @@ end_decl:
     /* Determine type info and size. */
     CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);
     if ((cds & CDF_BOOL)) {
-      info = CTINFO(CT_NUM, CTF_UNSIGNED|CTF_BOOL);
-      lua_assert(sz == 1);
+      if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))
+	cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE);
+      info |= CTF_BOOL;
+      if (!sz) {
+	if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED;
+	sz = 1;
+      }
     } else if ((cds & CDF_FP)) {
       info = CTINFO(CT_NUM, CTF_FP);
       if ((cds & CDF_LONG)) sz = sizeof(long double);

+ 1 - 1
src/lj_ctype.c

@@ -43,7 +43,7 @@
 #define CTKWDEF(_) \
   /* Type specifiers. */ \
   _("void",		-1,	CTOK_VOID) \
-  _("_Bool",		1,	CTOK_BOOL) \
+  _("_Bool",		0,	CTOK_BOOL) \
   _("bool",		1,	CTOK_BOOL) \
   _("char",		1,	CTOK_CHAR) \
   _("int",		4,	CTOK_INT) \