add engine pause mode

This commit is contained in:
MihailRis
2025-10-07 18:02:06 +03:00
parent c152cfc03f
commit 95f30da49b
4 changed files with 114 additions and 77 deletions
+9
View File
@@ -168,6 +168,15 @@ bool DebuggingServer::performCommand(
void DebuggingServer::onHitBreakpoint(dv::value&& stackTrace) { void DebuggingServer::onHitBreakpoint(dv::value&& stackTrace) {
logger.info() << "hit breakpoint:\n" logger.info() << "hit breakpoint:\n"
<< json::stringify(stackTrace, true, " "); << json::stringify(stackTrace, true, " ");
if (connection == nullptr) {
return;
}
connection->send(dv::object({
{"type", std::string("hit-breakpoint")},
{"stack", std::move(stackTrace)}
}));
engine.startPauseLoop();
} }
void DebuggingServer::setClient(u64id_t client) { void DebuggingServer::setClient(u64id_t client) {
+24
View File
@@ -309,6 +309,30 @@ void Engine::nextFrame() {
input->pollEvents(); input->pollEvents();
} }
void Engine::startPauseLoop() {
bool initialCursorLocked = false;
if (!isHeadless()) {
initialCursorLocked = input->isCursorLocked();
if (initialCursorLocked) {
input->toggleCursor();
}
}
while (!isQuitSignal()) {
if (!debuggingServer->update()) {
debuggingServer.reset();
break;
}
if (isHeadless()) {
platform::sleep(1.0 / params.tps * 1000);
} else {
nextFrame();
}
}
if (initialCursorLocked) {
input->toggleCursor();
}
}
void Engine::renderFrame() { void Engine::renderFrame() {
screen->draw(time.getDelta()); screen->draw(time.getDelta());
+1
View File
@@ -108,6 +108,7 @@ public:
void updateFrontend(); void updateFrontend();
void renderFrame(); void renderFrame();
void nextFrame(); void nextFrame();
void startPauseLoop();
/// @brief Set screen (scene). /// @brief Set screen (scene).
/// nullptr may be used to delete previous screen before creating new one, /// nullptr may be used to delete previous screen before creating new one,
+28 -25
View File
@@ -164,30 +164,7 @@ static int l_math_normal_random(lua::State* L) {
constexpr inline int MAX_SHORT_STRING_LEN = 50; constexpr inline int MAX_SHORT_STRING_LEN = 50;
static dv::value create_stack_trace(lua_State* L, int initFrame = 2) { static dv::value collect_locals(lua::State* L, lua_Debug& frame) {
auto entriesList = dv::list();
lua_Debug frame;
int level = initFrame;
while (lua_getstack(L, level, &frame)) {
auto entry = dv::object();
if (lua_getinfo(L, "nSlf", &frame) == 0) {
level++;
entriesList.add(std::move(entry));
continue;
}
if (frame.name) {
entry["function"] = frame.name;
}
if (frame.source) {
const char* src =
(frame.source[0] == '@') ? frame.source + 1 : frame.source;
entry["source"] = src;
entry["line"] = frame.currentline;
}
entry["what"] = frame.what;
auto locals = dv::object(); auto locals = dv::object();
int localIndex = 1; int localIndex = 1;
@@ -262,7 +239,33 @@ static dv::value create_stack_trace(lua_State* L, int initFrame = 2) {
locals[name] = std::move(local); locals[name] = std::move(local);
lua::pop(L); lua::pop(L);
} }
entry["locals"] = std::move(locals); return locals;
}
static dv::value create_stack_trace(lua::State* L, int initFrame = 2) {
auto entriesList = dv::list();
lua_Debug frame;
int level = initFrame;
while (lua_getstack(L, level, &frame)) {
auto entry = dv::object();
if (lua_getinfo(L, "nSlf", &frame) == 0) {
level++;
entriesList.add(std::move(entry));
continue;
}
if (frame.name) {
entry["function"] = frame.name;
}
if (frame.source) {
const char* src =
(frame.source[0] == '@') ? frame.source + 1 : frame.source;
entry["source"] = src;
entry["line"] = frame.currentline;
}
entry["what"] = frame.what;
entry["locals"] = collect_locals(L, frame);
entriesList.add(std::move(entry)); entriesList.add(std::move(entry));
level++; level++;
} }