1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2024-11-08 08:47:17 +01:00
SqMod/modules/tcc/Symbol.cpp
2016-03-27 06:06:06 +03:00

69 lines
2.1 KiB
C++

// ------------------------------------------------------------------------------------------------
#include "Symbol.hpp"
#include "State.hpp"
// ------------------------------------------------------------------------------------------------
#include <libtcc.h>
// ------------------------------------------------------------------------------------------------
namespace SqMod {
// ------------------------------------------------------------------------------------------------
SQInteger Symbol::Typename(HSQUIRRELVM vm)
{
static SQChar name[] = _SC("SqTccSymbol");
sq_pushstring(vm, name, sizeof(name));
return 1;
}
// ------------------------------------------------------------------------------------------------
Symbol::Symbol(const State & state, CSStr name)
: Symbol(state.GetSymbol(name))
{
/* ... */
}
// ------------------------------------------------------------------------------------------------
Symbol::Symbol(const StateHnd & state, CSStr name, SymPtr sym)
: m_Handle(sym), m_State(state), m_Name(name ? name : _SC(""))
{
/* ... */
}
// ------------------------------------------------------------------------------------------------
State Symbol::GetStateRef() const
{
return State(m_State);
}
// ------------------------------------------------------------------------------------------------
SQInteger Symbol::Forward(HSQUIRRELVM vm)
{
// The symbol instance
Symbol * symbol = nullptr;
// Attempt to retrieve the symbol instance
try
{
symbol = Var< Symbol * >(vm, 1).value;
}
catch (const Sqrat::Exception & e)
{
// Propagate the error
return sq_throwerror(vm, e.Message().c_str());
}
// Do we have a valid symbol instance?
if (!symbol)
{
return sq_throwerror(vm, "Invalid symbol instance");
}
// Do we have a valid symbol identifier?
else if (!symbol->IsValid())
{
return sq_throwerror(vm, "Invalid symbol reference");
}
// Cast the symbol to a squirrel function, forward the call and return the result
return reinterpret_cast< SQFUNCTION >((*symbol).m_Handle)(vm);
}
} // Namespace:: SqMod