aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2015-12-28 13:02:35 +0100
committerMike Pall <mike>2015-12-28 13:02:35 +0100
commit20f4141b1a4abbb42b61b87cc3b52906acb12f0e (patch)
tree19ad75159213a32751bd0e6de3b6c672dbafe33c
parent0345f361531c756367257eb2f147c707e1710218 (diff)
downloadluajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.tar.gz
luajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.tar.bz2
luajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.zip
FFI: Properly unsink non-standard cdata allocations.
-rw-r--r--src/lib_ffi.c5
-rw-r--r--src/lj_cdata.c9
-rw-r--r--src/lj_cdata.h2
-rw-r--r--src/lj_snap.c5
4 files changed, 15 insertions, 6 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index b2b2d37f..7be624b4 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -505,10 +505,7 @@ LJLIB_CF(ffi_new) LJLIB_REC(.)
505 } 505 }
506 if (sz == CTSIZE_INVALID) 506 if (sz == CTSIZE_INVALID)
507 lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE); 507 lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE);
508 if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN) 508 cd = lj_cdata_newx(cts, id, sz, info);
509 cd = lj_cdata_new(cts, id, sz);
510 else
511 cd = lj_cdata_newv(L, id, sz, ctype_align(info));
512 setcdataV(L, o-1, cd); /* Anchor the uninitialized cdata. */ 509 setcdataV(L, o-1, cd); /* Anchor the uninitialized cdata. */
513 lj_cconv_ct_init(cts, ct, sz, cdataptr(cd), 510 lj_cconv_ct_init(cts, ct, sz, cdataptr(cd),
514 o, (MSize)(L->top - o)); /* Initialize cdata. */ 511 o, (MSize)(L->top - o)); /* Initialize cdata. */
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index 5cd2c114..30d788e4 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -49,6 +49,15 @@ GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align)
49 return cd; 49 return cd;
50} 50}
51 51
52/* Allocate arbitrary C data object. */
53GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, CTInfo info)
54{
55 if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)
56 return lj_cdata_new(cts, id, sz);
57 else
58 return lj_cdata_newv(cts->L, id, sz, ctype_align(info));
59}
60
52/* Free a C data object. */ 61/* Free a C data object. */
53void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd) 62void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
54{ 63{
diff --git a/src/lj_cdata.h b/src/lj_cdata.h
index c8975be1..0891c33c 100644
--- a/src/lj_cdata.h
+++ b/src/lj_cdata.h
@@ -60,6 +60,8 @@ static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz)
60LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id); 60LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);
61LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, 61LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz,
62 CTSize align); 62 CTSize align);
63LJ_FUNC GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz,
64 CTInfo info);
63 65
64LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd); 66LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd);
65LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, 67LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj,
diff --git a/src/lj_snap.c b/src/lj_snap.c
index 7c78f8a3..62515ed0 100644
--- a/src/lj_snap.c
+++ b/src/lj_snap.c
@@ -711,8 +711,9 @@ static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,
711 if (ir->o == IR_CNEW || ir->o == IR_CNEWI) { 711 if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {
712 CTState *cts = ctype_cts(J->L); 712 CTState *cts = ctype_cts(J->L);
713 CTypeID id = (CTypeID)T->ir[ir->op1].i; 713 CTypeID id = (CTypeID)T->ir[ir->op1].i;
714 CTSize sz = lj_ctype_size(cts, id); 714 CTSize sz;
715 GCcdata *cd = lj_cdata_new(cts, id, sz); 715 CTInfo info = lj_ctype_info(cts, id, &sz);
716 GCcdata *cd = lj_cdata_newx(cts, id, sz, info);
716 setcdataV(J->L, o, cd); 717 setcdataV(J->L, o, cd);
717 if (ir->o == IR_CNEWI) { 718 if (ir->o == IR_CNEWI) {
718 uint8_t *p = (uint8_t *)cdataptr(cd); 719 uint8_t *p = (uint8_t *)cdataptr(cd);