diff options
| author | Mike Pall <mike> | 2015-12-28 13:02:35 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2015-12-28 13:02:35 +0100 |
| commit | 20f4141b1a4abbb42b61b87cc3b52906acb12f0e (patch) | |
| tree | 19ad75159213a32751bd0e6de3b6c672dbafe33c /src | |
| parent | 0345f361531c756367257eb2f147c707e1710218 (diff) | |
| download | luajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.tar.gz luajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.tar.bz2 luajit-20f4141b1a4abbb42b61b87cc3b52906acb12f0e.zip | |
FFI: Properly unsink non-standard cdata allocations.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib_ffi.c | 5 | ||||
| -rw-r--r-- | src/lj_cdata.c | 9 | ||||
| -rw-r--r-- | src/lj_cdata.h | 2 | ||||
| -rw-r--r-- | src/lj_snap.c | 5 |
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. */ | ||
| 53 | GCcdata *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. */ |
| 53 | void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd) | 62 | void 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) | |||
| 60 | LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id); | 60 | LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id); |
| 61 | LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, | 61 | LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, |
| 62 | CTSize align); | 62 | CTSize align); |
| 63 | LJ_FUNC GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, | ||
| 64 | CTInfo info); | ||
| 63 | 65 | ||
| 64 | LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd); | 66 | LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd); |
| 65 | LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, | 67 | LJ_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); |
