diff options
author | Mike Pall <mike> | 2011-02-19 12:56:12 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-19 12:56:12 +0100 |
commit | bd29d16141d07ca4e436fe457fd6cbefd638ad15 (patch) | |
tree | fe4095b299e394d22cfc80e8995ef0d615c2f7f4 /src/lj_cconv.c | |
parent | 3e2a7a2d7fcb763b39df1f17b440b16896bec0e7 (diff) | |
download | luajit2-bd29d16141d07ca4e436fe457fd6cbefd638ad15.tar.gz |
FFI: Improve conversion error messages.
Diffstat (limited to 'src/lj_cconv.c')
-rw-r--r-- | src/lj_cconv.c | 20 |
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: |