aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-05-23 02:43:36 +0200
committerMike Pall <mike>2011-05-23 02:43:36 +0200
commit7b21a660a89367db4ab50a85aa32a1ffd5a88623 (patch)
tree937ab4fae2eb3611f2d67e9a1b4118e9accb4ed9 /src
parent288085afbe916ac334dbc88ee2da836fb837bbca (diff)
downloadluajit-7b21a660a89367db4ab50a85aa32a1ffd5a88623.tar.gz
luajit-7b21a660a89367db4ab50a85aa32a1ffd5a88623.tar.bz2
luajit-7b21a660a89367db4ab50a85aa32a1ffd5a88623.zip
FFI: Fix __gc for VLA/VLS cdata objects.
Diffstat (limited to 'src')
-rw-r--r--src/lj_cdata.c3
-rw-r--r--src/lj_gc.c8
-rw-r--r--src/lj_gc.h2
3 files changed, 8 insertions, 5 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index d01cf62a..497b84ee 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -55,7 +55,8 @@ void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
55{ 55{
56 if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) { 56 if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) {
57 GCobj *root; 57 GCobj *root;
58 cd->marked = curwhite(g) | LJ_GC_FINALIZED; 58 makewhite(g, obj2gco(cd));
59 obj2gco(cd)->gch.marked |= LJ_GC_FINALIZED;
59 if ((root = gcref(g->gc.mmudata)) != NULL) { 60 if ((root = gcref(g->gc.mmudata)) != NULL) {
60 setgcrefr(cd->nextgc, root->gch.nextgc); 61 setgcrefr(cd->nextgc, root->gch.nextgc);
61 setgcref(root->gch.nextgc, obj2gco(cd)); 62 setgcref(root->gch.nextgc, obj2gco(cd));
diff --git a/src/lj_gc.c b/src/lj_gc.c
index 7999e31f..e65f7ffa 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -34,8 +34,6 @@
34/* Macros to set GCobj colors and flags. */ 34/* Macros to set GCobj colors and flags. */
35#define white2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES) 35#define white2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES)
36#define gray2black(x) ((x)->gch.marked |= LJ_GC_BLACK) 36#define gray2black(x) ((x)->gch.marked |= LJ_GC_BLACK)
37#define makewhite(g, x) \
38 ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g))
39#define isfinalized(u) ((u)->marked & LJ_GC_FINALIZED) 37#define isfinalized(u) ((u)->marked & LJ_GC_FINALIZED)
40#define markfinalized(u) ((u)->marked |= LJ_GC_FINALIZED) 38#define markfinalized(u) ((u)->marked |= LJ_GC_FINALIZED)
41 39
@@ -500,7 +498,8 @@ static void gc_finalize(lua_State *L)
500 /* Add cdata back to the GC list and make it white. */ 498 /* Add cdata back to the GC list and make it white. */
501 setgcrefr(o->gch.nextgc, g->gc.root); 499 setgcrefr(o->gch.nextgc, g->gc.root);
502 setgcref(g->gc.root, o); 500 setgcref(g->gc.root, o);
503 o->gch.marked = curwhite(g); 501 makewhite(g, o);
502 o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;
504 /* Resolve finalizer. */ 503 /* Resolve finalizer. */
505 setcdataV(L, &tmp, gco2cd(o)); 504 setcdataV(L, &tmp, gco2cd(o));
506 tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp); 505 tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp);
@@ -544,7 +543,8 @@ void lj_gc_finalize_cdata(lua_State *L)
544 if (!tvisnil(&node[i].val) && tviscdata(&node[i].key)) { 543 if (!tvisnil(&node[i].val) && tviscdata(&node[i].key)) {
545 GCobj *o = gcV(&node[i].key); 544 GCobj *o = gcV(&node[i].key);
546 TValue tmp; 545 TValue tmp;
547 o->gch.marked = curwhite(g); 546 makewhite(g, o);
547 o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;
548 copyTV(L, &tmp, &node[i].val); 548 copyTV(L, &tmp, &node[i].val);
549 setnilV(&node[i].val); 549 setnilV(&node[i].val);
550 gc_call_finalizer(g, L, &tmp, o); 550 gc_call_finalizer(g, L, &tmp, o);
diff --git a/src/lj_gc.h b/src/lj_gc.h
index ec1a9643..dd7f87ba 100644
--- a/src/lj_gc.h
+++ b/src/lj_gc.h
@@ -38,6 +38,8 @@ enum {
38 38
39#define curwhite(g) ((g)->gc.currentwhite & LJ_GC_WHITES) 39#define curwhite(g) ((g)->gc.currentwhite & LJ_GC_WHITES)
40#define newwhite(g, x) (obj2gco(x)->gch.marked = (uint8_t)curwhite(g)) 40#define newwhite(g, x) (obj2gco(x)->gch.marked = (uint8_t)curwhite(g))
41#define makewhite(g, x) \
42 ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g))
41#define flipwhite(x) ((x)->gch.marked ^= LJ_GC_WHITES) 43#define flipwhite(x) ((x)->gch.marked ^= LJ_GC_WHITES)
42#define black2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK) 44#define black2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK)
43#define fixstring(s) ((s)->marked |= LJ_GC_FIXED) 45#define fixstring(s) ((s)->marked |= LJ_GC_FIXED)