LuaTinker的Bug和缺陷
作者:网络转载 发布时间:[ 2015/8/19 14:14:12 ] 推荐标签:软件测试管理 缺陷管理
第4个bug,var_base基类的析构函数没有写virtual
struct var_base
{
//原来的析构函数没有写virtual
virtual ~var_base() {};
virtual void get(lua_State *L) = 0;
virtual void set(lua_State *L) = 0;
};
第5个bug,table的3个构造函数中有一个没有增加引用计数,这个bug在网上很多同学都指出过。
lua_tinker::table::table(lua_State* L, const char* name)
{
lua_pushstring(L, name);
lua_gettable(L, LUA_GLOBALSINDEX);
if(lua_istable(L, -1) == 0)
{
lua_pop(L, 1);
lua_newtable(L);
lua_pushstring(L, name);
lua_pushvalue(L, -2);
lua_settable(L, LUA_GLOBALSINDEX);
}
m_obj = new table_obj(L, lua_gettop(L));
//原来的代码没有这段,缺少增加引用计数处理
m_obj->inc_ref();
}
缺陷
LuaTinker也有很多缺陷和不足,
第一个不足,各种函数参数的支持个数参差不齐。LuaTinker的写的时间应该比较早,没有C++ 11的模版变参(Variadic Template)的支持,所以只能用写多个模版函数(类)的方式解决多模板参数问题。但LuaTinker一方面写的参数个数很少,一方面LuaTinker的个个地方支持的参数个数数量完全不统一,3个,4个,5个的都有。其实这部分好用C++ 11的(Variadic Template)重写。
第二个缺陷是个硬伤,LuaTinker对Lua 协程的支持,用了一个很费力,但又不讨好的方式。你必须把协程的第一个参数定义为lua_State *L,而且返回值必须是lua_yield(L, 0)。这样的限制,大大限制了使用。
//第一个参数必须是(lua_State *L
int TestFunc2(lua_State *L, float a)
{
printf("# TestFunc2(L,%f) is invoke. ", a);
//返回的地方必须是调用lua_yield
return lua_yield(L, 0);
}
class TestClass
{
public:
//类函数也一样
int TestFunc2(lua_State *L, float a)
{
printf("# TestClass::TestFunc2(L,%f) is invoke. ", a);
return lua_yield(L, 0);
}
};
而如果其实在其函数的封装上加以区分,自己在后调用lua_yield,这可以避免这个麻烦。这个实现实在让我没有多大胃口。
第三个地方是,是对引用变量(参数),注册的问题,其实这个也不是LuaTinker的问题,而是C++模版的问题,C++的自动模版函数参数推导是存在一些潜规则的。其中有一个是左值变换,在 《CUJ:高效使用标准库:显式函数模板参数申明与STL》 一文中有比较清晰的解释。如下示例:
//下面的写法是无法得到引用的,必须显式指定参数。
//lua_tinker::set(L, "ref_a", ref_a);
//显式声明引用参数
lua_tinker::set<TestA &>(L, "ref_a", ref_a);
第4个问题是,模版处理中,对于cv(const volatile)的去除掉处理也并不理想。Lua内部对于外部的class的注册是使用函数class_add,也是用一个名称关联一个Lua的meta table,在类的后面的使用中,通过class_name<T>::name函数取得类名,但实际中,很多时候T是带有const 或者 volatile的修饰符的。包括,LuaTinker在部分处理中去掉了const,但很多地方又忽略问题,编译器不会认为classA和const class A是一个东东的。所以结果是有时候无法让你的userdata找到对应的meta table。
lua_tinker::class_add<TestA>(L, "TestA");
lua_tinker::class_con<TestA>(L, lua_tinker::constructor<TestA>);
//用模板函数辅助帮忙实现一个方法,可以通过class 找到对应的类名称(注册到LUA的名称),
template<typename T>
struct class_name
{
// global name
static const char *name(const char *name = NULL)
{
static char temp[256] = "";
if (name)
{
strcpy_s(temp, name);
}
return temp;
}
};
fergzhang同学,针对LuaTinker的一些bug修正做了一个版本。同时好像支持了5.2的版本,他放在了https://github.com/zfengzhen/lua_tinker_5.2.git
而我自己针对上面的问题实现了一套LuaTie的库,没有时间,有时间整理出来。内部用C++ 11的特性做了一些改写。
https://github.com/sailzeng/zcelib/blob/master/src/commlib/zcelib/zce_script_lua_tie.cpp
https://github.com/sailzeng/zcelib/blob/master/src/commlib/zcelib/zce_script_lua_tie.h
工程内部是有测试的例子的,但没有整理出来,看起来比较麻烦。等后面整理出来再写一篇介绍的文章把。
后,虽然我在挑刺,但还是再次表达一下对 LuaTinker作者Kwon-il Lee的感谢,这套代码帮助我了解了如何绑定脚本以及了解MPL的一些基本知识.而且坦白讲LuaBind是和Boost绑定的,能费力从这些代码中简化出LuaTinker(阅读Boost代码实在谈不上愉快),真的是一件很了不起的事情,LuaTinker的作者可能更明白轻对于代码的好处,Kwon-il Lee在主页上有一段说明其为什么没有支持LuaBind所支持的重载,而我也认为一个的库始终要是简单的。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
软件测试理论之缺陷管理Bug的生命周期的跟踪管理是怎么形成的?目前比较好用的缺陷管理工具都具备什么特点?缺陷等级的标准是如何判定的?有什么好用的缺陷管理工具吗?缺陷管理中缺陷的状态有哪些?如何进行状态管理?软件测试中的缺陷管理步骤和策略如何有效结合缺陷管理工具和缺陷管理流程?ALM(生命周期管理软件)之缺陷管理-缺陷流程处理ALM(生命周期管理软件)之缺陷管理-缺陷导出与修改ALM(生命周期管理软件)之缺陷管理-缺陷模版配置、导入缺陷ALM(生命周期管理软件)之缺陷管理-提交缺陷缺陷管理之Bug修复软件缺陷管理缺陷管理之测试新手缺陷管理项目实战缺陷管理工具:JIRA系统部署推进上线流程软件缺陷管理流程
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南