aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-15 21:47:46 +0100
committerMike Pall <mike>2010-12-15 21:47:46 +0100
commit09ef7ebf561a4573e02d65f0a324bb72780297d5 (patch)
tree9cbe55e261ab14769acb03471250a88de9a6ec0b /src
parentfbcc925a2d0f64e352d359626c1cb410b2cb5883 (diff)
downloadluajit-09ef7ebf561a4573e02d65f0a324bb72780297d5.tar.gz
luajit-09ef7ebf561a4573e02d65f0a324bb72780297d5.tar.bz2
luajit-09ef7ebf561a4573e02d65f0a324bb72780297d5.zip
FFI: Simplify copy-by-value. Strip attributes, keep qualifiers.
Diffstat (limited to 'src')
-rw-r--r--src/lj_cconv.c31
1 files changed, 8 insertions, 23 deletions
diff --git a/src/lj_cconv.c b/src/lj_cconv.c
index f68f86a4..06e3160f 100644
--- a/src/lj_cconv.c
+++ b/src/lj_cconv.c
@@ -373,28 +373,6 @@ copyval: /* Copy value. */
373 373
374/* -- C type to TValue conversion ----------------------------------------- */ 374/* -- C type to TValue conversion ----------------------------------------- */
375 375
376/* Copy value to new cdata. Strip attributes and qualifiers. */
377static GCcdata *cconv_copyval(CTState *cts, CTypeID id, void *sp)
378{
379 CType *ct = ctype_raw(cts, id);
380 CTInfo info = ct->info;
381 CTSize size = ct->size;
382 GCcdata *cd;
383 lua_assert(ctype_isnum(info) || ctype_isenum(info) ||
384 ctype_isptr(info) || ctype_isvalarray(info));
385 if (LJ_UNLIKELY((info & CTF_QUAL))) { /* Any qualifiers to strip? */
386 if (ctype_isarray(info)) {
387 CType *cct = ctype_child(cts, ct);
388 id = lj_ctype_intern(cts, (cct->info & ~CTF_QUAL), cct->size);
389 info = ((info & ~CTMASK_CID) + id);
390 }
391 id = lj_ctype_intern(cts, (info & ~CTF_QUAL), size);
392 }
393 cd = lj_cdata_new(cts, id, size);
394 memcpy(cdataptr(cd), sp, size);
395 return cd;
396}
397
398/* Convert C type to TValue. Caveat: expects to get the raw CType! */ 376/* Convert C type to TValue. Caveat: expects to get the raw CType! */
399void lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid, 377void lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
400 TValue *o, uint8_t *sp) 378 TValue *o, uint8_t *sp)
@@ -423,8 +401,15 @@ void lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
423 /* Create reference. */ 401 /* Create reference. */
424 setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid)); 402 setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid));
425 } else { 403 } else {
404 GCcdata *cd;
405 CTSize sz;
426 copyval: /* Copy value. */ 406 copyval: /* Copy value. */
427 setcdataV(cts->L, o, cconv_copyval(cts, sid, sp)); 407 sz = s->size;
408 lua_assert(sz != CTSIZE_INVALID);
409 /* Attributes are stripped, qualifiers are kept (but mostly ignored). */
410 cd = lj_cdata_new(cts, ctype_typeid(cts, s), sz);
411 setcdataV(cts->L, o, cd);
412 memcpy(cdataptr(cd), sp, sz);
428 } 413 }
429} 414}
430 415