One possible approach might be run restore in a new lua thread, swapping Lt so it could still resume and yield.Would you still have the context of the original script at that point? Some restore() functions may need to make decisions based on the state of some of the original program's variables.
Globals are shared between threads, so it should be possible, but some existing scripts might not behave the same.
A little more background:
The interrupt key is detected when the running script is yielded at some arbitrary and unknown point, either by yielding call like sleep() or the debug hook.
The current code just calls the global function "restore", in the same thread as the main script (Lt in the code) It's not totally clear to me if this is even technically valid, since the thread is theoretically suspended.
Since it is called in a standalone call to lua_pcall, it doesn't have any way to resume if the underlying code yields. In fact, it's not clear to me that yielding in a pcall is valid either.
There isn't really a clear way to externally kill a thread either, although it should be cleaned up when lua_close is called on the main lua state. This raises another issue, since the GC methods are probably only called on lua_close, and these can't yield either.