diff options
Diffstat (limited to 'src/lj_cdata.c')
-rw-r--r-- | src/lj_cdata.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c index 10f4809c..aa3bd1a5 100644 --- a/src/lj_cdata.c +++ b/src/lj_cdata.c | |||
@@ -9,7 +9,6 @@ | |||
9 | 9 | ||
10 | #include "lj_gc.h" | 10 | #include "lj_gc.h" |
11 | #include "lj_err.h" | 11 | #include "lj_err.h" |
12 | #include "lj_str.h" | ||
13 | #include "lj_tab.h" | 12 | #include "lj_tab.h" |
14 | #include "lj_ctype.h" | 13 | #include "lj_ctype.h" |
15 | #include "lj_cconv.h" | 14 | #include "lj_cconv.h" |
@@ -27,12 +26,12 @@ GCcdata *lj_cdata_newref(CTState *cts, const void *p, CTypeID id) | |||
27 | } | 26 | } |
28 | 27 | ||
29 | /* Allocate variable-sized or specially aligned C data object. */ | 28 | /* Allocate variable-sized or specially aligned C data object. */ |
30 | GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align) | 29 | GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align) |
31 | { | 30 | { |
32 | global_State *g; | 31 | global_State *g; |
33 | MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) + | 32 | MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) + |
34 | (align > CT_MEMALIGN ? (1u<<align) - (1u<<CT_MEMALIGN) : 0); | 33 | (align > CT_MEMALIGN ? (1u<<align) - (1u<<CT_MEMALIGN) : 0); |
35 | char *p = lj_mem_newt(cts->L, extra + sz, char); | 34 | char *p = lj_mem_newt(L, extra + sz, char); |
36 | uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata); | 35 | uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata); |
37 | uintptr_t almask = (1u << align) - 1u; | 36 | uintptr_t almask = (1u << align) - 1u; |
38 | GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata)); | 37 | GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata)); |
@@ -40,7 +39,7 @@ GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align) | |||
40 | cdatav(cd)->offset = (uint16_t)((char *)cd - p); | 39 | cdatav(cd)->offset = (uint16_t)((char *)cd - p); |
41 | cdatav(cd)->extra = extra; | 40 | cdatav(cd)->extra = extra; |
42 | cdatav(cd)->len = sz; | 41 | cdatav(cd)->len = sz; |
43 | g = cts->g; | 42 | g = G(L); |
44 | setgcrefr(cd->nextgc, g->gc.root); | 43 | setgcrefr(cd->nextgc, g->gc.root); |
45 | setgcref(g->gc.root, obj2gco(cd)); | 44 | setgcref(g->gc.root, obj2gco(cd)); |
46 | newwhite(g, obj2gco(cd)); | 45 | newwhite(g, obj2gco(cd)); |
@@ -76,21 +75,20 @@ void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd) | |||
76 | } | 75 | } |
77 | } | 76 | } |
78 | 77 | ||
79 | TValue * LJ_FASTCALL lj_cdata_setfin(lua_State *L, GCcdata *cd) | 78 | void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, uint32_t it) |
80 | { | 79 | { |
81 | global_State *g = G(L); | 80 | GCtab *t = ctype_ctsG(G(L))->finalizer; |
82 | GCtab *t = ctype_ctsG(g)->finalizer; | ||
83 | if (gcref(t->metatable)) { | 81 | if (gcref(t->metatable)) { |
84 | /* Add cdata to finalizer table, if still enabled. */ | 82 | /* Add cdata to finalizer table, if still enabled. */ |
85 | TValue *tv, tmp; | 83 | TValue *tv, tmp; |
86 | setcdataV(L, &tmp, cd); | 84 | setcdataV(L, &tmp, cd); |
87 | lj_gc_anybarriert(L, t); | 85 | lj_gc_anybarriert(L, t); |
88 | tv = lj_tab_set(L, t, &tmp); | 86 | tv = lj_tab_set(L, t, &tmp); |
89 | cd->marked |= LJ_GC_CDATA_FIN; | 87 | setgcV(L, tv, obj, it); |
90 | return tv; | 88 | if (!tvisnil(tv)) |
91 | } else { | 89 | cd->marked |= LJ_GC_CDATA_FIN; |
92 | /* Otherwise return dummy TValue. */ | 90 | else |
93 | return &g->tmptv; | 91 | cd->marked &= ~LJ_GC_CDATA_FIN; |
94 | } | 92 | } |
95 | } | 93 | } |
96 | 94 | ||