mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
FFI: Properly unsink non-standard cdata allocations.
This commit is contained in:
parent
0345f36153
commit
20f4141b1a
@ -505,10 +505,7 @@ LJLIB_CF(ffi_new) LJLIB_REC(.)
|
|||||||
}
|
}
|
||||||
if (sz == CTSIZE_INVALID)
|
if (sz == CTSIZE_INVALID)
|
||||||
lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE);
|
lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE);
|
||||||
if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)
|
cd = lj_cdata_newx(cts, id, sz, info);
|
||||||
cd = lj_cdata_new(cts, id, sz);
|
|
||||||
else
|
|
||||||
cd = lj_cdata_newv(L, id, sz, ctype_align(info));
|
|
||||||
setcdataV(L, o-1, cd); /* Anchor the uninitialized cdata. */
|
setcdataV(L, o-1, cd); /* Anchor the uninitialized cdata. */
|
||||||
lj_cconv_ct_init(cts, ct, sz, cdataptr(cd),
|
lj_cconv_ct_init(cts, ct, sz, cdataptr(cd),
|
||||||
o, (MSize)(L->top - o)); /* Initialize cdata. */
|
o, (MSize)(L->top - o)); /* Initialize cdata. */
|
||||||
|
@ -49,6 +49,15 @@ GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align)
|
|||||||
return cd;
|
return cd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate arbitrary C data object. */
|
||||||
|
GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, CTInfo info)
|
||||||
|
{
|
||||||
|
if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)
|
||||||
|
return lj_cdata_new(cts, id, sz);
|
||||||
|
else
|
||||||
|
return lj_cdata_newv(cts->L, id, sz, ctype_align(info));
|
||||||
|
}
|
||||||
|
|
||||||
/* Free a C data object. */
|
/* Free a C data object. */
|
||||||
void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
|
void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
|
||||||
{
|
{
|
||||||
|
@ -60,6 +60,8 @@ static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz)
|
|||||||
LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);
|
LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);
|
||||||
LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz,
|
LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz,
|
||||||
CTSize align);
|
CTSize align);
|
||||||
|
LJ_FUNC GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz,
|
||||||
|
CTInfo info);
|
||||||
|
|
||||||
LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd);
|
LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd);
|
||||||
LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj,
|
LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj,
|
||||||
|
@ -711,8 +711,9 @@ static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,
|
|||||||
if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {
|
if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {
|
||||||
CTState *cts = ctype_cts(J->L);
|
CTState *cts = ctype_cts(J->L);
|
||||||
CTypeID id = (CTypeID)T->ir[ir->op1].i;
|
CTypeID id = (CTypeID)T->ir[ir->op1].i;
|
||||||
CTSize sz = lj_ctype_size(cts, id);
|
CTSize sz;
|
||||||
GCcdata *cd = lj_cdata_new(cts, id, sz);
|
CTInfo info = lj_ctype_info(cts, id, &sz);
|
||||||
|
GCcdata *cd = lj_cdata_newx(cts, id, sz, info);
|
||||||
setcdataV(J->L, o, cd);
|
setcdataV(J->L, o, cd);
|
||||||
if (ir->o == IR_CNEWI) {
|
if (ir->o == IR_CNEWI) {
|
||||||
uint8_t *p = (uint8_t *)cdataptr(cd);
|
uint8_t *p = (uint8_t *)cdataptr(cd);
|
||||||
|
Loading…
Reference in New Issue
Block a user