diff options
author | Mike Pall <mike> | 2011-05-23 02:43:36 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-05-23 02:43:36 +0200 |
commit | 7b21a660a89367db4ab50a85aa32a1ffd5a88623 (patch) | |
tree | 937ab4fae2eb3611f2d67e9a1b4118e9accb4ed9 /src | |
parent | 288085afbe916ac334dbc88ee2da836fb837bbca (diff) | |
download | luajit-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.c | 3 | ||||
-rw-r--r-- | src/lj_gc.c | 8 | ||||
-rw-r--r-- | src/lj_gc.h | 2 |
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) |