mirror of
https://github.com/love2d/megasource.git
synced 2026-08-19 04:05:09 +02:00
Update LuaJIT to the latest 2.1.0 source (1d8b747)
This commit is contained in:
+52
-18
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** State and stack handling.
|
||||
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2020 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "lj_trace.h"
|
||||
#include "lj_dispatch.h"
|
||||
#include "lj_vm.h"
|
||||
#include "lj_prng.h"
|
||||
#include "lj_lex.h"
|
||||
#include "lj_alloc.h"
|
||||
#include "luajit.h"
|
||||
@@ -60,7 +61,8 @@ static void resizestack(lua_State *L, MSize n)
|
||||
MSize oldsize = L->stacksize;
|
||||
MSize realsize = n + 1 + LJ_STACK_EXTRA;
|
||||
GCobj *up;
|
||||
lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
|
||||
lj_assertL((MSize)(tvref(L->maxstack)-oldst) == L->stacksize-LJ_STACK_EXTRA-1,
|
||||
"inconsistent stack size");
|
||||
st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
|
||||
(MSize)(oldsize*sizeof(TValue)),
|
||||
(MSize)(realsize*sizeof(TValue)));
|
||||
@@ -148,7 +150,7 @@ static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)
|
||||
/* NOBARRIER: State initialization, all objects are white. */
|
||||
setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL)));
|
||||
settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY));
|
||||
lj_str_resize(L, LJ_MIN_STRTAB-1);
|
||||
lj_str_init(L);
|
||||
lj_meta_init(L);
|
||||
lj_lex_init(L);
|
||||
fixstring(lj_err_str(L, LJ_ERR_ERRMEM)); /* Preallocate memory error msg. */
|
||||
@@ -162,16 +164,25 @@ static void close_state(lua_State *L)
|
||||
global_State *g = G(L);
|
||||
lj_func_closeuv(L, tvref(L->stack));
|
||||
lj_gc_freeall(g);
|
||||
lua_assert(gcref(g->gc.root) == obj2gco(L));
|
||||
lua_assert(g->strnum == 0);
|
||||
lj_assertG(gcref(g->gc.root) == obj2gco(L),
|
||||
"main thread is not first GC object");
|
||||
lj_assertG(g->str.num == 0, "leaked %d strings", g->str.num);
|
||||
lj_trace_freestate(g);
|
||||
#if LJ_HASFFI
|
||||
lj_ctype_freestate(g);
|
||||
#endif
|
||||
lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
|
||||
lj_str_freetab(g);
|
||||
lj_buf_free(g, &g->tmpbuf);
|
||||
lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
|
||||
lua_assert(g->gc.total == sizeof(GG_State));
|
||||
#if LJ_64
|
||||
if (mref(g->gc.lightudseg, uint32_t)) {
|
||||
MSize segnum = g->gc.lightudnum ? (2 << lj_fls(g->gc.lightudnum)) : 2;
|
||||
lj_mem_freevec(g, mref(g->gc.lightudseg, uint32_t), segnum, uint32_t);
|
||||
}
|
||||
#endif
|
||||
lj_assertG(g->gc.total == sizeof(GG_State),
|
||||
"memory leak of %lld bytes",
|
||||
(long long)(g->gc.total - sizeof(GG_State)));
|
||||
#ifndef LUAJIT_USE_SYSMALLOC
|
||||
if (g->allocf == lj_alloc_f)
|
||||
lj_alloc_destroy(g->allocd);
|
||||
@@ -181,16 +192,33 @@ static void close_state(lua_State *L)
|
||||
}
|
||||
|
||||
#if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
|
||||
lua_State *lj_state_newstate(lua_Alloc f, void *ud)
|
||||
lua_State *lj_state_newstate(lua_Alloc allocf, void *allocd)
|
||||
#else
|
||||
LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
|
||||
LUA_API lua_State *lua_newstate(lua_Alloc allocf, void *allocd)
|
||||
#endif
|
||||
{
|
||||
GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State));
|
||||
lua_State *L = &GG->L;
|
||||
global_State *g = &GG->g;
|
||||
PRNGState prng;
|
||||
GG_State *GG;
|
||||
lua_State *L;
|
||||
global_State *g;
|
||||
/* We need the PRNG for the memory allocator, so initialize this first. */
|
||||
if (!lj_prng_seed_secure(&prng)) {
|
||||
lj_assertX(0, "secure PRNG seeding failed");
|
||||
/* Can only return NULL here, so this errors with "not enough memory". */
|
||||
return NULL;
|
||||
}
|
||||
#ifndef LUAJIT_USE_SYSMALLOC
|
||||
if (allocf == LJ_ALLOCF_INTERNAL) {
|
||||
allocd = lj_alloc_create(&prng);
|
||||
if (!allocd) return NULL;
|
||||
allocf = lj_alloc_f;
|
||||
}
|
||||
#endif
|
||||
GG = (GG_State *)allocf(allocd, NULL, 0, sizeof(GG_State));
|
||||
if (GG == NULL || !checkptrGC(GG)) return NULL;
|
||||
memset(GG, 0, sizeof(GG_State));
|
||||
L = &GG->L;
|
||||
g = &GG->g;
|
||||
L->gct = ~LJ_TTHREAD;
|
||||
L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */
|
||||
L->dummy_ffid = FF_C;
|
||||
@@ -198,12 +226,18 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
|
||||
g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;
|
||||
g->strempty.marked = LJ_GC_WHITE0;
|
||||
g->strempty.gct = ~LJ_TSTR;
|
||||
g->allocf = f;
|
||||
g->allocd = ud;
|
||||
g->allocf = allocf;
|
||||
g->allocd = allocd;
|
||||
g->prng = prng;
|
||||
#ifndef LUAJIT_USE_SYSMALLOC
|
||||
if (allocf == lj_alloc_f) {
|
||||
lj_alloc_setprng(allocd, &g->prng);
|
||||
}
|
||||
#endif
|
||||
setgcref(g->mainthref, obj2gco(L));
|
||||
setgcref(g->uvhead.prev, obj2gco(&g->uvhead));
|
||||
setgcref(g->uvhead.next, obj2gco(&g->uvhead));
|
||||
g->strmask = ~(MSize)0;
|
||||
g->str.mask = ~(MSize)0;
|
||||
setnilV(registry(L));
|
||||
setnilV(&g->nilnode.val);
|
||||
setnilV(&g->nilnode.key);
|
||||
@@ -283,17 +317,17 @@ lua_State *lj_state_new(lua_State *L)
|
||||
setmrefr(L1->glref, L->glref);
|
||||
setgcrefr(L1->env, L->env);
|
||||
stack_init(L1, L); /* init stack */
|
||||
lua_assert(iswhite(obj2gco(L1)));
|
||||
lj_assertL(iswhite(obj2gco(L1)), "new thread object is not white");
|
||||
return L1;
|
||||
}
|
||||
|
||||
void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L)
|
||||
{
|
||||
lua_assert(L != mainthread(g));
|
||||
lj_assertG(L != mainthread(g), "free of main thread");
|
||||
if (obj2gco(L) == gcref(g->cur_L))
|
||||
setgcrefnull(g->cur_L);
|
||||
lj_func_closeuv(L, tvref(L->stack));
|
||||
lua_assert(gcref(L->openupval) == NULL);
|
||||
lj_assertG(gcref(L->openupval) == NULL, "stale open upvalues");
|
||||
lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
|
||||
lj_mem_freet(g, L);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user