aboutsummaryrefslogtreecommitdiff
path: root/src/lj_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_state.c')
-rw-r--r--src/lj_state.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/lj_state.c b/src/lj_state.c
index 7081a474..a4d072be 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -25,6 +25,7 @@
25#include "lj_trace.h" 25#include "lj_trace.h"
26#include "lj_dispatch.h" 26#include "lj_dispatch.h"
27#include "lj_vm.h" 27#include "lj_vm.h"
28#include "lj_prng.h"
28#include "lj_lex.h" 29#include "lj_lex.h"
29#include "lj_alloc.h" 30#include "lj_alloc.h"
30#include "luajit.h" 31#include "luajit.h"
@@ -185,16 +186,33 @@ static void close_state(lua_State *L)
185} 186}
186 187
187#if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC)) 188#if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
188lua_State *lj_state_newstate(lua_Alloc f, void *ud) 189lua_State *lj_state_newstate(lua_Alloc allocf, void *allocd)
189#else 190#else
190LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) 191LUA_API lua_State *lua_newstate(lua_Alloc allocf, void *allocd)
191#endif 192#endif
192{ 193{
193 GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State)); 194 PRNGState prng;
194 lua_State *L = &GG->L; 195 GG_State *GG;
195 global_State *g = &GG->g; 196 lua_State *L;
197 global_State *g;
198 /* We need the PRNG for the memory allocator, so initialize this first. */
199 if (!lj_prng_seed_secure(&prng)) {
200 lj_assertX(0, "secure PRNG seeding failed");
201 /* Can only return NULL here, so this errors with "not enough memory". */
202 return NULL;
203 }
204#ifndef LUAJIT_USE_SYSMALLOC
205 if (allocf == LJ_ALLOCF_INTERNAL) {
206 allocd = lj_alloc_create(&prng);
207 if (!allocd) return NULL;
208 allocf = lj_alloc_f;
209 }
210#endif
211 GG = (GG_State *)allocf(allocd, NULL, 0, sizeof(GG_State));
196 if (GG == NULL || !checkptrGC(GG)) return NULL; 212 if (GG == NULL || !checkptrGC(GG)) return NULL;
197 memset(GG, 0, sizeof(GG_State)); 213 memset(GG, 0, sizeof(GG_State));
214 L = &GG->L;
215 g = &GG->g;
198 L->gct = ~LJ_TTHREAD; 216 L->gct = ~LJ_TTHREAD;
199 L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */ 217 L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */
200 L->dummy_ffid = FF_C; 218 L->dummy_ffid = FF_C;
@@ -202,8 +220,14 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
202 g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED; 220 g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;
203 g->strempty.marked = LJ_GC_WHITE0; 221 g->strempty.marked = LJ_GC_WHITE0;
204 g->strempty.gct = ~LJ_TSTR; 222 g->strempty.gct = ~LJ_TSTR;
205 g->allocf = f; 223 g->allocf = allocf;
206 g->allocd = ud; 224 g->allocd = allocd;
225 g->prng = prng;
226#ifndef LUAJIT_USE_SYSMALLOC
227 if (allocf == lj_alloc_f) {
228 lj_alloc_setprng(allocd, &g->prng);
229 }
230#endif
207 setgcref(g->mainthref, obj2gco(L)); 231 setgcref(g->mainthref, obj2gco(L));
208 setgcref(g->uvhead.prev, obj2gco(&g->uvhead)); 232 setgcref(g->uvhead.prev, obj2gco(&g->uvhead));
209 setgcref(g->uvhead.next, obj2gco(&g->uvhead)); 233 setgcref(g->uvhead.next, obj2gco(&g->uvhead));