Просмотр исходного кода

lua: check for validity first, then type

Fixes: #239
Daniele Bartolini 1 год назад
Родитель
Сommit
3453f86d40
2 измененных файлов с 16 добавлено и 6 удалено
  1. 4 0
      docs/changelog.rst
  2. 12 6
      src/lua/lua_stack.cpp

+ 4 - 0
docs/changelog.rst

@@ -4,6 +4,10 @@ Changelog
 0.55.0 --- DD MMM YYYY
 ----------------------
 
+**Runtime**
+
+* Lua: fixed max temporaries check failing to trigger in some circumnstances.
+
 0.54.0 --- 13 Jan 2025
 ----------------------
 

+ 12 - 6
src/lua/lua_stack.cpp

@@ -28,34 +28,40 @@ bool LuaStack::is_matrix4x4(int i)
 Vector3 *LuaStack::check_temporary(int i, const Vector3 *ptr)
 {
 	LuaEnvironment *env = device()->_lua_environment;
-	if (CE_UNLIKELY(!env->is_vector3(ptr))) {
+
+	Vector3 *v = env->check_valid(ptr);
+	if (CE_UNLIKELY(!env->is_vector3(v))) {
 		luaL_typerror(L, i, "Vector3");
 		CE_UNREACHABLE();
 	}
 
-	return env->check_valid(ptr);
+	return v;
 }
 
 Quaternion *LuaStack::check_temporary(int i, const Quaternion *ptr)
 {
 	LuaEnvironment *env = device()->_lua_environment;
-	if (CE_UNLIKELY(!env->is_quaternion(ptr))) {
+
+	Quaternion *q = env->check_valid(ptr);
+	if (CE_UNLIKELY(!env->is_quaternion(q))) {
 		luaL_typerror(L, i, "Quaternion");
 		CE_UNREACHABLE();
 	}
 
-	return env->check_valid(ptr);
+	return q;
 }
 
 Matrix4x4 *LuaStack::check_temporary(int i, const Matrix4x4 *ptr)
 {
 	LuaEnvironment *env = device()->_lua_environment;
-	if (CE_UNLIKELY(!env->is_matrix4x4(ptr))) {
+
+	Matrix4x4 *m = env->check_valid(ptr);
+	if (CE_UNLIKELY(!env->is_matrix4x4(m))) {
 		luaL_typerror(L, i, "Matrix4x4");
 		CE_UNREACHABLE();
 	}
 
-	return env->check_valid(ptr);
+	return m;
 }
 #endif // if CROWN_DEBUG