Changeset View
Changeset View
Standalone View
Standalone View
source/ps/scripting/JSInterface_Debug.cpp
Show All 17 Lines | |||||
#include "precompiled.h" | #include "precompiled.h" | ||||
#include "JSInterface_Debug.h" | #include "JSInterface_Debug.h" | ||||
#include "i18n/L10n.h" | #include "i18n/L10n.h" | ||||
#include "lib/svn_revision.h" | #include "lib/svn_revision.h" | ||||
#include "lib/debug.h" | #include "lib/debug.h" | ||||
#include "scriptinterface/ScriptInterface.h" | #include "scriptinterface/ScriptInterface.h" | ||||
#include "scriptinterface/FunctionWrapper.h" | |||||
#include <string> | #include <string> | ||||
/** | /** | ||||
* Microseconds since the epoch. | * Microseconds since the epoch. | ||||
*/ | */ | ||||
double JSI_Debug::GetMicroseconds(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | double JSI_Debug::GetMicroseconds() | ||||
{ | { | ||||
return JS_Now(); | return JS_Now(); | ||||
} | } | ||||
// Deliberately cause the game to crash. | // Deliberately cause the game to crash. | ||||
// Currently implemented via access violation (read of address 0). | // Currently implemented via access violation (read of address 0). | ||||
// Useful for testing the crashlog/stack trace code. | // Useful for testing the crashlog/stack trace code. | ||||
int JSI_Debug::Crash(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | int JSI_Debug::Crash() | ||||
{ | { | ||||
debug_printf("Crashing at user's request.\n"); | debug_printf("Crashing at user's request.\n"); | ||||
return *(volatile int*)0; | return *(volatile int*)0; | ||||
} | } | ||||
void JSI_Debug::DebugWarn(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | void JSI_Debug::DebugWarn() | ||||
{ | { | ||||
debug_warn(L"Warning at user's request."); | debug_warn(L"Warning at user's request."); | ||||
} | } | ||||
void JSI_Debug::DisplayErrorDialog(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& msg) | void JSI_Debug::DisplayErrorDialog(const std::wstring& msg) | ||||
{ | { | ||||
debug_DisplayError(msg.c_str(), DE_NO_DEBUG_INFO, NULL, NULL, NULL, 0, NULL, NULL); | debug_DisplayError(msg.c_str(), DE_NO_DEBUG_INFO, NULL, NULL, NULL, 0, NULL, NULL); | ||||
} | } | ||||
// Return the date at which the current executable was compiled. | // Return the date at which the current executable was compiled. | ||||
// - Displayed on main menu screen; tells non-programmers which auto-build | // - Displayed on main menu screen; tells non-programmers which auto-build | ||||
// they are running. Could also be determined via .EXE file properties, | // they are running. Could also be determined via .EXE file properties, | ||||
// but that's a bit more trouble. | // but that's a bit more trouble. | ||||
std::wstring JSI_Debug::GetBuildDate(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | std::wstring JSI_Debug::GetBuildDate() | ||||
{ | { | ||||
UDate buildDate = g_L10n.ParseDateTime(__DATE__, "MMM d yyyy", icu::Locale::getUS()); | UDate buildDate = g_L10n.ParseDateTime(__DATE__, "MMM d yyyy", icu::Locale::getUS()); | ||||
return wstring_from_utf8(g_L10n.LocalizeDateTime(buildDate, L10n::Date, icu::SimpleDateFormat::MEDIUM)); | return wstring_from_utf8(g_L10n.LocalizeDateTime(buildDate, L10n::Date, icu::SimpleDateFormat::MEDIUM)); | ||||
} | } | ||||
double JSI_Debug::GetBuildTimestamp(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | double JSI_Debug::GetBuildTimestamp() | ||||
{ | { | ||||
UDate buildDate = g_L10n.ParseDateTime(__DATE__ " " __TIME__, "MMM d yyyy HH:mm:ss", icu::Locale::getUS()); | UDate buildDate = g_L10n.ParseDateTime(__DATE__ " " __TIME__, "MMM d yyyy HH:mm:ss", icu::Locale::getUS()); | ||||
if (buildDate) | if (buildDate) | ||||
return buildDate / 1000.0; | return buildDate / 1000.0; | ||||
return std::time(nullptr); | return std::time(nullptr); | ||||
} | } | ||||
// Return the revision number at which the current executable was compiled. | // Return the revision number at which the current executable was compiled. | ||||
// - svn revision is generated by calling svnversion and cached in | // - svn revision is generated by calling svnversion and cached in | ||||
// lib/svn_revision.cpp. it is useful to know when attempting to | // lib/svn_revision.cpp. it is useful to know when attempting to | ||||
// reproduce bugs (the main EXE and PDB should be temporarily reverted to | // reproduce bugs (the main EXE and PDB should be temporarily reverted to | ||||
// that revision so that they match user-submitted crashdumps). | // that revision so that they match user-submitted crashdumps). | ||||
std::wstring JSI_Debug::GetBuildRevision(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) | std::wstring JSI_Debug::GetBuildRevision() | ||||
{ | { | ||||
std::wstring svnRevision(svn_revision); | std::wstring svnRevision(svn_revision); | ||||
if (svnRevision == L"custom build") | if (svnRevision == L"custom build") | ||||
return wstring_from_utf8(g_L10n.Translate("custom build")); | return wstring_from_utf8(g_L10n.Translate("custom build")); | ||||
return svnRevision; | return svnRevision; | ||||
} | } | ||||
void JSI_Debug::RegisterScriptFunctions(const ScriptInterface& scriptInterface) | void JSI_Debug::RegisterScriptFunctions(const ScriptInterface& scriptInterface) | ||||
{ | { | ||||
scriptInterface.RegisterFunction<double, &GetMicroseconds>("GetMicroseconds"); | #define Register(name) ScriptWrapper::WrapAndRegister<decltype(&name), &name>(scriptInterface, #name) | ||||
scriptInterface.RegisterFunction<int, &Crash>("Crash"); | Register(GetMicroseconds); | ||||
scriptInterface.RegisterFunction<void, &DebugWarn>("DebugWarn"); | Register(Crash); | ||||
scriptInterface.RegisterFunction<void, std::wstring, &DisplayErrorDialog>("DisplayErrorDialog"); | Register(DebugWarn); | ||||
scriptInterface.RegisterFunction<std::wstring, &GetBuildDate>("GetBuildDate"); | Register(DisplayErrorDialog); | ||||
scriptInterface.RegisterFunction<double, &GetBuildTimestamp>("GetBuildTimestamp"); | Register(GetBuildDate); | ||||
scriptInterface.RegisterFunction<std::wstring, &GetBuildRevision>("GetBuildRevision"); | Register(GetBuildTimestamp); | ||||
Register(GetBuildRevision); | |||||
#undef Register | |||||
} | } |
Wildfire Games · Phabricator