Modernize lua read (part 1): C++ templating insurance (#7394)
authorLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 4 Jun 2018 20:38:07 +0000 (22:38 +0200)
committerGitHub <noreply@github.com>
Mon, 4 Jun 2018 20:38:07 +0000 (22:38 +0200)
* Modernize lua read (part 1): C++ templating assurance

Implement the float reader

src/script/lua_api/l_base.cpp
src/script/lua_api/l_base.h
src/script/lua_api/l_env.cpp
src/script/lua_api/l_metadata.cpp
src/script/lua_api/l_nodetimer.cpp
src/script/lua_api/l_noise.cpp
src/script/lua_api/l_object.cpp
src/script/lua_api/l_server.cpp
src/script/lua_api/l_util.cpp

index e62aa23688c5d772342a229da360d4283e6ceb62..052f661bbeb1e63131edba965e24ff2807ea1b32 100644 (file)
@@ -90,3 +90,15 @@ bool ModApiBase::isNaN(lua_State *L, int idx)
 {
        return lua_type(L, idx) == LUA_TNUMBER && std::isnan(lua_tonumber(L, idx));
 }
+
+/*
+ * Read template functions
+ */
+template<>
+float ModApiBase::readParam(lua_State *L, int index)
+{
+       if (isNaN(L, index))
+               throw LuaError("NaN value is not allowed.");
+
+       return (float) luaL_checknumber(L, index);
+}
index 20aa4cc0943262b4743f0c3f55905874358806cd..d0160f03b74a7b2b282870813dbb7706e31e27be 100644 (file)
@@ -71,4 +71,15 @@ public:
                        int top);
 
        static bool isNaN(lua_State *L, int idx);
+
+       /**
+        * Read a value using a template type T from Lua State L and index
+        *
+        * @tparam T type to read from Lua
+        * @param L Lua state
+        * @param index Lua Index to read
+        * @return read value from Lua
+        */
+       template<typename T>
+       static T readParam(lua_State *L, int index);
 };
index 6d45d6c49bad7af9a02afb9cf1d701ef20363a79..2eb7f3395712afdcfc4ce67f86ff015da962cb72 100644 (file)
@@ -666,7 +666,7 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
 
        // Do it
        v3f pos = checkFloatPos(L, 1);
-       float radius = luaL_checknumber(L, 2) * BS;
+       float radius = readParam<float>(L, 2) * BS;
        std::vector<u16> ids;
        env->getObjectsInsideRadius(ids, pos, radius);
        ScriptApiBase *script = getScriptApiBase(L);
@@ -690,7 +690,7 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L)
        GET_ENV_PTR;
 
        // Do it
-       float timeofday_f = luaL_checknumber(L, 1);
+       float timeofday_f = readParam<float>(L, 1);
        sanity_check(timeofday_f >= 0.0 && timeofday_f <= 1.0);
        int timeofday_mh = (int)(timeofday_f * 24000.0);
        // This should be set directly in the environment but currently
@@ -925,8 +925,8 @@ int ModApiEnvMod::l_get_perlin(lua_State *L)
        } else {
                params.seed    = luaL_checkint(L, 1);
                params.octaves = luaL_checkint(L, 2);
-               params.persist = luaL_checknumber(L, 3);
-               params.spread  = v3f(1, 1, 1) * luaL_checknumber(L, 4);
+               params.persist = readParam<float>(L, 3);
+               params.spread  = v3f(1, 1, 1) * readParam<float>(L, 4);
        }
 
        params.seed += (int)env->getServerMap().getSeed();
index 3901ac2cf46b091d3dd801632ac88cca0fc34145..59017dbff5a05ae907f484ba8dc0062fab94d137 100644 (file)
@@ -190,7 +190,7 @@ int MetaDataRef::l_set_float(lua_State *L)
 
        MetaDataRef *ref = checkobject(L, 1);
        std::string name = luaL_checkstring(L, 2);
-       float a = luaL_checknumber(L, 3);
+       float a = readParam<float>(L, 3);
        std::string str = ftos(a);
 
        Metadata *meta = ref->getmeta(true);
index 55d3aec70c632ed29204b88244201a1e40ee7162..15a59744fd377761d10b2d2c499c2cb21c8d080c 100644 (file)
@@ -43,8 +43,8 @@ int NodeTimerRef::l_set(lua_State *L)
        NodeTimerRef *o = checkobject(L, 1);
        ServerEnvironment *env = o->m_env;
        if(env == NULL) return 0;
-       f32 t = luaL_checknumber(L,2);
-       f32 e = luaL_checknumber(L,3);
+       f32 t = readParam<float>(L,2);
+       f32 e = readParam<float>(L,3);
        env->getMap().setNodeTimer(NodeTimer(t, e, o->m_p));
        return 0;
 }
@@ -55,7 +55,7 @@ int NodeTimerRef::l_start(lua_State *L)
        NodeTimerRef *o = checkobject(L, 1);
        ServerEnvironment *env = o->m_env;
        if(env == NULL) return 0;
-       f32 t = luaL_checknumber(L,2);
+       f32 t = readParam<float>(L,2);
        env->getMap().setNodeTimer(NodeTimer(t, 0, o->m_p));
        return 0;
 }
index 85e908356290c008ea6f328ee86445e25f179fa8..d382ca3bdde86c0279f882feea830ace9bfc1f4f 100644 (file)
@@ -69,8 +69,8 @@ int LuaPerlinNoise::create_object(lua_State *L)
        } else {
                params.seed    = luaL_checkint(L, 1);
                params.octaves = luaL_checkint(L, 2);
-               params.persist = luaL_checknumber(L, 3);
-               params.spread  = v3f(1, 1, 1) * luaL_checknumber(L, 4);
+               params.persist = readParam<float>(L, 3);
+               params.spread  = v3f(1, 1, 1) * readParam<float>(L, 4);
        }
 
        LuaPerlinNoise *o = new LuaPerlinNoise(&params);
index 8377f95c87017363459382b213718c9221c0872e..f87c02a6d5d70cfdae3beff85c12fcc6df8a41f0 100644 (file)
@@ -898,7 +898,7 @@ int ObjectRef::l_set_yaw(lua_State *L)
        if (isNaN(L, 2))
                throw LuaError("ObjectRef::set_yaw: NaN value is not allowed.");
 
-       float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
+       float yaw = readParam<float>(L, 2) * core::RADTODEG;
        // Do it
        co->setYaw(yaw);
        return 0;
@@ -1118,7 +1118,7 @@ int ObjectRef::l_set_look_vertical(lua_State *L)
        ObjectRef *ref = checkobject(L, 1);
        PlayerSAO* co = getplayersao(ref);
        if (co == NULL) return 0;
-       float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
+       float pitch = readParam<float>(L, 2) * core::RADTODEG;
        // Do it
        co->setPitchAndSend(pitch);
        return 1;
@@ -1131,7 +1131,7 @@ int ObjectRef::l_set_look_horizontal(lua_State *L)
        ObjectRef *ref = checkobject(L, 1);
        PlayerSAO* co = getplayersao(ref);
        if (co == NULL) return 0;
-       float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
+       float yaw = readParam<float>(L, 2) * core::RADTODEG;
        // Do it
        co->setYawAndSend(yaw);
        return 1;
@@ -1149,7 +1149,7 @@ int ObjectRef::l_set_look_pitch(lua_State *L)
        ObjectRef *ref = checkobject(L, 1);
        PlayerSAO* co = getplayersao(ref);
        if (co == NULL) return 0;
-       float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
+       float pitch = readParam<float>(L, 2) * core::RADTODEG;
        // Do it
        co->setPitchAndSend(pitch);
        return 1;
@@ -1167,7 +1167,7 @@ int ObjectRef::l_set_look_yaw(lua_State *L)
        ObjectRef *ref = checkobject(L, 1);
        PlayerSAO* co = getplayersao(ref);
        if (co == NULL) return 0;
-       float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
+       float yaw = readParam<float>(L, 2) * core::RADTODEG;
        // Do it
        co->setYawAndSend(yaw);
        return 1;
@@ -1739,7 +1739,7 @@ int ObjectRef::l_override_day_night_ratio(lua_State *L)
        float ratio = 0.0f;
        if (!lua_isnil(L, 2)) {
                do_override = true;
-               ratio = luaL_checknumber(L, 2);
+               ratio = readParam<float>(L, 2);
        }
 
        if (!getServer(L)->overrideDayNightRatio(player, do_override, ratio))
index d663503e5e5ebb35b2a72fe2865ee710c4623428..05d2a334982f97733c7a13834959389371531e4c 100644 (file)
@@ -455,8 +455,8 @@ int ModApiServer::l_sound_fade(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
        s32 handle = luaL_checkinteger(L, 1);
-       float step = luaL_checknumber(L, 2);
-       float gain = luaL_checknumber(L, 3);
+       float step = readParam<float>(L, 2);
+       float gain = readParam<float>(L, 3);
        getServer(L)->fadeSound(handle, step, gain);
        return 0;
 }
index c1b760941fb9c19d208c2d7cdbfd4633c5760ec2..b25697611a34e0209b6c6b649ca6c308e666da6b 100644 (file)
@@ -179,8 +179,7 @@ int ModApiUtil::l_get_hit_params(lua_State *L)
        if(lua_isnoneornil(L, 3))
                push_hit_params(L, getHitParams(groups, &tp));
        else
-               push_hit_params(L, getHitParams(groups, &tp,
-                                       luaL_checknumber(L, 3)));
+               push_hit_params(L, getHitParams(groups, &tp, readParam<float>(L, 3)));
        return 1;
 }
 
@@ -270,7 +269,7 @@ int ModApiUtil::l_compress(lua_State *L)
 
        int level = -1;
        if (!lua_isnone(L, 3) && !lua_isnil(L, 3))
-               level = luaL_checknumber(L, 3);
+               level = readParam<float>(L, 3);
 
        std::ostringstream os;
        compressZlib(std::string(data, size), os, level);