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! */ |
