diff --git a/src/logic/scripting/lua/lua_extensions.cpp b/src/logic/scripting/lua/lua_extensions.cpp index a7de3fdd8..f8a200de1 100644 --- a/src/logic/scripting/lua/lua_extensions.cpp +++ b/src/logic/scripting/lua/lua_extensions.cpp @@ -8,6 +8,7 @@ #include "engine/Engine.hpp" #include "devtools/DebuggingServer.hpp" #include "logic/scripting/scripting.hpp" +#include "util/platform.hpp" using namespace devtools; using namespace scripting; @@ -381,6 +382,10 @@ static int l_debug_is_debugging(lua::State* L) { return lua::pushboolean(L, engine->getDebuggingServer() != nullptr); } +static int l_os_clock(lua::State* L) { + return lua::pushnumber(L, platform::clock()); +} + void initialize_libs_extends(lua::State* L) { if (lua::getglobal(L, "debug")) { lua::pushcfunction(L, lua::wrap); @@ -415,4 +420,11 @@ void initialize_libs_extends(lua::State* L) { lua::pop(L); } + + if (lua::getglobal(L, "os")) { + lua::pushcfunction(L, lua::wrap); + lua::setfield(L, "clock"); + + lua::pop(L); + } } diff --git a/src/util/platform.cpp b/src/util/platform.cpp index f113641e5..d2df3e77e 100644 --- a/src/util/platform.cpp +++ b/src/util/platform.cpp @@ -327,3 +327,21 @@ bool platform::stdin_has_data() { return poll(&fds, 1, 0) == 1; #endif } + +double platform::clock() { +#ifdef _WIN32 + FILETIME createTime, exitTime, kernelTime, userTime; + + if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime)) { + ULARGE_INTEGER kernel, user; + kernel.LowPart = kernelTime.dwLowDateTime; + kernel.HighPart = kernelTime.dwHighDateTime; + user.LowPart = userTime.dwLowDateTime; + user.HighPart = userTime.dwHighDateTime; + + return static_cast(kernel.QuadPart + user.QuadPart) / 1000'0000.0; + } +#else + return std::clock() / static_cast(CLOCKS_PER_SEC); +#endif +} diff --git a/src/util/platform.hpp b/src/util/platform.hpp index 54c56a0c5..4c049a0da 100644 --- a/src/util/platform.hpp +++ b/src/util/platform.hpp @@ -25,4 +25,6 @@ namespace platform { bool open_url(const std::string& url); /// @brief Check if stdin has input bool stdin_has_data(); + /// @brief Precise wrapper for std::clock (especially for Windows) + double clock(); }