Merge pull request #62 from djpohly/enum-compatibility
Backwards-compatible type-safe enum behavior
This commit is contained in:
@@ -22,6 +22,24 @@ int CheckEnum( lua_State *L, LuaReference &table, int iPos, int iInvalid, const
|
|||||||
lua_pushvalue( L, iPos );
|
lua_pushvalue( L, iPos );
|
||||||
lua_gettable( L, -2 );
|
lua_gettable( L, -2 );
|
||||||
|
|
||||||
|
// If not found, check case-insensitively for legacy compatibility
|
||||||
|
if( lua_isnil(L, -1) && lua_isstring(L, iPos) ) {
|
||||||
|
RString sLower;
|
||||||
|
|
||||||
|
// Get rid of nil value on stack
|
||||||
|
lua_pop( L, 1 );
|
||||||
|
|
||||||
|
// Get the string and lowercase it
|
||||||
|
lua_pushvalue( L, iPos );
|
||||||
|
LuaHelpers::Pop( L, sLower );
|
||||||
|
sLower.MakeLower();
|
||||||
|
|
||||||
|
// Try again to read the value
|
||||||
|
table.PushSelf( L );
|
||||||
|
LuaHelpers::Push( L, sLower );
|
||||||
|
lua_gettable( L, -2 );
|
||||||
|
}
|
||||||
|
|
||||||
// If the result is nil, then a string was passed that is not a member of this enum. Throw
|
// If the result is nil, then a string was passed that is not a member of this enum. Throw
|
||||||
// an error. To specify the invalid value, pass nil. That way, typos will throw an error,
|
// an error. To specify the invalid value, pass nil. That way, typos will throw an error,
|
||||||
// and not silently result in nil, or an out-of-bounds value.
|
// and not silently result in nil, or an out-of-bounds value.
|
||||||
|
|||||||
@@ -135,6 +135,14 @@ static void Lua##X(lua_State* L) \
|
|||||||
lua_pushstring( L, (#X "_")+s ); \
|
lua_pushstring( L, (#X "_")+s ); \
|
||||||
lua_pushnumber( L, i ); /* 0-based */ \
|
lua_pushnumber( L, i ); /* 0-based */ \
|
||||||
lua_rawset( L, -3 ); \
|
lua_rawset( L, -3 ); \
|
||||||
|
/* Compatibility with old, case-insensitive values */ \
|
||||||
|
s.MakeLower(); \
|
||||||
|
lua_pushstring( L, s ); \
|
||||||
|
lua_pushnumber( L, i ); /* 0-based */ \
|
||||||
|
lua_rawset( L, -3 ); \
|
||||||
|
/* Compatibility with old, raw values */ \
|
||||||
|
lua_pushnumber( L, i ); \
|
||||||
|
lua_rawseti( L, -2, i ); \
|
||||||
} \
|
} \
|
||||||
EnumTraits<X>::StringToEnum.SetFromStack( L ); \
|
EnumTraits<X>::StringToEnum.SetFromStack( L ); \
|
||||||
EnumTraits<X>::StringToEnum.PushSelf( L ); \
|
EnumTraits<X>::StringToEnum.PushSelf( L ); \
|
||||||
|
|||||||
+10
-1
@@ -2223,8 +2223,17 @@ public:
|
|||||||
static int ApplyGameCommand( T* p, lua_State *L )
|
static int ApplyGameCommand( T* p, lua_State *L )
|
||||||
{
|
{
|
||||||
PlayerNumber pn = PLAYER_INVALID;
|
PlayerNumber pn = PLAYER_INVALID;
|
||||||
if( lua_gettop(L) >= 2 && !lua_isnil(L,2) )
|
if( lua_gettop(L) >= 2 && !lua_isnil(L,2) ) {
|
||||||
|
// Legacy behavior: if an old-style numerical argument
|
||||||
|
// is given, decrement it before trying to parse
|
||||||
|
if( lua_isnumber(L,2) ) {
|
||||||
|
int arg = (int) lua_tonumber( L, 2 );
|
||||||
|
arg--;
|
||||||
|
LuaHelpers::Push( L, arg );
|
||||||
|
lua_replace( L, -2 );
|
||||||
|
}
|
||||||
pn = Enum::Check<PlayerNumber>(L, 2);
|
pn = Enum::Check<PlayerNumber>(L, 2);
|
||||||
|
}
|
||||||
p->ApplyGameCommand(SArg(1),pn);
|
p->ApplyGameCommand(SArg(1),pn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user