aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-10-14 19:34:06 +0200
committerMike Pall <mike>2013-10-14 19:34:06 +0200
commitd0b48ec996cb20f05f5c7b0059eddf0da9198de0 (patch)
treeaadf4957fa380fc70947267218e5a5bc91c396f9
parent4ccb2dd3bb576f742f987cf0027214e733325404 (diff)
parent5d25645a210f32dddecde9c50afb14f9ee63e180 (diff)
downloadluajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.tar.gz
luajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.tar.bz2
luajit-d0b48ec996cb20f05f5c7b0059eddf0da9198de0.zip
Merge branch 'master' into v2.1
-rw-r--r--src/lj_gc.c7
-rw-r--r--src/lj_obj.h2
-rw-r--r--src/lj_tab.c7
-rw-r--r--src/lj_tab.h3
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
361void lj_tab_rehash(lua_State *L, GCtab *t)
362{
363 rehashtab(L, t, niltv(L));
364}
365#endif
366
360void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize) 367void 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
41LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); 41LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt);
42LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); 42LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t);
43#if LJ_HASFFI
44LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t);
45#endif
43LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); 46LJ_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! */