]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Treat function ctypes like pointers in comparisons.
authorMike Pall <mike>
Sat, 23 Jul 2011 14:29:47 +0000 (16:29 +0200)
committerMike Pall <mike>
Sat, 23 Jul 2011 14:29:47 +0000 (16:29 +0200)
src/lj_carith.c
src/lj_crecord.c

index 8f644d8358e3cbe5513f7b28acae250c5c6059a0..b0f4c65aa6f4b9d44103f5d1092a527594ec65a4 100644 (file)
@@ -35,11 +35,16 @@ static int carith_checkarg(lua_State *L, CTState *cts, CDArith *ca)
   for (i = 0; i < 2; i++, o++) {
     if (tviscdata(o)) {
       GCcdata *cd = cdataV(o);
-      CType *ct = ctype_raw(cts, (CTypeID)cd->typeid);
+      CTypeID id = (CTypeID)cd->typeid;
+      CType *ct = ctype_raw(cts, id);
       uint8_t *p = (uint8_t *)cdataptr(cd);
       if (ctype_isptr(ct->info)) {
        p = (uint8_t *)cdata_getptr(p, ct->size);
        if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);
+      } else if (ctype_isfunc(ct->info)) {
+       p = (uint8_t *)*(void **)p;
+       ct = ctype_get(cts,
+         lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));
       }
       ca->ct[i] = ct;
       ca->p[i] = p;
index 743137de1cbc82e140aa1bf016e7210416c13beb..180f255cc6dce471eda9e4a8f888ce13f0072baf 100644 (file)
@@ -969,6 +969,10 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd)
        tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT64);
        lj_needsplit(J);
        goto ok;
+      } else if (ctype_isfunc(ct->info)) {
+       tr = emitir(IRT(IR_FLOAD, IRT_PTR), tr, IRFL_CDATA_PTR);
+       ct = ctype_get(cts,
+         lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));
       } else {
        tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCcdata)));
       }