138 lines
3.9 KiB
C++
138 lines
3.9 KiB
C++
#ifndef _BASE_LUA_H_
|
||
#define _BASE_LUA_H_
|
||
|
||
/*****************************************************************
|
||
* LUA脚本对象基础类
|
||
* 提供对脚本的加载、函数库注册、错误输出以及函数调用的规则定义。
|
||
* 对于错误输出的捕获,子类应当覆盖showError函数以便决定如何处理
|
||
* 脚本或调用中产生的错误。
|
||
*****************************************************************/
|
||
#include "memory/buffer_allocator.h"
|
||
|
||
class DataPacket;
|
||
|
||
class BaseLua
|
||
{
|
||
protected:
|
||
//创建虚拟机对象
|
||
virtual lua_State* createLuaVM();
|
||
//打开基础库。默认会打开base、string、math以及table库。返回true表示成功。
|
||
virtual bool openBaseLibs();
|
||
//注册本地函数库。返回true表示成功。
|
||
virtual bool registLocalLibs();
|
||
//调用脚本的初始化函数。函数返回true表示没有错误发生。本类未提供调用初始化函数的实际功能。
|
||
virtual bool callInit();
|
||
//调用脚本的卸载函数。函数返回true表示没有错误发生。本类未提供调用卸载函数的实际功能。
|
||
virtual bool callFinal();
|
||
//显示脚本错误内容
|
||
virtual void showError(const char* err);
|
||
|
||
void SetErrDesc(const char* err);
|
||
protected:
|
||
//格式化错误内容并显示,格式化后错误内容字符串的长度被限制为1024个字符。
|
||
void showErrorFormat(const char* fmt, ...);
|
||
|
||
/* 脚本调用函数
|
||
在讲函数以及参数名称入栈后调用从函数用于替代直接调用lua_pcall的行为以便集中错误处理。
|
||
函数中包含对调用函数前后的堆栈平衡检查。
|
||
函数返回true表示没有错误。
|
||
*/
|
||
bool pcall(const int args, const int results, const int errfunc);
|
||
|
||
//检查脚本调用返回值,如果nError不为成功值则会输出错误内容并返回false,且nError的值被保存在m_nLastError中。
|
||
inline bool lcCheck(int err);
|
||
|
||
/*
|
||
* Comments: 编译脚本为字节码
|
||
* Param lua_State * L:
|
||
* Param const char * szContent: 文本形式的lua脚本内容
|
||
* Param DataPacket & packet: 二进制输出流
|
||
* @Return bool:成功返回true;失败返回false
|
||
* @Remark:
|
||
*/
|
||
bool CompileLua(lua_State* L, const char* content, DataPacket& packet);
|
||
|
||
/*
|
||
* Comments: 二进制输出流Writer
|
||
* Param lua_State * L: Lua状态机
|
||
* Param const void * p: 待写入的二进制内容
|
||
* Param size_t size: 二进制内容长度
|
||
* Param void * u: userData。 这里是CDataPacket*
|
||
* @Return int: 成功返回0;失败非0
|
||
* @Remark:
|
||
*/
|
||
static int StreamWriter(lua_State* L, const void* p, size_t size, void* u);
|
||
|
||
public:
|
||
BaseLua();
|
||
virtual ~BaseLua();
|
||
|
||
/* 设置脚本内容,会完成如下核心操作:
|
||
1、调用当前脚本的卸载函数
|
||
2、删除当前的虚拟机对象
|
||
3、重新创建虚拟机
|
||
4、打开基础函数库
|
||
5、注册本地函数库
|
||
6、调用初始化函数
|
||
如果参数sText为NULL或为空字符串则会销毁当前虚拟机且不创建新虚拟机。
|
||
函数返回true表示设置脚本成功,其他值表示发生错误。
|
||
*/
|
||
bool setScript(const char* txt);
|
||
|
||
/*
|
||
* Comments: 设置二进制脚本内容,完成大部分操作同setScript(const char* sText),指示脚本内容是编译过的二进制字节码
|
||
* Param const char* szScript: 脚本(文本形式)
|
||
* Param DataPacket& packet: 如果bCompile为true,它是编译后的二进制输出流;否则是二进制输入流
|
||
* Param const char* name: 代码块名称(一般指脚本文件名)
|
||
* Param bool bCompile: 为true会先编译脚本为二进制,然后加载二进制;否则直接加载二进制数据
|
||
* @Return bool: 成功返回true;失败返回false
|
||
* @Remark:
|
||
*/
|
||
bool setBinScript(const char* script, DataPacket& packet, const char* name = NULL, bool compile = false);
|
||
|
||
/*
|
||
* Comments: 重置二进制脚本
|
||
* Param DataPacket & packet: 脚本二进制数据
|
||
* @Return bool:
|
||
* @Remark:
|
||
*/
|
||
bool resetBinScript(DataPacket& packet);
|
||
|
||
//获取虚拟机的内存使用量,单位是字节
|
||
int getAvaliableMemorySize();
|
||
//进行垃圾回收,释放内存。函数返回回收了多少字节的内存
|
||
int gc();
|
||
//获取错误号
|
||
inline int getLastErrorNo()
|
||
{
|
||
return errno_;
|
||
}
|
||
//获取错误描述
|
||
inline const char* getLastErrorDesc() const
|
||
{
|
||
return err_desc_;
|
||
}
|
||
void SetLastFunc(const char* name)
|
||
{
|
||
STATIC_ASSERT(sizeof(last_fn_) > 8); // 确定类型不是char*
|
||
if (name)
|
||
{
|
||
_STRNCPY_A(last_fn_, name);
|
||
}
|
||
else
|
||
{
|
||
last_fn_[0] = 0;
|
||
}
|
||
}
|
||
//判断脚本中是否存在名为sFnName的函数
|
||
bool FunctionExists(const char* fn);
|
||
protected:
|
||
lua_State* lua_; //LUA虚拟机对象
|
||
int errno_; //上一个错误号
|
||
char* err_desc_; //上一个错误的描述
|
||
char last_fn_[128]; //上一次调用的函数名称
|
||
};
|
||
|
||
#endif
|
||
|