summaryrefslogtreecommitdiff
path: root/src/lj_cconv.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-19 12:56:12 +0100
committerMike Pall <mike>2011-02-19 12:56:12 +0100
commitbd29d16141d07ca4e436fe457fd6cbefd638ad15 (patch)
treefe4095b299e394d22cfc80e8995ef0d615c2f7f4 /src/lj_cconv.c
parent3e2a7a2d7fcb763b39df1f17b440b16896bec0e7 (diff)
downloadluajit2-bd29d16141d07ca4e436fe457fd6cbefd638ad15.tar.gz
FFI: Improve conversion error messages.
Diffstat (limited to 'src/lj_cconv.c')
-rw-r--r--src/lj_cconv.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/lj_cconv.c b/src/lj_cconv.c
index 1e6df8d8..94a9895f 100644
--- a/src/lj_cconv.c
+++ b/src/lj_cconv.c
@@ -22,17 +22,26 @@ LJ_NORET static void cconv_err_conv(CTState *cts, CType *d, CType *s,
const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));
const char *src;
if ((flags & CCF_FROMTV))
- src = lj_obj_typename[1+(ctype_isnum(s->info) ? LUA_TNUMBER : LUA_TSTRING)];
+ src = lj_obj_typename[1+(ctype_isnum(s->info) ? LUA_TNUMBER :
+ ctype_isarray(s->info) ? LUA_TSTRING : LUA_TNIL)];
else
src = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, s), NULL));
- lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);
+ if (CCF_GETARG(flags))
+ lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);
+ else
+ lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);
}
/* Bad conversion from TValue. */
-LJ_NORET static void cconv_err_convtv(CTState *cts, CType *d, TValue *o)
+LJ_NORET static void cconv_err_convtv(CTState *cts, CType *d, TValue *o,
+ CTInfo flags)
{
const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));
- lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, typename(o), dst);
+ const char *src = typename(o);
+ if (CCF_GETARG(flags))
+ lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);
+ else
+ lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);
}
/* Initializer overflow. */
@@ -570,13 +579,14 @@ void lj_cconv_ct_tv(CTState *cts, CType *d,
sid = CTID_BOOL;
} else if (tvisnil(o)) {
tmpptr = (void *)0;
+ flags |= CCF_FROMTV;
} else if (tvisudata(o)) {
tmpptr = uddata(udataV(o));
} else if (tvislightud(o)) {
tmpptr = lightudV(o);
} else {
err_conv:
- cconv_err_convtv(cts, d, o);
+ cconv_err_convtv(cts, d, o, flags);
}
s = ctype_get(cts, sid);
doconv: