mirror of
https://github.com/luau-lang/luau.git
synced 2025-05-04 10:33:46 +01:00
Switch to using interrupt handler
This commit is contained in:
parent
2578a9a342
commit
278fb91287
4 changed files with 37 additions and 12 deletions
25
CLI/Repl.cpp
25
CLI/Repl.cpp
|
@ -21,6 +21,10 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <csignal>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
LUAU_FASTFLAG(DebugLuauTimeTracing)
|
LUAU_FASTFLAG(DebugLuauTimeTracing)
|
||||||
|
@ -42,6 +46,12 @@ enum class CompileFormat
|
||||||
|
|
||||||
constexpr int MaxTraversalLimit = 50;
|
constexpr int MaxTraversalLimit = 50;
|
||||||
|
|
||||||
|
// Ctrl-C handling
|
||||||
|
volatile sig_atomic_t sigint_received = 0;
|
||||||
|
static void handle_sig(int signum) {
|
||||||
|
sigint_received = 1;
|
||||||
|
}
|
||||||
|
|
||||||
struct GlobalOptions
|
struct GlobalOptions
|
||||||
{
|
{
|
||||||
int optimizationLevel = 1;
|
int optimizationLevel = 1;
|
||||||
|
@ -489,12 +499,27 @@ static void runReplImpl(lua_State* L)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ihandler(lua_State* L, int k) {
|
||||||
|
if (sigint_received) {
|
||||||
|
// when VM_INTERRUPT sees that the status is non-zero it will
|
||||||
|
// exit the interpreter loop
|
||||||
|
lua_setstatus(L,LUA_SIGINT);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static void runRepl()
|
static void runRepl()
|
||||||
{
|
{
|
||||||
std::unique_ptr<lua_State, void (*)(lua_State*)> globalState(luaL_newstate(), lua_close);
|
std::unique_ptr<lua_State, void (*)(lua_State*)> globalState(luaL_newstate(), lua_close);
|
||||||
lua_State* L = globalState.get();
|
lua_State* L = globalState.get();
|
||||||
|
|
||||||
setupState(L);
|
setupState(L);
|
||||||
|
|
||||||
|
// FIXME: add corresponding windows functionality
|
||||||
|
#ifndef _WIN32
|
||||||
|
signal(SIGINT, handle_sig);
|
||||||
|
lua_setinterrupt(L, &ihandler);
|
||||||
|
#endif
|
||||||
|
|
||||||
luaL_sandboxthread(L);
|
luaL_sandboxthread(L);
|
||||||
runReplImpl(L);
|
runReplImpl(L);
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,6 +206,8 @@ LUA_API void lua_rawset(lua_State* L, int idx);
|
||||||
LUA_API void lua_rawseti(lua_State* L, int idx, int n);
|
LUA_API void lua_rawseti(lua_State* L, int idx, int n);
|
||||||
LUA_API int lua_setmetatable(lua_State* L, int objindex);
|
LUA_API int lua_setmetatable(lua_State* L, int objindex);
|
||||||
LUA_API int lua_setfenv(lua_State* L, int idx);
|
LUA_API int lua_setfenv(lua_State* L, int idx);
|
||||||
|
LUA_API void lua_setstatus(lua_State* L, int status);
|
||||||
|
LUA_API void lua_setinterrupt(lua_State* L, void (*interrupt)(lua_State* Lp, int k));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** `load' and `call' functions (load and run Luau bytecode)
|
** `load' and `call' functions (load and run Luau bytecode)
|
||||||
|
|
|
@ -811,6 +811,16 @@ void lua_getfenv(lua_State* L, int idx)
|
||||||
** set functions (stack -> Lua)
|
** set functions (stack -> Lua)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void lua_setstatus(lua_State* L, int status) {
|
||||||
|
L->status = status;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lua_setinterrupt(lua_State* L, void (*interrupt)(lua_State* Lp, int k)) {
|
||||||
|
L->global->cb.interrupt = interrupt;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void lua_settable(lua_State* L, int idx)
|
void lua_settable(lua_State* L, int idx)
|
||||||
{
|
{
|
||||||
api_checknelems(L, 2);
|
api_checknelems(L, 2);
|
||||||
|
|
|
@ -74,12 +74,6 @@
|
||||||
#else
|
#else
|
||||||
#define VM_INTERRUPT() \
|
#define VM_INTERRUPT() \
|
||||||
{ \
|
{ \
|
||||||
if (sigint_received)\
|
|
||||||
{ \
|
|
||||||
sigint_received = 0; \
|
|
||||||
L->status = LUA_SIGINT; \
|
|
||||||
goto exit; \
|
|
||||||
} \
|
|
||||||
void (*interrupt)(lua_State*, int) = L->global->cb.interrupt; \
|
void (*interrupt)(lua_State*, int) = L->global->cb.interrupt; \
|
||||||
if (LUAU_UNLIKELY(!!interrupt)) \
|
if (LUAU_UNLIKELY(!!interrupt)) \
|
||||||
{ /* the interrupt hook is called right before we advance pc */ \
|
{ /* the interrupt hook is called right before we advance pc */ \
|
||||||
|
@ -131,10 +125,6 @@
|
||||||
* VM_CONTINUE() Use an opcode override to dispatch with computed goto or
|
* VM_CONTINUE() Use an opcode override to dispatch with computed goto or
|
||||||
* switch statement to skip a LOP_BREAK instruction.
|
* switch statement to skip a LOP_BREAK instruction.
|
||||||
*/
|
*/
|
||||||
volatile sig_atomic_t sigint_received = 0;
|
|
||||||
static void handle_sig(int signum) {
|
|
||||||
sigint_received = 1;
|
|
||||||
}
|
|
||||||
#if VM_USE_CGOTO
|
#if VM_USE_CGOTO
|
||||||
#define VM_CASE(op) CASE_##op:
|
#define VM_CASE(op) CASE_##op:
|
||||||
|
|
||||||
|
@ -332,8 +322,6 @@ static void luau_execute(lua_State* L)
|
||||||
base = L->base;
|
base = L->base;
|
||||||
k = cl->l.p->k;
|
k = cl->l.p->k;
|
||||||
|
|
||||||
signal(SIGINT, handle_sig);
|
|
||||||
|
|
||||||
VM_NEXT(); // starts the interpreter "loop"
|
VM_NEXT(); // starts the interpreter "loop"
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue