diff --git a/Shared/sdk/CScriptArgReader.h b/Shared/sdk/CScriptArgReader.h index 813351fd33..1da63276df 100644 --- a/Shared/sdk/CScriptArgReader.h +++ b/Shared/sdk/CScriptArgReader.h @@ -42,21 +42,27 @@ class CScriptArgReader // // Read next number // - template < class T > + template < typename T > void ReadNumber ( T& outValue ) { int iArgument = lua_type ( m_luaVM, m_iIndex ); if ( iArgument == LUA_TNUMBER || iArgument == LUA_TSTRING ) { - lua_Number number = lua_tonumber(m_luaVM, m_iIndex++); + lua_Number number = lua_tonumber ( m_luaVM, m_iIndex++ ); + + if ( std::isnan( number ) ) + { + SetCustomError ( "Expected number, got NaN", "Bad argument" ); + return; + } - if (std::isnan(number)) + if ( std::is_unsigned < T > () && number < 0.0 ) { - SetCustomError("Expected number, got NaN", "Bad argument"); + SetCustomError ( "Expected positive value, got negative", "Bad argument" ); return; } - outValue = static_cast < T > (number); + outValue = static_cast < T > ( number ); return; } @@ -68,17 +74,23 @@ class CScriptArgReader // // Read next number, using default if needed // - template < class T, class U > + template < typename T, typename U > void ReadNumber ( T& outValue, const U& defaultValue ) { int iArgument = lua_type ( m_luaVM, m_iIndex ); if ( iArgument == LUA_TNUMBER || iArgument == LUA_TSTRING ) { - lua_Number number = lua_tonumber(m_luaVM, m_iIndex++); + lua_Number number = lua_tonumber ( m_luaVM, m_iIndex++ ); + + if ( std::isnan ( number ) ) + { + SetCustomError ( "Expected number, got NaN", "Bad argument" ); + return; + } - if (std::isnan(number)) + if ( std::is_unsigned < T > () && number < 0.0 ) { - SetCustomError("Expected number, got NaN", "Bad argument"); + SetCustomError ( "Expected positive value, got negative", "Bad argument" ); return; }