Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix isNan on setYaw Lua call (#7380)
* Fix isNan on setYaw Lua call
  • Loading branch information
nerzhul committed May 31, 2018
1 parent df991ed commit 162ffd7
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 1 deletion.
2 changes: 2 additions & 0 deletions doc/client_lua_api.txt
Expand Up @@ -609,6 +609,8 @@ Helper functions
* Converts a string representing an area box into two positions
* `minetest.is_yes(arg)`
* returns whether `arg` can be interpreted as yes
* `minetest.is_nan(arg)`
* returns true true when the passed number represents NaN.
* `table.copy(table)`: returns a table
* returns a deep copy of `table`

Expand Down
2 changes: 2 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -2541,6 +2541,8 @@ Helper functions
in formspecs.
* `minetest.is_yes(arg)`
* returns true if passed 'y', 'yes', 'true' or a number that isn't zero.
* `minetest.is_nan(arg)`
* returns true when the passed number represents NaN.
* `minetest.get_us_time()`
* returns time with microsecond precision. May not return wall time.
* `table.copy(table)`: returns a table
Expand Down
8 changes: 7 additions & 1 deletion src/script/lua_api/l_base.cpp
Expand Up @@ -21,7 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "lua_api/l_internal.h"
#include "cpp_api/s_base.h"
#include "content/mods.h"
#include <server.h>
#include "server.h"
#include <cmath>

ScriptApiBase *ModApiBase::getScriptApiBase(lua_State *L)
{
Expand Down Expand Up @@ -84,3 +85,8 @@ bool ModApiBase::registerFunction(lua_State *L, const char *name,

return true;
}

bool ModApiBase::isNaN(lua_State *L, int idx)
{
return lua_type(L, idx) == LUA_TNUMBER && std::isnan(lua_tonumber(L, idx));
}
2 changes: 2 additions & 0 deletions src/script/lua_api/l_base.h
Expand Up @@ -69,4 +69,6 @@ class ModApiBase {
const char* name,
lua_CFunction func,
int top);

static bool isNaN(lua_State *L, int idx);
};
3 changes: 3 additions & 0 deletions src/script/lua_api/l_object.cpp
Expand Up @@ -895,6 +895,9 @@ int ObjectRef::l_set_yaw(lua_State *L)
ObjectRef *ref = checkobject(L, 1);
LuaEntitySAO *co = getluaobject(ref);
if (co == NULL) return 0;
if (isNaN(L, 2))
throw LuaError("ObjectRef::set_yaw: NaN value is not allowed.");

float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
// Do it
co->setYaw(yaw);
Expand Down
11 changes: 11 additions & 0 deletions src/script/lua_api/l_util.cpp
Expand Up @@ -240,6 +240,15 @@ int ModApiUtil::l_is_yes(lua_State *L)
return 1;
}

// is_nan(arg)
int ModApiUtil::l_is_nan(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;

lua_pushboolean(L, isNaN(L, 1));
return 1;
}

// get_builtin_path()
int ModApiUtil::l_get_builtin_path(lua_State *L)
{
Expand Down Expand Up @@ -481,6 +490,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(get_password_hash);

API_FCT(is_yes);
API_FCT(is_nan);

API_FCT(get_builtin_path);

Expand Down Expand Up @@ -513,6 +523,7 @@ void ModApiUtil::InitializeClient(lua_State *L, int top)
API_FCT(write_json);

API_FCT(is_yes);
API_FCT(is_nan);

API_FCT(compress);
API_FCT(decompress);
Expand Down
3 changes: 3 additions & 0 deletions src/script/lua_api/l_util.h
Expand Up @@ -65,6 +65,9 @@ class ModApiUtil : public ModApiBase
// is_yes(arg)
static int l_is_yes(lua_State *L);

// is_nan(arg)
static int l_is_nan(lua_State *L);

// get_builtin_path()
static int l_get_builtin_path(lua_State *L);

Expand Down

0 comments on commit 162ffd7

Please sign in to comment.