Selaa lähdekoodia

lua: move pushing args to LuaStack

Daniele Bartolini 4 kuukautta sitten
vanhempi
sitoutus
9f038ad363
4 muutettua tiedostoa jossa 71 lisäystä ja 55 poistoa
  1. 23 0
      src/lua/lua_stack.cpp
  2. 47 0
      src/lua/lua_stack.h
  3. 1 18
      src/world/script_world.cpp
  4. 0 37
      src/world/script_world.h

+ 23 - 0
src/lua/lua_stack.cpp

@@ -3,12 +3,35 @@
  * SPDX-License-Identifier: MIT
  */
 
+#include "core/strings/string_id.inl"
 #include "device/device.h"
 #include "lua/lua_environment.h"
 #include "lua/lua_stack.inl"
 
 namespace crown
 {
+void LuaStack::push_args(const ArgType::Enum *arg_types, const Arg *args, u32 num)
+{
+	for (u32 i = 0; i < num; ++i) {
+		switch (arg_types[i]) {
+		case ArgType::NIL: push_nil(); break;
+		case ArgType::INT: push_int(args[i].int_value); break;
+		case ArgType::BOOL: push_bool(args[i].bool_value); break;
+		case ArgType::FLOAT: push_float(args[i].float_value); break;
+		case ArgType::STRING: push_string(args[i].string_value); break;
+		case ArgType::STRING_ID: push_string_id(StringId32(args[i].string_id_value)); break;
+		case ArgType::POINTER: push_pointer((void *)args[i].pointer_value); break;
+		case ArgType::FUNCTION: push_function(args[i].cfunction_value); break;
+		case ArgType::UNIT: push_unit(args[i].unit_value); break;
+		case ArgType::ID: push_id(args[i].id_value); break;
+		case ArgType::VECTOR3: push_vector3(args[i].vector3_value); break;
+		case ArgType::QUATERNION: push_quaternion(args[i].quaternion_value); break;
+		case ArgType::MATRIX4X4: push_matrix4x4(args[i].matrix4x4_value); break;
+		default: CE_FATAL("Unknown argument type"); break;
+		}
+	}
+}
+
 bool LuaStack::is_vector3(int i)
 {
 	return device()->_lua_environment->is_vector3((Vector3 *)lua_touserdata(L, i));

+ 47 - 0
src/lua/lua_stack.h

@@ -37,6 +37,50 @@ typedef int (*lua_CFunction)(lua_State *L);
 
 namespace crown
 {
+/// Enumerates generic lua argument types.
+///
+/// @ingroup Lua
+struct ArgType
+{
+	enum Enum
+	{
+		NIL,
+		BOOL,
+		INT,
+		FLOAT,
+		STRING,
+		STRING_ID,
+		POINTER,
+		FUNCTION,
+		UNIT,
+		ID,
+		VECTOR3,
+		QUATERNION,
+		MATRIX4X4,
+
+		COUNT
+	};
+};
+
+/// Generic lua argument.
+///
+/// @ingroup Lua
+union Arg
+{
+	bool bool_value;
+	int int_value;
+	f32 float_value;
+	const char *string_value;
+	u32 string_id_value;
+	const void *pointer_value;
+	lua_CFunction cfunction_value;
+	UnitId unit_value;
+	u32 id_value;
+	Vector3 vector3_value;
+	Quaternion quaternion_value;
+	Matrix4x4 matrix4x4_value;
+};
+
 /// Wrapper to manipulate Lua stack.
 ///
 /// @ingroup Lua
@@ -317,6 +361,9 @@ struct LuaStack
 	///
 	void push_value(int i);
 
+	///
+	void push_args(const ArgType::Enum *arg_types, const Arg *args, u32 num);
+
 	///
 	void call(int nresults);
 

+ 1 - 18
src/world/script_world.cpp

@@ -221,24 +221,7 @@ namespace script_world
 			stack.push_key_end();
 		}
 
-		for (u32 i = 0; i < num_args; ++i) {
-			switch (arg_types[i]) {
-			case ArgType::NIL: stack.push_nil(); break;
-			case ArgType::INT: stack.push_int(args[i].int_value); break;
-			case ArgType::BOOL: stack.push_bool(args[i].bool_value); break;
-			case ArgType::FLOAT: stack.push_float(args[i].float_value); break;
-			case ArgType::STRING: stack.push_string(args[i].string_value); break;
-			case ArgType::STRING_ID: stack.push_string_id(StringId32(args[i].string_id_value)); break;
-			case ArgType::POINTER: stack.push_pointer((void *)args[i].pointer_value); break;
-			case ArgType::FUNCTION: stack.push_function(args[i].cfunction_value); break;
-			case ArgType::UNIT: stack.push_unit(args[i].unit_value); break;
-			case ArgType::ID: stack.push_id(args[i].id_value); break;
-			case ArgType::VECTOR3: stack.push_vector3(args[i].vector3_value); break;
-			case ArgType::QUATERNION: stack.push_quaternion(args[i].quaternion_value); break;
-			case ArgType::MATRIX4X4: stack.push_matrix4x4(args[i].matrix4x4_value); break;
-			default: CE_FATAL("Unknown argument type"); break;
-			}
-		}
+		stack.push_args(arg_types, args, num_args);
 
 		int status = sw._lua_environment->call(1 + num_args, 0);
 		if (status != LUA_OK) {

+ 0 - 37
src/world/script_world.h

@@ -77,43 +77,6 @@ namespace script_world
 		u32 unit_index;
 	};
 
-	struct ArgType
-	{
-		enum Enum
-		{
-			NIL,
-			BOOL,
-			INT,
-			FLOAT,
-			STRING,
-			STRING_ID,
-			POINTER,
-			FUNCTION,
-			UNIT,
-			ID,
-			VECTOR3,
-			QUATERNION,
-			MATRIX4X4,
-
-			COUNT
-		};
-	};
-
-	union Arg
-	{
-		bool bool_value;
-		int int_value;
-		f32 float_value;
-		const char *string_value;
-		u32 string_id_value;
-		const void *pointer_value;
-		lua_CFunction cfunction_value;
-		UnitId unit_value;
-		u32 id_value;
-		Vector3 vector3_value;
-		Quaternion quaternion_value;
-		Matrix4x4 matrix4x4_value;
-	};
 
 	///
 	void multicast(ScriptWorld &sw