Merge branch 'main' into debugging-client

This commit is contained in:
MihailRis
2025-11-16 19:20:42 +03:00
18 changed files with 537 additions and 5 deletions
+18
View File
@@ -1,5 +1,7 @@
#include "api_lua.hpp"
#include "io/io.hpp"
#include "io/devices/MemoryDevice.hpp"
#include "logic/scripting/scripting.hpp"
#include "engine/Engine.hpp"
#include "engine/EnginePaths.hpp"
@@ -33,9 +35,25 @@ static int l_focus(lua::State* L) {
return 0;
}
static int l_create_memory_device(lua::State* L) {
std::string name = lua::require_string(L, 1);
if (io::get_device(name)) {
throw std::runtime_error(
"entry-point '" + name + "' is already used"
);
}
if (name.find(':') != std::string::npos) {
throw std::runtime_error("invalid entry point name");
}
io::set_device(name, std::make_unique<io::MemoryDevice>());
return 0;
}
const luaL_Reg applib[] = {
{"start_debug_instance", lua::wrap<l_start_debug_instance>},
{"focus", lua::wrap<l_focus>},
{"create_memory_device", lua::wrap<l_create_memory_device>},
// for other functions see libcore.cpp and stdlib.lua
{nullptr, nullptr}
};
+20 -4
View File
@@ -5,6 +5,7 @@
#include "engine/Engine.hpp"
#include "engine/EnginePaths.hpp"
#include "io/io.hpp"
#include "io/devices/MemoryDevice.hpp"
#include "io/devices/ZipFileDevice.hpp"
#include "util/stringutil.hpp"
#include "api_lua.hpp"
@@ -49,6 +50,14 @@ static bool is_writeable(const std::string& entryPoint) {
if (entryPoint.substr(0, 2) == "W.") {
return true;
}
// todo: do better
auto device = io::get_device(entryPoint);
if (device == nullptr) {
return false;
}
if (dynamic_cast<io::MemoryDevice*>(device.get())) {
return true;
}
if (writeable_entry_points.find(entryPoint) != writeable_entry_points.end()) {
return true;
}
@@ -221,6 +230,16 @@ static int l_unmount(lua::State* L) {
return 0;
}
static int l_create_memory_device(lua::State* L) {
if (lua::isstring(L, 1)) {
throw std::runtime_error(
"name must not be specified, use app.create_memory_device instead"
);
}
auto& paths = engine->getPaths();
return lua::pushstring(L, paths.createMemoryDevice());
}
static int l_create_zip(lua::State* L) {
io::path folder = lua::require_string(L, 1);
io::path outFile = lua::require_string(L, 2);
@@ -336,7 +355,6 @@ static int l_write_descriptor(lua::State* L) {
if (!stream->good()) {
throw std::runtime_error("failed to write to stream");
}
return 0;
}
@@ -352,7 +370,6 @@ static int l_flush_descriptor(lua::State* L) {
}
scripting::descriptors_manager::flush(descriptor);
return 0;
}
@@ -364,13 +381,11 @@ static int l_close_descriptor(lua::State* L) {
}
scripting::descriptors_manager::close(descriptor);
return 0;
}
static int l_close_all_descriptors(lua::State* L) {
scripting::descriptors_manager::close_all_descriptors();
return 0;
}
@@ -396,6 +411,7 @@ const luaL_Reg filelib[] = {
{"is_writeable", lua::wrap<l_is_writeable>},
{"mount", lua::wrap<l_mount>},
{"unmount", lua::wrap<l_unmount>},
{"create_memory_device", lua::wrap<l_create_memory_device>},
{"create_zip", lua::wrap<l_create_zip>},
{"__open_descriptor", lua::wrap<l_open_descriptor>},
{"__has_descriptor", lua::wrap<l_has_descriptor>},