From: Eric W. <ewm...@gm...> - 2014-03-28 08:52:00
|
Hi, I'm looking at the SWIG generation for Lua and it is out-of-date for more recent Lua versions. Back in Lua 5.0, there was only lua_Number which was by default a double. In Lua 5.1, they introduced integer C-APIs (e.g. lua_pushinteger) In Lua 5.2, they introduced unsigned C-APIs (e.g. lua_pushunsigned) In Lua 5.3, they now have full blown native integer backend so integers and floating point don't get converted needlessly. In 5.3, if you've been using the APIs in 5.1+5.2, everything just works and you may get a performance boost. Or at the very least, you avoid a lot more overflow cases. (Also, Lua optionally provides architecture/platform specific conversion routines to make conversion more efficient if you use their APIs instead of casting yourself.) Unfortunately, SWIG is still generating 5.0 code for everything. I would like to fix this, but I need to understand how to correctly conditionalize for versions in the .swg files. For example, in lua.swg, there is currently this block: %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, float,double, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, float&,double&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} I would like to do something like the following, but don't know if this actually will work: /* Lua 5.1 introduced integer APIs so we should use them when available. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, float,double, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, float&,double&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} #else /* for Lua 5.1 and up (which have integer APIs) */ // number as number+error %typemap(throws) float,double, float&,double& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} /* Lua 5.2 introduced unsigned APIs so we should use them when available. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushinteger(L,(lua_Number)$1);SWIG_fail; %} #else /* for Lua 5.2 and up (which have unsigned APIs) */ %typemap(throws) unsigned int, unsigned long, unsigned short, unsigned long long, unsigned char, unsigned int&, unsigned long&, unsigned short&, unsigned long long&, unsigned char& %{lua_pushunsigned(L,(lua_Unsigned)$1);SWIG_fail; %} %typemap(throws) int,signed int, long,signed long, short,signed short, long long, signed char, int&,signed int&, long&,signed long&, short&,signed short&, long long&, signed char& %{lua_pushinteger(L,(lua_Integer)$1);SWIG_fail; %} #endif /* for Lua 5.2 and up (which have unsigned APIs) */ #endif /* for Lua 5.1 and up (which have integer APIs) */ Thanks, Eric -- Beginning iPhone Games Development http://playcontrol.net/iphonegamebook/ |