@@ -23,6 +23,7 @@ extern "C" {
23
23
}
24
24
25
25
#include " util/numeric.h"
26
+ #include " util/serialize.h"
26
27
#include " util/string.h"
27
28
#include " common/c_converter.h"
28
29
#include " constants.h"
@@ -37,6 +38,14 @@ extern "C" {
37
38
} \
38
39
} while (0 )
39
40
#define CHECK_POS_COORD (name ) CHECK_TYPE(-1 , " position coordinate '" name " '" , LUA_TNUMBER)
41
+ #define CHECK_FLOAT_RANGE (value, name ) \
42
+ if (value < F1000_MIN || value > F1000_MAX) { \
43
+ std::ostringstream error_text; \
44
+ error_text << " Invalid float vector dimension range '" name " ' " << \
45
+ " (expected " << F1000_MIN << " < " name " < " << F1000_MAX << \
46
+ " got " << value << " )." << std::endl; \
47
+ throw LuaError (error_text.str ()); \
48
+ }
40
49
#define CHECK_POS_TAB (index ) CHECK_TYPE(index, " position" , LUA_TTABLE)
41
50
42
51
@@ -170,14 +179,17 @@ v3f check_v3f(lua_State *L, int index)
170
179
lua_getfield (L, index , " x" );
171
180
CHECK_POS_COORD (" x" );
172
181
pos.X = lua_tonumber (L, -1 );
182
+ CHECK_FLOAT_RANGE (pos.X , " x" )
173
183
lua_pop (L, 1 );
174
184
lua_getfield (L, index , " y" );
175
185
CHECK_POS_COORD (" y" );
176
186
pos.Y = lua_tonumber (L, -1 );
187
+ CHECK_FLOAT_RANGE (pos.Y , " y" )
177
188
lua_pop (L, 1 );
178
189
lua_getfield (L, index , " z" );
179
190
CHECK_POS_COORD (" z" );
180
191
pos.Z = lua_tonumber (L, -1 );
192
+ CHECK_FLOAT_RANGE (pos.Z , " z" )
181
193
lua_pop (L, 1 );
182
194
return pos;
183
195
}
0 commit comments