diff options
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 22 |
1 files changed, 13 insertions, 9 deletions
@@ -321,11 +321,8 @@ void luaE_freethread (lua_State *L, lua_State *L1) { | |||
321 | } | 321 | } |
322 | 322 | ||
323 | 323 | ||
324 | int lua_resetthread (lua_State *L) { | 324 | int luaE_resetthread (lua_State *L, int status) { |
325 | CallInfo *ci; | 325 | CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */ |
326 | int status = L->status; | ||
327 | lua_lock(L); | ||
328 | L->ci = ci = &L->base_ci; /* unwind CallInfo list */ | ||
329 | setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */ | 326 | setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */ |
330 | ci->func = L->stack; | 327 | ci->func = L->stack; |
331 | ci->callstatus = CIST_C; | 328 | ci->callstatus = CIST_C; |
@@ -334,12 +331,19 @@ int lua_resetthread (lua_State *L) { | |||
334 | status = luaD_closeprotected(L, 0, status); | 331 | status = luaD_closeprotected(L, 0, status); |
335 | if (status != LUA_OK) /* errors? */ | 332 | if (status != LUA_OK) /* errors? */ |
336 | luaD_seterrorobj(L, status, L->stack + 1); | 333 | luaD_seterrorobj(L, status, L->stack + 1); |
337 | else { | 334 | else |
338 | status = LUA_OK; | ||
339 | L->top = L->stack + 1; | 335 | L->top = L->stack + 1; |
340 | } | ||
341 | ci->top = L->top + LUA_MINSTACK; | 336 | ci->top = L->top + LUA_MINSTACK; |
342 | L->status = status; | 337 | L->status = cast_byte(status); |
338 | luaD_reallocstack(L, cast_int(ci->top - L->stack), 0); | ||
339 | return status; | ||
340 | } | ||
341 | |||
342 | |||
343 | LUA_API int lua_resetthread (lua_State *L) { | ||
344 | int status; | ||
345 | lua_lock(L); | ||
346 | status = luaE_resetthread(L, L->status); | ||
343 | lua_unlock(L); | 347 | lua_unlock(L); |
344 | return status; | 348 | return status; |
345 | } | 349 | } |