From 09ef7ebf561a4573e02d65f0a324bb72780297d5 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 15 Dec 2010 21:47:46 +0100 Subject: [PATCH] FFI: Simplify copy-by-value. Strip attributes, keep qualifiers. --- src/lj_cconv.c | 31 ++++++++----------------------- 1 file 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. */ /* -- C type to TValue conversion ----------------------------------------- */ -/* Copy value to new cdata. Strip attributes and qualifiers. */ -static GCcdata *cconv_copyval(CTState *cts, CTypeID id, void *sp) -{ - CType *ct = ctype_raw(cts, id); - CTInfo info = ct->info; - CTSize size = ct->size; - GCcdata *cd; - lua_assert(ctype_isnum(info) || ctype_isenum(info) || - ctype_isptr(info) || ctype_isvalarray(info)); - if (LJ_UNLIKELY((info & CTF_QUAL))) { /* Any qualifiers to strip? */ - if (ctype_isarray(info)) { - CType *cct = ctype_child(cts, ct); - id = lj_ctype_intern(cts, (cct->info & ~CTF_QUAL), cct->size); - info = ((info & ~CTMASK_CID) + id); - } - id = lj_ctype_intern(cts, (info & ~CTF_QUAL), size); - } - cd = lj_cdata_new(cts, id, size); - memcpy(cdataptr(cd), sp, size); - return cd; -} - /* Convert C type to TValue. Caveat: expects to get the raw CType! */ void lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid, TValue *o, uint8_t *sp) @@ -423,8 +401,15 @@ void lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid, /* Create reference. */ setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid)); } else { + GCcdata *cd; + CTSize sz; copyval: /* Copy value. */ - setcdataV(cts->L, o, cconv_copyval(cts, sid, sp)); + sz = s->size; + lua_assert(sz != CTSIZE_INVALID); + /* Attributes are stripped, qualifiers are kept (but mostly ignored). */ + cd = lj_cdata_new(cts, ctype_typeid(cts, s), sz); + setcdataV(cts->L, o, cd); + memcpy(cdataptr(cd), sp, sz); } }