mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-01-19 03:57:14 +01:00
More documentation in the core class code. Minor code adjustments. Removed leftover includes.
This commit is contained in:
parent
ed1771d376
commit
1ebb2d15ce
@ -4,14 +4,11 @@
|
|||||||
#include "Register.hpp"
|
#include "Register.hpp"
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
#include "Base/Color3.hpp"
|
|
||||||
#include "Base/Vector2i.hpp"
|
|
||||||
#include "Misc/Automobile.hpp"
|
#include "Misc/Automobile.hpp"
|
||||||
#include "Misc/Model.hpp"
|
#include "Misc/Model.hpp"
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
#include <SimpleIni.h>
|
#include <SimpleIni.h>
|
||||||
#include <format.h>
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
#include <sqstdio.h>
|
#include <sqstdio.h>
|
||||||
@ -404,38 +401,41 @@ void Core::DestroyVM() noexcept
|
|||||||
bool Core::LoadScripts() noexcept
|
bool Core::LoadScripts() noexcept
|
||||||
{
|
{
|
||||||
LogDbg("Attempting to compile the specified scripts");
|
LogDbg("Attempting to compile the specified scripts");
|
||||||
|
// See if the config file was loaded
|
||||||
if (!g_Config)
|
if (!g_Config)
|
||||||
{
|
{
|
||||||
LogWrn("Cannot compile any scripts without the configurations");
|
LogWrn("Cannot compile any scripts without the configurations");
|
||||||
|
// No point in loading the plugin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Attempt to retrieve the list of strings specified in the config
|
||||||
CSimpleIniA::TNamesDepend script_list;
|
CSimpleIniA::TNamesDepend script_list;
|
||||||
g_Config->GetAllValues("Scripts", "Source", script_list);
|
g_Config->GetAllValues("Scripts", "Source", script_list);
|
||||||
|
// See if any script was specified
|
||||||
if (script_list.size() <= 0)
|
if (script_list.size() <= 0)
|
||||||
{
|
{
|
||||||
LogWrn("No scripts specified in the configuration file");
|
LogWrn("No scripts specified in the configuration file");
|
||||||
|
// No point in loading the plugin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Sort the list in it's original order
|
||||||
script_list.sort(CSimpleIniA::Entry::LoadOrder());
|
script_list.sort(CSimpleIniA::Entry::LoadOrder());
|
||||||
|
// Process each specified script path
|
||||||
for (auto const & cfg_script : script_list)
|
for (auto const & cfg_script : script_list)
|
||||||
{
|
{
|
||||||
|
// Get the file path as a string
|
||||||
string path(cfg_script.pItem);
|
string path(cfg_script.pItem);
|
||||||
|
// See if it wasn't already loaded
|
||||||
if (m_Scripts.find(path) != m_Scripts.cend())
|
if (m_Scripts.find(path) != m_Scripts.cend())
|
||||||
{
|
{
|
||||||
LogWrn("Script was already loaded: %s", path.c_str());
|
LogWrn("Script was already loaded: %s", path.c_str());
|
||||||
|
// No point in loading it again
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// Attempt to compile it
|
||||||
else if (!Compile(path))
|
else if (!Compile(path))
|
||||||
{
|
{
|
||||||
|
// Plugin shouldn't load
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -443,65 +443,72 @@ bool Core::LoadScripts() noexcept
|
|||||||
LogScs("Successfully compiled script: %s", path.c_str());
|
LogScs("Successfully compiled script: %s", path.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// See if any script could be compiled
|
||||||
if (m_Scripts.empty())
|
if (m_Scripts.empty())
|
||||||
{
|
{
|
||||||
LogErr("No scripts compiled. No reason to load the plugin");
|
LogErr("No scripts compiled. No reason to load the plugin");
|
||||||
|
// No point in loading the plugin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// At this point everything went as expected
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool Core::Compile(const string & name) noexcept
|
bool Core::Compile(const string & name) noexcept
|
||||||
{
|
{
|
||||||
|
// See if the specified script path is valid
|
||||||
if (name.empty())
|
if (name.empty())
|
||||||
{
|
{
|
||||||
LogErr("Cannot compile script without a valid name");
|
LogErr("Cannot compile script without a valid name");
|
||||||
|
// Failed to compile the specified script
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Create a new script container and insert it into the script pool
|
||||||
std::pair< SqScriptPool::iterator, bool > res = m_Scripts.emplace(name, Script(m_VM));
|
std::pair< SqScriptPool::iterator, bool > res = m_Scripts.emplace(name, Script(m_VM));
|
||||||
|
// See if the script container could be created and inserted
|
||||||
if (res.second)
|
if (res.second)
|
||||||
{
|
{
|
||||||
|
// Attempt to load and compile the specified script file
|
||||||
res.first->second.CompileFile(name);
|
res.first->second.CompileFile(name);
|
||||||
|
// See if any compile time error occurred in the compiled script
|
||||||
if (Error::Occurred(m_VM))
|
if (Error::Occurred(m_VM))
|
||||||
{
|
{
|
||||||
|
// Output debugging information
|
||||||
LogErr("Unable to compile script: %s", name.c_str());
|
LogErr("Unable to compile script: %s", name.c_str());
|
||||||
LogInf("=> %s", Error::Message(m_VM).c_str());
|
LogInf("=> %s", Error::Message(m_VM).c_str());
|
||||||
|
// Release the script container
|
||||||
m_Scripts.erase(res.first);
|
m_Scripts.erase(res.first);
|
||||||
|
// Failed to compile the specified script
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Failed to create the script container
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogErr("Unable to queue script: %s", name.c_str());
|
LogErr("Unable to queue script: %s", name.c_str());
|
||||||
|
// Failed to compile the specified script
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// At this point everything went as it should
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Execute() noexcept
|
bool Core::Execute() noexcept
|
||||||
{
|
{
|
||||||
LogDbg("Attempting to execute the specified scripts");
|
LogDbg("Attempting to execute the specified scripts");
|
||||||
|
// Go through each loaded script
|
||||||
for (auto & elem : m_Scripts)
|
for (auto & elem : m_Scripts)
|
||||||
{
|
{
|
||||||
|
// Attempt to execute the script
|
||||||
elem.second.Run();
|
elem.second.Run();
|
||||||
|
// See if the executed script had any errors
|
||||||
if (Error::Occurred(m_VM))
|
if (Error::Occurred(m_VM))
|
||||||
{
|
{
|
||||||
|
// Output the error information
|
||||||
LogErr("Unable to execute script: %s", elem.first.c_str());
|
LogErr("Unable to execute script: %s", elem.first.c_str());
|
||||||
LogInf("=> %s", Error::Message(m_VM).c_str());
|
LogInf("=> %s", Error::Message(m_VM).c_str());
|
||||||
|
// Failed to execute scripts
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -509,7 +516,7 @@ bool Core::Execute() noexcept
|
|||||||
LogScs("Successfully executed script: %s", elem.first.c_str());
|
LogScs("Successfully executed script: %s", elem.first.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// At this point everything succeeded
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,23 +524,24 @@ bool Core::Execute() noexcept
|
|||||||
void Core::PrintCallstack() noexcept
|
void Core::PrintCallstack() noexcept
|
||||||
{
|
{
|
||||||
SQStackInfos si;
|
SQStackInfos si;
|
||||||
|
// Begin a new section in the console
|
||||||
|
|
||||||
LogMsg("%s", CenterStr("CALLSTACK", '*'));
|
LogMsg("%s", CenterStr("CALLSTACK", '*'));
|
||||||
|
// Trace back the function call
|
||||||
for (SQInteger level = 1; SQ_SUCCEEDED(sq_stackinfos(m_VM, level, &si)); ++level)
|
for (SQInteger level = 1; SQ_SUCCEEDED(sq_stackinfos(m_VM, level, &si)); ++level)
|
||||||
{
|
{
|
||||||
|
// Function name
|
||||||
LogInf("FUNCTION %s()", si.funcname ? si.funcname : _SC("unknown"));
|
LogInf("FUNCTION %s()", si.funcname ? si.funcname : _SC("unknown"));
|
||||||
|
// Function location
|
||||||
LogInf("=> [%d] : {%s}", si.line, si.source ? si.source : _SC("unknown"));
|
LogInf("=> [%d] : {%s}", si.line, si.source ? si.source : _SC("unknown"));
|
||||||
}
|
}
|
||||||
|
// Dummy variables used to retrieve values from the Squirrel VM
|
||||||
const SQChar * s_ = 0, * name = 0;
|
const SQChar * s_ = 0, * name = 0;
|
||||||
SQInteger i_, seq = 0;
|
SQInteger i_, seq = 0;
|
||||||
SQFloat f_;
|
SQFloat f_;
|
||||||
SQUserPointer p_;
|
SQUserPointer p_;
|
||||||
|
// Begin a new section in the console
|
||||||
LogMsg("%s", CenterStr("LOCALS", '*'));
|
LogMsg("%s", CenterStr("LOCALS", '*'));
|
||||||
|
// Process each local variable
|
||||||
for (SQInteger level = 0; level < 10; level++) {
|
for (SQInteger level = 0; level < 10; level++) {
|
||||||
seq = 0;
|
seq = 0;
|
||||||
while((name = sq_getlocal(m_VM, level, seq))) {
|
while((name = sq_getlocal(m_VM, level, seq))) {
|
||||||
@ -688,13 +696,14 @@ void Core::ErrorFunc(HSQUIRRELVM vm, const SQChar * str, ...) noexcept
|
|||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
SQInteger Core::RuntimeErrorHandler(HSQUIRRELVM vm) noexcept
|
SQInteger Core::RuntimeErrorHandler(HSQUIRRELVM vm) noexcept
|
||||||
{
|
{
|
||||||
|
// Verify the top of the stack and whether there's any information to process
|
||||||
if (sq_gettop(vm) < 1)
|
if (sq_gettop(vm) < 1)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SQChar * err_msg = NULL;
|
const SQChar * err_msg = NULL;
|
||||||
|
// Attempt to retrieve the erro message
|
||||||
if (SQ_SUCCEEDED(sq_getstring(vm, 2, &err_msg)))
|
if (SQ_SUCCEEDED(sq_getstring(vm, 2, &err_msg)))
|
||||||
{
|
{
|
||||||
_Core->m_ErrorMsg.assign(err_msg);
|
_Core->m_ErrorMsg.assign(err_msg);
|
||||||
@ -703,18 +712,18 @@ SQInteger Core::RuntimeErrorHandler(HSQUIRRELVM vm) noexcept
|
|||||||
{
|
{
|
||||||
_Core->m_ErrorMsg.assign(_SC("An unknown runtime error has occurred"));
|
_Core->m_ErrorMsg.assign(_SC("An unknown runtime error has occurred"));
|
||||||
}
|
}
|
||||||
|
// Start a new section in the console
|
||||||
LogMsg("%s", CenterStr("ERROR", '*'));
|
LogMsg("%s", CenterStr("ERROR", '*'));
|
||||||
|
// Output the retrieved error message
|
||||||
LogInf("[MESSAGE] : %s", _Core->m_ErrorMsg.c_str());
|
LogInf("[MESSAGE] : %s", _Core->m_ErrorMsg.c_str());
|
||||||
|
// See if the specified verbosity level allows a print of the callstack
|
||||||
if (_Log->GetVerbosity() > 0)
|
if (_Log->GetVerbosity() > 0)
|
||||||
{
|
{
|
||||||
_Core->PrintCallstack();
|
_Core->PrintCallstack();
|
||||||
}
|
}
|
||||||
|
// Close the console section
|
||||||
LogMsg("%s", CenterStr("CONCLUDED", '*'));
|
LogMsg("%s", CenterStr("CONCLUDED", '*'));
|
||||||
|
// The error was handled
|
||||||
return SQ_OK;
|
return SQ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,14 +731,14 @@ void Core::CompilerErrorHandler(HSQUIRRELVM vm, const SQChar * desc, const SQCha
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_Core->m_ErrorMsg.assign(fmt::format("{0:s} : {1:d}:{2:d} : {3:s}", src, line, column, desc).c_str());
|
_Core->m_ErrorMsg.assign(ToStringF("%s : %s:%d : %s", src, line, column, desc));
|
||||||
}
|
}
|
||||||
catch (const std::exception & e)
|
catch (const std::exception & e)
|
||||||
{
|
{
|
||||||
LogErr("Compiler error: %s", e.what());
|
LogErr("Compiler error: %s", e.what());
|
||||||
_Core->m_ErrorMsg.assign(_SC("An unknown compiler error has occurred"));
|
_Core->m_ErrorMsg.assign(_SC("An unknown compiler error has occurred"));
|
||||||
}
|
}
|
||||||
|
// Output the obtained error message
|
||||||
LogErr("%s", _Core->m_ErrorMsg.c_str());
|
LogErr("%s", _Core->m_ErrorMsg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user