commit 5ef1486: [Rework] Lua core: Use lightuserdata to index classes

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Sep 16 12:21:07 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-09-16 13:10:42 +0100
URL: https://github.com/rspamd/rspamd/commit/5ef148649daca54714bd141bd473072250b46d83

[Rework] Lua core: Use lightuserdata to index classes

---
 src/lua/lua_cdb.c          |  14 +-----
 src/lua/lua_common.c       | 113 +++++++++++++++++++++++++++++++++------------
 src/lua/lua_common.h       |   9 ----
 src/lua/lua_cryptobox.c    |  50 ++++----------------
 src/lua/lua_dns_resolver.c |  15 ++----
 src/lua/lua_expression.c   |  14 +-----
 src/lua/lua_ip.c           |  14 +-----
 src/lua/lua_mempool.c      |  14 +-----
 src/lua/lua_redis.c        |  12 +----
 src/lua/lua_regexp.c       |  14 +-----
 src/lua/lua_rsa.c          |  36 +++------------
 src/lua/lua_sqlite3.c      |  22 +--------
 src/lua/lua_trie.c         |  14 +-----
 src/lua/lua_upstream.c     |  28 ++---------
 14 files changed, 119 insertions(+), 250 deletions(-)

diff --git a/src/lua/lua_cdb.c b/src/lua/lua_cdb.c
index 5d4c499a7..1f9b48260 100644
--- a/src/lua/lua_cdb.c
+++ b/src/lua/lua_cdb.c
@@ -151,17 +151,7 @@ lua_load_cdb (lua_State *L)
 void
 luaopen_cdb (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{cdb}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{cdb}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,	 cdblib_m);
-	lua_pop (L, 1);                      /* remove metatable from stack */
-
+	rspamd_lua_new_class (L, "rspamd{cdb}", cdblib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_cdb", lua_load_cdb);
 }
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index 5de0fa9ce..0040847c1 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -45,6 +45,25 @@ lua_error_quark (void)
 	return g_quark_from_static_string ("lua-routines");
 }
 
+/* idea from daurnimator */
+#if defined(WITH_LUAJIT) && (defined(_LP64) || defined(_LLP64) || defined(__arch64__) || defined (__arm64__) || defined (__aarch64__) || defined(_WIN64))
+#define RSPAMD_USE_47BIT_LIGHTUSERDATA_HACK 1
+#else
+#define RSPAMD_USE_47BIT_LIGHTUSERDATA_HACK 0
+#endif
+
+#if RSPAMD_USE_47BIT_LIGHTUSERDATA_HACK
+#define RSPAMD_LIGHTUSERDATA_MASK(p) ((void *)((uintptr_t)(p) & ((1UL<<47)-1)))
+#else
+#define RSPAMD_LIGHTUSERDATA_MASK(p) ((void *)(p))
+#endif
+
+/*
+ * Used to map string to a pointer
+ */
+KHASH_INIT (lua_class_set, const gchar *, bool, 0, rspamd_str_hash, rspamd_str_equal);
+khash_t (lua_class_set) *lua_classes = NULL;
+
 /* Util functions */
 /**
  * Create new class and store metatable on top of the stack (must be popped if not needed)
@@ -57,33 +76,48 @@ rspamd_lua_new_class (lua_State * L,
 	const gchar *classname,
 	const struct luaL_reg *methods)
 {
-	luaL_newmetatable (L, classname);   /* mt */
+	void *class_ptr;
+	khiter_t k;
+	gint r, nmethods = 0;
+
+	if (lua_classes == NULL) {
+		lua_classes = kh_init (lua_class_set);
+	}
+
+	k = kh_put (lua_class_set, lua_classes, classname, &r);
+	class_ptr = RSPAMD_LIGHTUSERDATA_MASK (kh_key (lua_classes, k));
+
+	if (methods) {
+		for (;;) {
+			if (methods[nmethods].name != NULL) {
+				nmethods ++;
+			}
+			else {
+				break;
+			}
+		}
+	}
+
+	lua_createtable (L, 0, 3 + nmethods);
 	lua_pushstring (L, "__index");
 	lua_pushvalue (L, -2);      /* pushes the metatable */
 	lua_settable (L, -3);       /* metatable.__index = metatable */
 
-	lua_pushstring (L, "class");    /* mt,"class" */
-	lua_pushstring (L, classname);  /* mt,"class",classname */
-	lua_rawset (L, -3);         /* mt */
+	lua_pushstring (L, "class");
+	lua_pushstring (L, classname);
+	lua_rawset (L, -3);
+
+	lua_pushstring (L, "class_ptr");
+	lua_pushlightuserdata (L, class_ptr);
+	lua_rawset (L, -3);
 
 	if (methods) {
 		luaL_register (L, NULL, methods); /* pushes all methods as MT fields */
 	}
-	/* MT is left on stack ! */
-}
 
-/**
- * Create and register new class with static methods and store metatable on top of the stack
- */
-void
-rspamd_lua_new_class_full (lua_State *L,
-	const gchar *classname,
-	const gchar *static_name,
-	const struct luaL_reg *methods,
-	const struct luaL_reg *func)
-{
-	rspamd_lua_new_class (L, classname, methods);
-	luaL_register (L, static_name, func);
+	lua_pushvalue (L, -1); /* Preserves metatable */
+	lua_rawsetp (L, LUA_REGISTRYINDEX, class_ptr);
+	/* MT is left on stack ! */
 }
 
 static const gchar *
@@ -150,7 +184,14 @@ rspamd_lua_class_tostring (lua_State * L)
 void
 rspamd_lua_setclass (lua_State * L, const gchar *classname, gint objidx)
 {
-	luaL_getmetatable (L, classname);
+	khiter_t k;
+
+	k = kh_get (lua_class_set, lua_classes, classname);
+
+	g_assert (k != kh_end (lua_classes));
+	lua_rawgetp (L, LUA_REGISTRYINDEX,
+			RSPAMD_LIGHTUSERDATA_MASK (kh_key (lua_classes, k)));
+
 	if (objidx < 0) {
 		objidx--;
 	}
@@ -161,7 +202,6 @@ rspamd_lua_setclass (lua_State * L, const gchar *classname, gint objidx)
 void
 rspamd_lua_table_set (lua_State * L, const gchar *index, const gchar *value)
 {
-
 	lua_pushstring (L, index);
 	if (value) {
 		lua_pushstring (L, value);
@@ -929,16 +969,10 @@ rspamd_lua_init (bool wipe_mem)
 	lua_settop (L, 0);
 #endif
 
-	luaL_newmetatable (L, "rspamd{ev_base}");
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{ev_base}");
-	lua_rawset (L, -3);
+	rspamd_lua_new_class (L, "rspamd{ev_base}", NULL);
 	lua_pop (L, 1);
 
-	luaL_newmetatable (L, "rspamd{session}");
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{session}");
-	lua_rawset (L, -3);
+	rspamd_lua_new_class (L, "rspamd{session}", NULL);
 	lua_pop (L, 1);
 
 	rspamd_lua_add_preload (L, "lpeg", luaopen_lpeg);
@@ -1206,12 +1240,23 @@ gpointer
 rspamd_lua_check_class (lua_State *L, gint index, const gchar *name)
 {
 	gpointer p;
+	khiter_t k;
 
 	if (lua_type (L, index) == LUA_TUSERDATA) {
 		p = lua_touserdata (L, index);
 		if (p) {
 			if (lua_getmetatable (L, index)) {
-				lua_getfield (L, LUA_REGISTRYINDEX, name);  /* get correct metatable */
+				k = kh_get (lua_class_set, lua_classes, name);
+
+				if (k == kh_end (lua_classes)) {
+					lua_pop (L, 1);
+
+					return NULL;
+				}
+
+				lua_rawgetp (L, LUA_REGISTRYINDEX,
+						RSPAMD_LIGHTUSERDATA_MASK (kh_value (lua_classes, k)));
+
 				if (lua_rawequal (L, -1, -2)) {  /* does it have the correct mt? */
 					lua_pop (L, 2);  /* remove both metatables */
 					return p;
@@ -1824,6 +1869,7 @@ rspamd_lua_check_udata_common (lua_State *L, gint pos, const gchar *classname,
 {
 	void *p = lua_touserdata (L, pos);
 	guint i, top = lua_gettop (L);
+	khiter_t k;
 
 	if (p == NULL) {
 		goto err;
@@ -1831,7 +1877,14 @@ rspamd_lua_check_udata_common (lua_State *L, gint pos, const gchar *classname,
 	else {
 		/* Match class */
 		if (lua_getmetatable (L, pos)) {
-			luaL_getmetatable (L, classname);
+			k = kh_get (lua_class_set, lua_classes, (gchar *)classname);
+
+			if (k == kh_end (lua_classes)) {
+				goto err;
+			}
+
+			lua_rawgetp (L, LUA_REGISTRYINDEX,
+					RSPAMD_LIGHTUSERDATA_MASK (kh_key (lua_classes, k)));
 
 			if (!lua_rawequal (L, -1, -2)) {
 				goto err;
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index 265775835..9878cc521 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -154,15 +154,6 @@ void rspamd_lua_new_class (lua_State *L,
 						   const gchar *classname,
 						   const struct luaL_reg *methods);
 
-/**
- * Create and register new class with static methods
- */
-void rspamd_lua_new_class_full (lua_State *L,
-								const gchar *classname,
-								const gchar *static_name,
-								const struct luaL_reg *methods,
-								const struct luaL_reg *func);
-
 /**
  * Set class name for object at @param objidx position
  */
diff --git a/src/lua/lua_cryptobox.c b/src/lua/lua_cryptobox.c
index 35faa0037..645b2495f 100644
--- a/src/lua/lua_cryptobox.c
+++ b/src/lua/lua_cryptobox.c
@@ -2437,54 +2437,20 @@ lua_load_cryptobox (lua_State * L)
 void
 luaopen_cryptobox (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{cryptobox_pubkey}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{cryptobox_pubkey}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, cryptoboxpubkeylib_m);
+	rspamd_lua_new_class (L, "rspamd{cryptobox_pubkey}", cryptoboxpubkeylib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_cryptobox_pubkey", lua_load_pubkey);
 
-	luaL_newmetatable (L, "rspamd{cryptobox_keypair}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{cryptobox_keypair}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, cryptoboxkeypairlib_m);
+	rspamd_lua_new_class (L, "rspamd{cryptobox_keypair}", cryptoboxkeypairlib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_cryptobox_keypair", lua_load_keypair);
 
-	luaL_newmetatable (L, "rspamd{cryptobox_signature}");
-
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{cryptobox_signature}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, cryptoboxsignlib_m);
+	rspamd_lua_new_class (L, "rspamd{cryptobox_signature}", cryptoboxsignlib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_cryptobox_signature", lua_load_signature);
 
-	luaL_newmetatable (L, "rspamd{cryptobox_hash}");
-
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{cryptobox_hash}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, cryptoboxhashlib_m);
+	rspamd_lua_new_class (L, "rspamd{cryptobox_hash}", cryptoboxhashlib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_cryptobox_hash", lua_load_hash);
 
 	rspamd_lua_add_preload (L, "rspamd_cryptobox", lua_load_cryptobox);
diff --git a/src/lua/lua_dns_resolver.c b/src/lua/lua_dns_resolver.c
index a4e3b4b03..5478ab65a 100644
--- a/src/lua/lua_dns_resolver.c
+++ b/src/lua/lua_dns_resolver.c
@@ -693,15 +693,7 @@ void
 luaopen_dns_resolver (lua_State * L)
 {
 
-	luaL_newmetatable (L, "rspamd{resolver}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{resolver}");
-	lua_rawset (L, -3);
-
+	rspamd_lua_new_class (L, "rspamd{resolver}", dns_resolverlib_m);
 	{
 		LUA_ENUM (L, DNS_A,	 RDNS_REQUEST_A);
 		LUA_ENUM (L, DNS_PTR, RDNS_REQUEST_PTR);
@@ -713,8 +705,7 @@ luaopen_dns_resolver (lua_State * L)
 		LUA_ENUM (L, DNS_SOA, RDNS_REQUEST_SOA);
 	}
 
-	luaL_register (L, NULL, dns_resolverlib_m);
-	rspamd_lua_add_preload (L, "rspamd_resolver", lua_load_dns_resolver);
+	lua_pop (L, 1);
 
-	lua_pop (L, 1);                      /* remove metatable from stack */
+	rspamd_lua_add_preload (L, "rspamd_resolver", lua_load_dns_resolver);
 }
diff --git a/src/lua/lua_expression.c b/src/lua/lua_expression.c
index c0e75fe84..60ee8fdf7 100644
--- a/src/lua/lua_expression.c
+++ b/src/lua/lua_expression.c
@@ -511,17 +511,7 @@ lua_load_expression (lua_State * L)
 void
 luaopen_expression (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{expr}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{expr}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,		   exprlib_m);
+	rspamd_lua_new_class (L, "rspamd{expr}", exprlib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_expression", lua_load_expression);
-
-	lua_pop (L, 1);                      /* remove metatable from stack */
 }
diff --git a/src/lua/lua_ip.c b/src/lua/lua_ip.c
index 3c3ef2d51..1d44af2bf 100644
--- a/src/lua/lua_ip.c
+++ b/src/lua/lua_ip.c
@@ -584,17 +584,7 @@ lua_load_ip (lua_State * L)
 void
 luaopen_ip (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{ip}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{ip}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,		   iplib_m);
-	rspamd_lua_add_preload (L, "rspamd_ip", lua_load_ip);
-
+	rspamd_lua_new_class (L, "rspamd{ip}", iplib_m);
 	lua_pop (L, 1);
+	rspamd_lua_add_preload (L, "rspamd_ip", lua_load_ip);
 }
diff --git a/src/lua/lua_mempool.c b/src/lua/lua_mempool.c
index 62d294111..06dcd2d5c 100644
--- a/src/lua/lua_mempool.c
+++ b/src/lua/lua_mempool.c
@@ -582,17 +582,7 @@ lua_load_mempool (lua_State * L)
 void
 luaopen_mempool (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{mempool}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{mempool}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,				mempoollib_m);
+	rspamd_lua_new_class (L, "rspamd{mempool}", mempoollib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_mempool", lua_load_mempool);
-
-	lua_pop (L, 1);                      /* remove metatable from stack */
 }
diff --git a/src/lua/lua_redis.c b/src/lua/lua_redis.c
index ac1a8c297..279f84ffa 100644
--- a/src/lua/lua_redis.c
+++ b/src/lua/lua_redis.c
@@ -1603,17 +1603,7 @@ lua_load_redis (lua_State * L)
 void
 luaopen_redis (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{redis}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{redis}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, redislib_m);
+	rspamd_lua_new_class (L, "rspamd{redis}", redislib_m);
 	lua_pop (L, 1);
-
 	rspamd_lua_add_preload (L, "rspamd_redis", lua_load_redis);
 }
diff --git a/src/lua/lua_regexp.c b/src/lua/lua_regexp.c
index 4033722a3..95f40f8f0 100644
--- a/src/lua/lua_regexp.c
+++ b/src/lua/lua_regexp.c
@@ -880,22 +880,12 @@ lua_load_regexp (lua_State * L)
 void
 luaopen_regexp (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{regexp}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{regexp}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, regexplib_m);
+	rspamd_lua_new_class (L, "rspamd{regexp}", regexplib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_regexp", lua_load_regexp);
 
 	if (regexp_static_pool == NULL) {
 		regexp_static_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
 				"regexp_lua_pool");
 	}
-
-	lua_settop (L, 0);
 }
diff --git a/src/lua/lua_rsa.c b/src/lua/lua_rsa.c
index 58607f92c..4b2caa2bf 100644
--- a/src/lua/lua_rsa.c
+++ b/src/lua/lua_rsa.c
@@ -719,40 +719,16 @@ lua_load_rsa (lua_State * L)
 void
 luaopen_rsa (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{rsa_pubkey}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{rsa_pubkey}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, rsapubkeylib_m);
+	rspamd_lua_new_class (L, "rspamd{rsa_pubkey}", rsapubkeylib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_rsa_pubkey", lua_load_pubkey);
 
-	luaL_newmetatable (L, "rspamd{rsa_privkey}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{rsa_privkey}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, rsaprivkeylib_m);
+	rspamd_lua_new_class (L, "rspamd{rsa_privkey}", rsaprivkeylib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_rsa_privkey", lua_load_privkey);
 
-	luaL_newmetatable (L, "rspamd{rsa_signature}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{rsa_signature}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, rsasignlib_m);
+	rspamd_lua_new_class (L, "rspamd{rsa_signature}", rsasignlib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_rsa_signature", lua_load_signature);
 
 	rspamd_lua_add_preload (L, "rspamd_rsa", lua_load_rsa);
diff --git a/src/lua/lua_sqlite3.c b/src/lua/lua_sqlite3.c
index 87d798666..95104d1b0 100644
--- a/src/lua/lua_sqlite3.c
+++ b/src/lua/lua_sqlite3.c
@@ -373,28 +373,10 @@ lua_load_sqlite3 (lua_State * L)
 void
 luaopen_sqlite3 (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{sqlite3}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{sqlite3}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, sqlitelib_m);
+	rspamd_lua_new_class (L, "rspamd{sqlite3}", sqlitelib_m);
 	lua_pop (L, 1);
 
-	luaL_newmetatable (L, "rspamd{sqlite3_stmt}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{sqlite3_stmt}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL, sqlitestmtlib_m);
+	rspamd_lua_new_class (L, "rspamd{sqlite3_stmt}", sqlitestmtlib_m);
 	lua_pop (L, 1);
 
 	rspamd_lua_add_preload (L, "rspamd_sqlite3", lua_load_sqlite3);
diff --git a/src/lua/lua_trie.c b/src/lua/lua_trie.c
index 82d11c50c..58a669832 100644
--- a/src/lua/lua_trie.c
+++ b/src/lua/lua_trie.c
@@ -441,17 +441,7 @@ lua_load_trie (lua_State *L)
 void
 luaopen_trie (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{trie}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{trie}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,			 trielib_m);
+	rspamd_lua_new_class (L, "rspamd{trie}", trielib_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_trie", lua_load_trie);
-
-	lua_pop (L, 1);                      /* remove metatable from stack */
 }
diff --git a/src/lua/lua_upstream.c b/src/lua/lua_upstream.c
index 3c4f3f4c3..7ba77839f 100644
--- a/src/lua/lua_upstream.c
+++ b/src/lua/lua_upstream.c
@@ -569,30 +569,10 @@ lua_load_upstream_list (lua_State * L)
 void
 luaopen_upstream (lua_State * L)
 {
-	luaL_newmetatable (L, "rspamd{upstream_list}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{upstream_list}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,			   upstream_list_m);
+	rspamd_lua_new_class (L, "rspamd{upstream_list}", upstream_list_m);
+	lua_pop (L, 1);
 	rspamd_lua_add_preload (L, "rspamd_upstream_list", lua_load_upstream_list);
 
-	lua_pop (L, 1);                      /* remove metatable from stack */
-
-	luaL_newmetatable (L, "rspamd{upstream}");
-	lua_pushstring (L, "__index");
-	lua_pushvalue (L, -2);
-	lua_settable (L, -3);
-
-	lua_pushstring (L, "class");
-	lua_pushstring (L, "rspamd{upstream}");
-	lua_rawset (L, -3);
-
-	luaL_register (L, NULL,		  upstream_m);
-
-	lua_pop (L, 1);                      /* remove metatable from stack */
+	rspamd_lua_new_class (L, "rspamd{upstream}", upstream_m);
+	lua_pop (L, 1);
 }


More information about the Commits mailing list