summaryrefslogtreecommitdiff
path: root/src/lib_ffi.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-07 23:49:27 +0100
committerMike Pall <mike>2011-02-07 23:49:27 +0100
commit7a37b93f1b40ba83cc68965b1c80c35363c1493d (patch)
treed60ad18e47839b3998e1191672249735c46a99cc /src/lib_ffi.c
parentfb53d4aeb7590e0e8437b03589ef68adf4611570 (diff)
downloadluajit-7a37b93f1b40ba83cc68965b1c80c35363c1493d.tar.gz
luajit-7a37b93f1b40ba83cc68965b1c80c35363c1493d.tar.bz2
luajit-7a37b93f1b40ba83cc68965b1c80c35363c1493d.zip
FFI: Record ffi.copy() and ffi.fill().
Diffstat (limited to 'src/lib_ffi.c')
-rw-r--r--src/lib_ffi.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 53dd50a9..45065c12 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -455,29 +455,27 @@ LJLIB_CF(ffi_string) LJLIB_REC(.)
455 return 1; 455 return 1;
456} 456}
457 457
458LJLIB_CF(ffi_copy) 458LJLIB_CF(ffi_copy) LJLIB_REC(.)
459{ 459{
460 void *dp = ffi_checkptr(L, 1, CTID_P_VOID); 460 void *dp = ffi_checkptr(L, 1, CTID_P_VOID);
461 void *sp = ffi_checkptr(L, 2, CTID_P_CVOID); 461 void *sp = ffi_checkptr(L, 2, CTID_P_CVOID);
462 TValue *o = L->base+1; 462 TValue *o = L->base+1;
463 CTSize sz; 463 CTSize len;
464 if (tvisstr(o) && o+1 >= L->top) { 464 if (tvisstr(o) && o+1 >= L->top)
465 sz = strV(o)->len+1; /* Copy Lua string including trailing '\0'. */ 465 len = strV(o)->len+1; /* Copy Lua string including trailing '\0'. */
466 } else { 466 else
467 sz = (CTSize)ffi_checkint(L, 3); 467 len = (CTSize)ffi_checkint(L, 3);
468 if (tvisstr(o) && sz > strV(o)->len+1) 468 memcpy(dp, sp, len);
469 sz = strV(o)->len+1; /* Max. copy length is string length. */
470 }
471 memcpy(dp, sp, sz);
472 return 0; 469 return 0;
473} 470}
474 471
475LJLIB_CF(ffi_fill) 472LJLIB_CF(ffi_fill) LJLIB_REC(.)
476{ 473{
477 void *dp = ffi_checkptr(L, 1, CTID_P_VOID); 474 void *dp = ffi_checkptr(L, 1, CTID_P_VOID);
478 CTSize sz = (CTSize)ffi_checkint(L, 2); 475 CTSize len = (CTSize)ffi_checkint(L, 2);
479 int32_t fill = lj_lib_optint(L, 3, 0); 476 int32_t fill = 0;
480 memset(dp, fill, sz); 477 if (L->base+2 < L->top && !tvisnil(L->base+2)) fill = ffi_checkint(L, 3);
478 memset(dp, fill, len);
481 return 0; 479 return 0;
482} 480}
483 481