summaryrefslogtreecommitdiff
path: root/src/lib_ffi.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-06 12:46:18 +0100
committerMike Pall <mike>2011-02-06 12:46:18 +0100
commitceece4d13e6da6b96060d7050122f7ed40d75cc9 (patch)
treeb2ae0be051d0b5e0373dd93645bd9c4e2924e74f /src/lib_ffi.c
parentbf58160b7aa21d15b710f948d160da277a02a613 (diff)
downloadluajit-ceece4d13e6da6b96060d7050122f7ed40d75cc9.tar.gz
luajit-ceece4d13e6da6b96060d7050122f7ed40d75cc9.tar.bz2
luajit-ceece4d13e6da6b96060d7050122f7ed40d75cc9.zip
FFI: Perform stricter checks in ffi.cast(). Record ffi.cast().
Diffstat (limited to 'src/lib_ffi.c')
-rw-r--r--src/lib_ffi.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 54d49f87..26e18183 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -406,19 +406,18 @@ LJLIB_CF(ffi_offsetof)
406 return 0; 406 return 0;
407} 407}
408 408
409LJLIB_CF(ffi_cast) 409LJLIB_CF(ffi_cast) LJLIB_REC(ffi_new)
410{ 410{
411 CTState *cts = ctype_cts(L); 411 CTState *cts = ctype_cts(L);
412 CTypeID id = ffi_checkctype(L, cts); 412 CTypeID id = ffi_checkctype(L, cts);
413 CType *d = ctype_raw(cts, id);
413 TValue *o = lj_lib_checkany(L, 2); 414 TValue *o = lj_lib_checkany(L, 2);
414 L->top = o+1; /* Make sure this is the last item on the stack. */ 415 L->top = o+1; /* Make sure this is the last item on the stack. */
416 if (!(ctype_isnum(d->info) || ctype_isptr(d->info) || ctype_isenum(d->info)))
417 lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);
415 if (!(tviscdata(o) && cdataV(o)->typeid == id)) { 418 if (!(tviscdata(o) && cdataV(o)->typeid == id)) {
416 CTSize sz = lj_ctype_size(cts, id); 419 GCcdata *cd = lj_cdata_new(cts, id, d->size);
417 GCcdata *cd; 420 lj_cconv_ct_tv(cts, d, cdataptr(cd), o, CCF_CAST);
418 if (sz == CTSIZE_INVALID)
419 lj_err_caller(L, LJ_ERR_FFI_INVSIZE);
420 cd = lj_cdata_new(cts, id, sz); /* Create destination cdata. */
421 lj_cconv_ct_tv(cts, ctype_raw(cts, id), cdataptr(cd), o, CCF_CAST);
422 setcdataV(L, o, cd); 421 setcdataV(L, o, cd);
423 lj_gc_check(L); 422 lj_gc_check(L);
424 } 423 }