#include "asw/script/interface.h" //////////////////////////////////////////////////////////////////////////////////// // Interface //////////////////////////////////////////////////////////////////////////////////// // This is the global script interface used by the ASW::Script::* classes and functions std::auto_ptr g_clsInterface; void ASW::Script:: SetInterface(ASW::Script::Interface * p_ptrInterface) { g_clsInterface.reset(p_ptrInterface); } //////////////////////////////////////////////////////////////////////////////////// // Function //////////////////////////////////////////////////////////////////////////////////// void ASW::Script::Function:: Call() { g_clsInterface->Call(*this); } ASW::Script::Function:: ~Function() { g_clsInterface->Unregister(*this); } //////////////////////////////////////////////////////////////////////////////////// // Method //////////////////////////////////////////////////////////////////////////////////// // Parameters: none // Results: one void ASW::Script::Method:: Call(ASW::Script::Object & p_refObject, ASW::Script::Variant & p_refResult) const { ASW::Script::Parameter::List clsReturn; Call(p_refObject, NULL, &clsReturn, 1); p_refResult = clsReturn[0].GetValue(); } // Parameters: one // Results: none void ASW::Script::Method:: Call(ASW::Script::Object & p_refObject, const ASW::Script::Parameter & p_refParameter) const { ASW::Script::Parameter::Array clsParameter(&p_refParameter, 1); Call(p_refObject, &clsParameter, NULL, 0); } // Parameters: one // Results: one void ASW::Script::Method:: Call(ASW::Script::Object & p_refObject, const ASW::Script::Parameter & p_refParameter, ASW::Script::Variant & p_refResult) const { ASW::Script::Parameter::Array clsParameter(&p_refParameter, 1); ASW::Script::Parameter::List clsReturn; Call(p_refObject, &clsParameter, &clsReturn, 1); p_refResult = clsReturn[0].GetValue(); } // Parameters: many // Results: many void ASW::Script::Method:: Call(ASW::Script::Object & p_refObject, const ASW::Script::Parameter::Container * p_ptrParameters, ASW::Script::Parameter::List * p_ptrReturn, const int p_intReturnAmount) const { Call(p_refObject, p_ptrParameters, p_ptrReturn, p_intReturnAmount); } //////////////////////////////////////////////////////////////////////////////////// // Method::Table //////////////////////////////////////////////////////////////////////////////////// // Gets a method in the vtable; if it does not exist, checks the parent vtable const ASW::Script::Method * ASW::Script::Method::Table:: GetMethod(const TCHAR * p_ptrName) const { const ASW::Script::Method::Definition * ptrMethods = m_ptrMethods; while ( ptrMethods->first != NULL ) { if ( ASW::Equal(p_ptrName, ptrMethods->first) ) return ptrMethods->second; ++ptrMethods; } return ( m_ptrParent != NULL ) ? m_ptrParent->GetMethod(p_ptrName) : NULL; } //////////////////////////////////////////////////////////////////////////////////// // MethodScript //////////////////////////////////////////////////////////////////////////////////// ASW::Script::MethodScript:: ~MethodScript() { g_clsInterface->Unregister(*this); } void ASW::Script::MethodScript:: Call(ASW::Script::Object & p_refObject, const ASW::Script::Parameter::Container * p_ptrParameters, ASW::Script::Parameter::List * p_ptrReturn, const int p_intReturnAmount) const { g_clsInterface->Call(p_refObject, *this, p_ptrParameters, p_ptrReturn, p_intReturnAmount); } //////////////////////////////////////////////////////////////////////////////////// // Object //////////////////////////////////////////////////////////////////////////////////// ASW::Script::Object:: ~Object() { g_clsInterface->Unregister(*this); } //////////////////////////////////////////////////////////////////////////////////// // Registry //////////////////////////////////////////////////////////////////////////////////// void ASW::Script::Registry:: Register(ASW::Script::Object & p_refObject, const TCHAR * p_ptrName) { g_clsInterface->Register(p_refObject, p_ptrName); }