aboutsummaryrefslogtreecommitdiff
path: root/src/script/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/common')
-rw-r--r--src/script/common/c_content.cpp44
-rw-r--r--src/script/common/c_content.h6
-rw-r--r--src/script/common/c_converter.cpp120
-rw-r--r--src/script/common/c_internal.h8
4 files changed, 66 insertions, 112 deletions
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 928717a05..cbe2d328c 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -1175,43 +1175,27 @@ NodeBox read_nodebox(lua_State *L, int index)
}
/******************************************************************************/
-MapNode readnode(lua_State *L, int index, const NodeDefManager *ndef)
+MapNode readnode(lua_State *L, int index)
{
- lua_getfield(L, index, "name");
- if (!lua_isstring(L, -1))
- throw LuaError("Node name is not set or is not a string!");
- std::string name = lua_tostring(L, -1);
- lua_pop(L, 1);
-
- u8 param1 = 0;
- lua_getfield(L, index, "param1");
- if (!lua_isnil(L, -1))
- param1 = lua_tonumber(L, -1);
- lua_pop(L, 1);
-
- u8 param2 = 0;
- lua_getfield(L, index, "param2");
- if (!lua_isnil(L, -1))
- param2 = lua_tonumber(L, -1);
- lua_pop(L, 1);
-
- content_t id = CONTENT_IGNORE;
- if (!ndef->getId(name, id))
- throw LuaError("\"" + name + "\" is not a registered node!");
-
- return {id, param1, param2};
+ lua_pushvalue(L, index);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_NODE);
+ lua_insert(L, -2);
+ lua_call(L, 1, 3);
+ content_t content = lua_tointeger(L, -3);
+ u8 param1 = lua_tointeger(L, -2);
+ u8 param2 = lua_tointeger(L, -1);
+ lua_pop(L, 3);
+ return MapNode(content, param1, param2);
}
/******************************************************************************/
-void pushnode(lua_State *L, const MapNode &n, const NodeDefManager *ndef)
+void pushnode(lua_State *L, const MapNode &n)
{
- lua_createtable(L, 0, 3);
- lua_pushstring(L, ndef->get(n).name.c_str());
- lua_setfield(L, -2, "name");
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_NODE);
+ lua_pushinteger(L, n.getContent());
lua_pushinteger(L, n.getParam1());
- lua_setfield(L, -2, "param1");
lua_pushinteger(L, n.getParam2());
- lua_setfield(L, -2, "param2");
+ lua_call(L, 3, 1);
}
/******************************************************************************/
diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h
index ade3e4c1e..457b3f840 100644
--- a/src/script/common/c_content.h
+++ b/src/script/common/c_content.h
@@ -129,10 +129,8 @@ void read_inventory_list (lua_State *L, int tableindex,
Inventory *inv, const char *name,
IGameDef *gdef, int forcesize=-1);
-MapNode readnode (lua_State *L, int index,
- const NodeDefManager *ndef);
-void pushnode (lua_State *L, const MapNode &n,
- const NodeDefManager *ndef);
+MapNode readnode (lua_State *L, int index);
+void pushnode (lua_State *L, const MapNode &n);
void read_groups (lua_State *L, int index,
diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp
index 69da35b73..90b78a081 100644
--- a/src/script/common/c_converter.cpp
+++ b/src/script/common/c_converter.cpp
@@ -48,17 +48,19 @@ extern "C" {
} \
} while (0)
-#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "vector coordinate " name, LUA_TNUMBER)
+#define CHECK_POS_COORD(index, name) CHECK_TYPE(index, "vector coordinate " name, LUA_TNUMBER)
#define CHECK_POS_TAB(index) CHECK_TYPE(index, "vector", LUA_TTABLE)
/**
- * A helper which sets the vector metatable for the table on top of the stack
+ * A helper which calls CUSTOM_RIDX_READ_VECTOR with the argument at the given index
*/
-static void set_vector_metatable(lua_State *L)
+static void read_v3_aux(lua_State *L, int index)
{
- lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE);
- lua_setmetatable(L, -2);
+ lua_pushvalue(L, index);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_VECTOR);
+ lua_insert(L, -2);
+ lua_call(L, 1, 3);
}
// Retrieve an integer vector where all components are optional
@@ -79,14 +81,11 @@ static bool getv3intfield(lua_State *L, int index,
void push_v3f(lua_State *L, v3f p)
{
- lua_createtable(L, 0, 3);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR);
lua_pushnumber(L, p.X);
- lua_setfield(L, -2, "x");
lua_pushnumber(L, p.Y);
- lua_setfield(L, -2, "y");
lua_pushnumber(L, p.Z);
- lua_setfield(L, -2, "z");
- set_vector_metatable(L);
+ lua_call(L, 3, 1);
}
void push_v2f(lua_State *L, v2f p)
@@ -160,12 +159,12 @@ v2f check_v2f(lua_State *L, int index)
v2f p;
CHECK_POS_TAB(index);
lua_getfield(L, index, "x");
- CHECK_POS_COORD("x");
+ CHECK_POS_COORD(-1, "x");
p.X = lua_tonumber(L, -1);
CHECK_FLOAT(p.X, "x");
lua_pop(L, 1);
lua_getfield(L, index, "y");
- CHECK_POS_COORD("y");
+ CHECK_POS_COORD(-1, "y");
p.Y = lua_tonumber(L, -1);
CHECK_FLOAT(p.Y, "y");
lua_pop(L, 1);
@@ -174,78 +173,48 @@ v2f check_v2f(lua_State *L, int index)
v3f read_v3f(lua_State *L, int index)
{
- v3f pos;
- CHECK_POS_TAB(index);
- lua_getfield(L, index, "x");
- pos.X = lua_tonumber(L, -1);
- lua_pop(L, 1);
- lua_getfield(L, index, "y");
- pos.Y = lua_tonumber(L, -1);
- lua_pop(L, 1);
- lua_getfield(L, index, "z");
- pos.Z = lua_tonumber(L, -1);
- lua_pop(L, 1);
- return pos;
+ read_v3_aux(L, index);
+ float x = lua_tonumber(L, -3);
+ float y = lua_tonumber(L, -2);
+ float z = lua_tonumber(L, -1);
+ lua_pop(L, 3);
+ return v3f(x, y, z);
}
v3f check_v3f(lua_State *L, int index)
{
- v3f pos;
- CHECK_POS_TAB(index);
- lua_getfield(L, index, "x");
- CHECK_POS_COORD("x");
- pos.X = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.X, "x");
- lua_pop(L, 1);
- lua_getfield(L, index, "y");
- CHECK_POS_COORD("y");
- pos.Y = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.Y, "y");
- lua_pop(L, 1);
- lua_getfield(L, index, "z");
- CHECK_POS_COORD("z");
- pos.Z = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.Z, "z");
- lua_pop(L, 1);
- return pos;
+ read_v3_aux(L, index);
+ CHECK_POS_COORD(-3, "x");
+ CHECK_POS_COORD(-2, "y");
+ CHECK_POS_COORD(-1, "z");
+ float x = lua_tonumber(L, -3);
+ float y = lua_tonumber(L, -2);
+ float z = lua_tonumber(L, -1);
+ lua_pop(L, 3);
+ return v3f(x, y, z);
}
v3d read_v3d(lua_State *L, int index)
{
- v3d pos;
- CHECK_POS_TAB(index);
- lua_getfield(L, index, "x");
- pos.X = lua_tonumber(L, -1);
- lua_pop(L, 1);
- lua_getfield(L, index, "y");
- pos.Y = lua_tonumber(L, -1);
- lua_pop(L, 1);
- lua_getfield(L, index, "z");
- pos.Z = lua_tonumber(L, -1);
- lua_pop(L, 1);
- return pos;
+ read_v3_aux(L, index);
+ double x = lua_tonumber(L, -3);
+ double y = lua_tonumber(L, -2);
+ double z = lua_tonumber(L, -1);
+ lua_pop(L, 3);
+ return v3d(x, y, z);
}
v3d check_v3d(lua_State *L, int index)
{
- v3d pos;
- CHECK_POS_TAB(index);
- lua_getfield(L, index, "x");
- CHECK_POS_COORD("x");
- pos.X = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.X, "x");
- lua_pop(L, 1);
- lua_getfield(L, index, "y");
- CHECK_POS_COORD("y");
- pos.Y = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.Y, "y");
- lua_pop(L, 1);
- lua_getfield(L, index, "z");
- CHECK_POS_COORD("z");
- pos.Z = lua_tonumber(L, -1);
- CHECK_FLOAT(pos.Z, "z");
- lua_pop(L, 1);
- return pos;
+ read_v3_aux(L, index);
+ CHECK_POS_COORD(-3, "x");
+ CHECK_POS_COORD(-2, "y");
+ CHECK_POS_COORD(-1, "z");
+ double x = lua_tonumber(L, -3);
+ double y = lua_tonumber(L, -2);
+ double z = lua_tonumber(L, -1);
+ lua_pop(L, 3);
+ return v3d(x, y, z);
}
void push_ARGB8(lua_State *L, video::SColor color)
@@ -274,14 +243,11 @@ v3f checkFloatPos(lua_State *L, int index)
void push_v3s16(lua_State *L, v3s16 p)
{
- lua_createtable(L, 0, 3);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR);
lua_pushinteger(L, p.X);
- lua_setfield(L, -2, "x");
lua_pushinteger(L, p.Y);
- lua_setfield(L, -2, "y");
lua_pushinteger(L, p.Z);
- lua_setfield(L, -2, "z");
- set_vector_metatable(L);
+ lua_call(L, 3, 1);
}
v3s16 read_v3s16(lua_State *L, int index)
diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h
index 95ffe7d3b..5cbcbb7db 100644
--- a/src/script/common/c_internal.h
+++ b/src/script/common/c_internal.h
@@ -56,8 +56,14 @@ enum {
CUSTOM_RIDX_CURRENT_MOD_NAME,
CUSTOM_RIDX_BACKTRACE,
CUSTOM_RIDX_HTTP_API_LUA,
- CUSTOM_RIDX_VECTOR_METATABLE,
CUSTOM_RIDX_METATABLE_MAP,
+
+ // The following four functions are implemented in Lua because LuaJIT can
+ // trace them and optimize tables/string better than from the C API.
+ CUSTOM_RIDX_READ_VECTOR,
+ CUSTOM_RIDX_PUSH_VECTOR,
+ CUSTOM_RIDX_READ_NODE,
+ CUSTOM_RIDX_PUSH_NODE,
};