219 lines
7.0 KiB
C++
219 lines
7.0 KiB
C++
// ScriptSystem.h: interface for the CScriptSystem class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_SCRIPTSYSTEM_H__8FCEA01B_BD85_4E4D_B54F_B09429A7CDFF__INCLUDED_)
|
|
#define AFX_SCRIPTSYSTEM_H__8FCEA01B_BD85_4E4D_B54F_B09429A7CDFF__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
#include <IScriptSystem.h>
|
|
extern "C"{
|
|
#include <lua.h>
|
|
}
|
|
#include <algorithm>
|
|
#include <set>
|
|
#include <stack>
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
#include "FunctionHandler.h"
|
|
#if !defined(LINUX)
|
|
#include <assert.h>
|
|
#endif
|
|
|
|
|
|
struct BreakPoint
|
|
{
|
|
BreakPoint()
|
|
{
|
|
nLine=-1;
|
|
}
|
|
BreakPoint(const BreakPoint& b)
|
|
{
|
|
nLine=b.nLine;
|
|
sSourceFile=b.sSourceFile;
|
|
}
|
|
int nLine;
|
|
string sSourceFile;
|
|
};
|
|
|
|
typedef std::set<string> ScriptFileList;
|
|
typedef ScriptFileList::iterator ScriptFileListItor;
|
|
|
|
typedef std::map<int,int> UserDataMap;
|
|
typedef UserDataMap::iterator UserDataMapItor;
|
|
|
|
class CScriptSystem;
|
|
class CScriptObject;
|
|
|
|
struct USER_DATA_CHUNK
|
|
{
|
|
int nRef;
|
|
USER_DATA nVal; //AMD Port
|
|
int nCookie;
|
|
};
|
|
|
|
#define SCRIPT_OBJECT_POOL_SIZE 15000
|
|
typedef std::vector<CScriptObject * > ScriptObjectsObjectPool;
|
|
|
|
/*! IScriptSystem implementation
|
|
@see IScriptSystem
|
|
*/
|
|
class CScriptSystem : public IScriptSystem
|
|
{
|
|
public:
|
|
//! constructor
|
|
CScriptSystem();
|
|
//! destructor
|
|
virtual ~CScriptSystem();
|
|
//!
|
|
bool Init(IScriptSystemSink *pSink,IScriptDebugSink *pDebugSink,bool bStdLibs,int nStackSize);
|
|
//!
|
|
void RegisterErrorHandler(bool bDebugger=false);
|
|
//!
|
|
void FormatAndRaiseError(int nErr);
|
|
//!
|
|
bool _ExecuteFile(const char *sFileName,bool bRaiseError);
|
|
//!
|
|
void ReleaseScriptObject(CScriptObject *p);
|
|
// this is validating call to hunt down possible memory corruptions
|
|
// normally it should be defined as inlined empty function
|
|
static void Validate();
|
|
//!
|
|
IScriptSystemSink* GetSystemSink() { return m_pSink; };
|
|
//!
|
|
void UnrefFunction (HSCRIPTFUNCTION hFunc);
|
|
|
|
// interface IScriptSystem -----------------------------------------------------------
|
|
|
|
virtual IFunctionHandler *GetFunctionHandler();
|
|
virtual HSCRIPT GetScriptHandle() { return (HSCRIPT)m_pLS; }
|
|
virtual bool ExecuteFile(const char *sFileName,bool bRaiseError,bool bForceReload);
|
|
virtual bool ExecuteBuffer(const char *sBuffer, size_t nSize);
|
|
virtual void UnloadScript(const char *sFileName);
|
|
virtual void UnloadScripts();
|
|
virtual bool ReloadScript(const char *sFileName,bool bRaiseError);
|
|
virtual bool ReloadScripts();
|
|
virtual void DumpLoadedScripts();
|
|
virtual IScriptObject *GetGlobalObject();
|
|
virtual IScriptObject *CreateEmptyObject();
|
|
virtual IScriptObject *CreateObject();
|
|
virtual IScriptObject *CreateGlobalObject(const char *sName);
|
|
virtual int BeginCall(HSCRIPTFUNCTION hFunc);
|
|
virtual int BeginCall(const char *sFuncName);
|
|
virtual int BeginCall(const char *sTableName,const char *sFuncName);
|
|
virtual void EndCall();
|
|
virtual void EndCall(int &nRet);
|
|
virtual void EndCall(float &fRet);
|
|
virtual void EndCall(const char *&sRet);
|
|
virtual void EndCall(bool &bRet);
|
|
virtual void EndCall(IScriptObject *pScriptObject);
|
|
virtual HSCRIPTFUNCTION GetFunctionPtr(const char *sFuncName);
|
|
virtual HSCRIPTFUNCTION GetFunctionPtr(const char *sTableName, const char *sFuncName);
|
|
virtual void ReleaseFunc(HSCRIPTFUNCTION f);
|
|
virtual void PushFuncParam(int nVal);
|
|
virtual void PushFuncParam(float fVal);
|
|
virtual void PushFuncParam(const char *sVal);
|
|
virtual void PushFuncParam(bool bVal);
|
|
virtual void PushFuncParam(IScriptObject *pVal);
|
|
virtual void SetGlobalValue(const char *sKey, int nVal);
|
|
virtual void SetGlobalValue(const char *sKey, float fVal);
|
|
virtual void SetGlobalValue(const char *sKey, const char *sVal);
|
|
virtual void SetGlobalValue(const char *sKey, IScriptObject *pObj);
|
|
virtual void SetGlobalToNull(const char *sKey);
|
|
virtual bool GetGlobalValue(const char *sKey, int &nVal);
|
|
virtual bool GetGlobalValue(const char *sKey, float &fVal);
|
|
virtual bool GetGlobalValue(const char *sKey, const char * &sVal);
|
|
virtual bool GetGlobalValue(const char *sKey, IScriptObject *pObj);
|
|
virtual HTAG CreateTaggedValue(const char *sKey, int *pVal);
|
|
virtual HTAG CreateTaggedValue(const char *sKey, float *pVal);
|
|
virtual HTAG CreateTaggedValue(const char *sKey, char *pVal);
|
|
virtual void RemoveTaggedValue(HTAG htag);
|
|
virtual USER_DATA CreateUserData(INT_PTR nVal,int nCookie);
|
|
virtual void RaiseError(const char *sErr,...);
|
|
virtual void ForceGarbageCollection();
|
|
virtual int GetCGCount();
|
|
virtual void SetGCThreshhold(int nKb);
|
|
virtual void UnbindUserdata();
|
|
virtual void Release();
|
|
virtual void EnableDebugger(IScriptDebugSink *pDebugSink);
|
|
virtual IScriptObject *GetBreakPoints();
|
|
virtual HBREAKPOINT AddBreakPoint(const char *sFile,int nLineNumber);
|
|
virtual IScriptObject *GetLocalVariables(int nLevel = 0);
|
|
virtual IScriptObject *GetCallsStack();
|
|
virtual void DebugContinue(){m_bsBreakState=bsContinue;}
|
|
virtual void DebugStepNext(){m_bsBreakState=bsStepNext;}
|
|
virtual void DebugStepInto(){m_bsBreakState=bsStepInto;}
|
|
virtual void DebugDisable(){m_bsBreakState=bsNoBreak;}
|
|
virtual BreakState GetBreakState(){return m_bsBreakState;}
|
|
virtual void GetMemoryStatistics(ICrySizer *pSizer);
|
|
virtual void GetScriptHash( const char *sPath, const char *szKey, unsigned int &dwHash );
|
|
virtual void PostInit();
|
|
|
|
private: // ---------------------------------------------------------------------
|
|
|
|
//!
|
|
static int ErrorHandler(lua_State *L);
|
|
//!
|
|
static int SetGlobalTagHandlerFloat(lua_State *L);
|
|
//!
|
|
static int GetGlobalTagHandlerFloat(lua_State *L);
|
|
//!
|
|
static int SetGlobalTagHandlerInt(lua_State *L);
|
|
//!
|
|
static int GetGlobalTagHandlerInt(lua_State *L);
|
|
//!
|
|
static int SetGlobalTagHandlerString(lua_State *L);
|
|
//!
|
|
static int GetGlobalTagHandlerString(lua_State *L);
|
|
//!
|
|
void NotifySetGlobal(const char *sVarName);
|
|
//!
|
|
bool CanSetGlobal(const char *sVarName);
|
|
//!
|
|
CScriptObject *CreateScriptObject();
|
|
//!
|
|
void RegisterTagHandlers();
|
|
//!
|
|
static int GCTagHandler(lua_State *L);
|
|
|
|
// void GetScriptHashFunction( IScriptObject &Current, unsigned int &dwHash);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
lua_State * m_pLS;
|
|
bool m_bDebug; //!< temp value for function calls
|
|
int m_nTempArg;
|
|
int m_nTempTop;
|
|
|
|
int m_nFloatTag;
|
|
int m_nIntTag;
|
|
int m_nStringTag;
|
|
|
|
int m_nGCTag;
|
|
|
|
string m_strCurrentFile;
|
|
|
|
CFunctionHandler m_feFuntionHandler;
|
|
ScriptFileList m_dqLoadedFiles;
|
|
|
|
IScriptSystemSink * m_pSink;
|
|
ScriptObjectsObjectPool m_stkScriptObjectsPool;
|
|
|
|
UserDataMap m_mapUserData;
|
|
|
|
public: // -----------------------------------------------------------------------
|
|
|
|
BreakPoint m_BreakPoint; //!
|
|
string m_sLastBreakSource; //!
|
|
int m_nLastBreakLine; //!
|
|
BreakState m_bsBreakState; //!
|
|
IScriptDebugSink * m_pDebugSink; //!
|
|
int m_nObjCreationNumber; //!< debug variable
|
|
};
|
|
|
|
|
|
#endif // !defined(AFX_SCRIPTSYSTEM_H__8FCEA01B_BD85_4E4D_B54F_B09429A7CDFF__INCLUDED_)
|