diff options
author | Mike Pall <mike> | 2013-10-14 19:34:06 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-10-14 19:34:06 +0200 |
commit | d0b48ec996cb20f05f5c7b0059eddf0da9198de0 (patch) | |
tree | aadf4957fa380fc70947267218e5a5bc91c396f9 | |
parent | 4ccb2dd3bb576f742f987cf0027214e733325404 (diff) | |
parent | 5d25645a210f32dddecde9c50afb14f9ee63e180 (diff) | |
download | luajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.tar.gz luajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.tar.bz2 luajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.zip |
Merge branch 'master' into v2.1
-rw-r--r-- | src/lj_gc.c | 7 | ||||
-rw-r--r-- | src/lj_obj.h | 2 | ||||
-rw-r--r-- | src/lj_tab.c | 7 | ||||
-rw-r--r-- | src/lj_tab.h | 3 |
4 files changed, 18 insertions, 1 deletions
diff --git a/src/lj_gc.c b/src/lj_gc.c index bc10822f..572e4710 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
@@ -493,6 +493,7 @@ static void gc_finalize(lua_State *L) | |||
493 | setcdataV(L, &tmp, gco2cd(o)); | 493 | setcdataV(L, &tmp, gco2cd(o)); |
494 | tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp); | 494 | tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp); |
495 | if (!tvisnil(tv)) { | 495 | if (!tvisnil(tv)) { |
496 | g->gc.nocdatafin = 0; | ||
496 | copyTV(L, &tmp, tv); | 497 | copyTV(L, &tmp, tv); |
497 | setnilV(tv); /* Clear entry in finalizer table. */ | 498 | setnilV(tv); /* Clear entry in finalizer table. */ |
498 | gc_call_finalizer(g, L, &tmp, o); | 499 | gc_call_finalizer(g, L, &tmp, o); |
@@ -629,6 +630,9 @@ static size_t gc_onestep(lua_State *L) | |||
629 | lj_str_resize(L, g->strmask >> 1); /* Shrink string table. */ | 630 | lj_str_resize(L, g->strmask >> 1); /* Shrink string table. */ |
630 | if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ | 631 | if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ |
631 | g->gc.state = GCSfinalize; | 632 | g->gc.state = GCSfinalize; |
633 | #if LJ_HASFFI | ||
634 | g->gc.nocdatafin = 1; | ||
635 | #endif | ||
632 | } else { /* Otherwise skip this phase to help the JIT. */ | 636 | } else { /* Otherwise skip this phase to help the JIT. */ |
633 | g->gc.state = GCSpause; /* End of GC cycle. */ | 637 | g->gc.state = GCSpause; /* End of GC cycle. */ |
634 | g->gc.debt = 0; | 638 | g->gc.debt = 0; |
@@ -647,6 +651,9 @@ static size_t gc_onestep(lua_State *L) | |||
647 | g->gc.estimate -= GCFINALIZECOST; | 651 | g->gc.estimate -= GCFINALIZECOST; |
648 | return GCFINALIZECOST; | 652 | return GCFINALIZECOST; |
649 | } | 653 | } |
654 | #if LJ_HASFFI | ||
655 | if (!g->gc.nocdatafin) lj_tab_rehash(L, ctype_ctsG(g)->finalizer); | ||
656 | #endif | ||
650 | g->gc.state = GCSpause; /* End of GC cycle. */ | 657 | g->gc.state = GCSpause; /* End of GC cycle. */ |
651 | g->gc.debt = 0; | 658 | g->gc.debt = 0; |
652 | return 0; | 659 | return 0; |
diff --git a/src/lj_obj.h b/src/lj_obj.h index b1bbf1c9..2d7a19a1 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
@@ -494,7 +494,7 @@ typedef struct GCState { | |||
494 | MSize threshold; /* Memory threshold. */ | 494 | MSize threshold; /* Memory threshold. */ |
495 | uint8_t currentwhite; /* Current white color. */ | 495 | uint8_t currentwhite; /* Current white color. */ |
496 | uint8_t state; /* GC state. */ | 496 | uint8_t state; /* GC state. */ |
497 | uint8_t unused1; | 497 | uint8_t nocdatafin; /* No cdata finalizer called. */ |
498 | uint8_t unused2; | 498 | uint8_t unused2; |
499 | MSize sweepstr; /* Sweep position in string table. */ | 499 | MSize sweepstr; /* Sweep position in string table. */ |
500 | GCRef root; /* List of all collectable objects. */ | 500 | GCRef root; /* List of all collectable objects. */ |
diff --git a/src/lj_tab.c b/src/lj_tab.c index 496904ee..37a3c32c 100644 --- a/src/lj_tab.c +++ b/src/lj_tab.c | |||
@@ -357,6 +357,13 @@ static void rehashtab(lua_State *L, GCtab *t, cTValue *ek) | |||
357 | resizetab(L, t, asize, hsize2hbits(total)); | 357 | resizetab(L, t, asize, hsize2hbits(total)); |
358 | } | 358 | } |
359 | 359 | ||
360 | #if LJ_HASFFI | ||
361 | void lj_tab_rehash(lua_State *L, GCtab *t) | ||
362 | { | ||
363 | rehashtab(L, t, niltv(L)); | ||
364 | } | ||
365 | #endif | ||
366 | |||
360 | void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize) | 367 | void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize) |
361 | { | 368 | { |
362 | resizetab(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0); | 369 | resizetab(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0); |
diff --git a/src/lj_tab.h b/src/lj_tab.h index c57bdd82..5ec73286 100644 --- a/src/lj_tab.h +++ b/src/lj_tab.h | |||
@@ -40,6 +40,9 @@ LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize); | |||
40 | #endif | 40 | #endif |
41 | LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); | 41 | LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); |
42 | LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); | 42 | LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); |
43 | #if LJ_HASFFI | ||
44 | LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t); | ||
45 | #endif | ||
43 | LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); | 46 | LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); |
44 | 47 | ||
45 | /* Caveat: all getters except lj_tab_get() can return NULL! */ | 48 | /* Caveat: all getters except lj_tab_get() can return NULL! */ |