summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoah Watkins <noahwatkins@gmail.com>2013-02-16 21:30:47 -0800
committerNoah Watkins <noahwatkins@gmail.com>2013-08-25 08:58:27 -0700
commitbecab46f57e7fcc10938ee422e115afbdf472f0f (patch)
tree5c9fe8f6e7867dd8e27cd588eed162692f5b0b66
parentdc261c21e22468bea3f31bbeae5b9b035ab294ac (diff)
downloadceph-becab46f57e7fcc10938ee422e115afbdf472f0f.tar.gz
lua: support bufferlist concatenation
Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
-rw-r--r--src/liblua/src/lua_bufferlist.cc14
-rw-r--r--src/test/cls_lua/test_cls_lua.cc6
-rw-r--r--src/test/cls_lua/test_script.lua43
3 files changed, 63 insertions, 0 deletions
diff --git a/src/liblua/src/lua_bufferlist.cc b/src/liblua/src/lua_bufferlist.cc
index a5e4e56dbd0..1ff29b8fad2 100644
--- a/src/liblua/src/lua_bufferlist.cc
+++ b/src/liblua/src/lua_bufferlist.cc
@@ -121,6 +121,19 @@ static int bl_le(lua_State *L)
}
/*
+ * Bufferlist concatentation
+ */
+static int bl_concat(lua_State *L)
+{
+ bufferlist *bl1 = clslua_checkbufferlist(L, 1);
+ bufferlist *bl2 = clslua_checkbufferlist(L, 2);
+ bufferlist *ret = clslua_pushbufferlist(L, NULL);
+ ret->append(bl1->c_str(), bl1->length());
+ ret->append(bl2->c_str(), bl2->length());
+ return 1;
+}
+
+/*
* Garbage collect bufferlist
*/
static int bl_gc(lua_State *L)
@@ -136,6 +149,7 @@ static int bl_gc(lua_State *L)
static const struct luaL_Reg bufferlist_methods[] = {
{"str", bl_str},
{"append", bl_append},
+ {"__concat", bl_concat},
{"__len", bl_len},
{"__lt", bl_lt},
{"__le", bl_le},
diff --git a/src/test/cls_lua/test_cls_lua.cc b/src/test/cls_lua/test_cls_lua.cc
index 004f56ccc61..f802cd85645 100644
--- a/src/test/cls_lua/test_cls_lua.cc
+++ b/src/test/cls_lua/test_cls_lua.cc
@@ -383,3 +383,9 @@ TEST_F(ClsLua, BufferlistCompare) {
ASSERT_EQ(0, clslua_exec(test_script, NULL, "bl_lt"));
ASSERT_EQ(0, clslua_exec(test_script, NULL, "bl_le"));
}
+
+TEST_F(ClsLua, BufferlistConcat) {
+ ASSERT_EQ(0, clslua_exec(test_script, NULL, "bl_concat_eq"));
+ ASSERT_EQ(0, clslua_exec(test_script, NULL, "bl_concat_ne"));
+ ASSERT_EQ(0, clslua_exec(test_script, NULL, "bl_concat_immut"));
+}
diff --git a/src/test/cls_lua/test_script.lua b/src/test/cls_lua/test_script.lua
index b406481673e..e3663acc46a 100644
--- a/src/test/cls_lua/test_script.lua
+++ b/src/test/cls_lua/test_script.lua
@@ -230,6 +230,49 @@ cls.register(bl_lt)
cls.register(bl_le)
--
+-- Bufferlist concat
+--
+function bl_concat_eq()
+ local a = bufferlist.new()
+ local b = bufferlist.new()
+ local ab = bufferlist.new()
+ a:append('A')
+ b:append('B')
+ ab:append('AB')
+ assert(a .. b == ab)
+end
+
+function bl_concat_ne()
+ local a = bufferlist.new()
+ local b = bufferlist.new()
+ local ab = bufferlist.new()
+ a:append('A')
+ b:append('B')
+ ab:append('AB')
+ assert(b .. a ~= ab)
+end
+
+function bl_concat_immut()
+ local a = bufferlist.new()
+ local b = bufferlist.new()
+ local ab = bufferlist.new()
+ a:append('A')
+ b:append('B')
+ ab:append('AB')
+ x = a .. b
+ assert(x == ab)
+ b:append('C')
+ assert(x == ab)
+ local bc = bufferlist.new()
+ bc:append('BC')
+ assert(b == bc)
+end
+
+cls.register(bl_concat_eq)
+cls.register(bl_concat_ne)
+cls.register(bl_concat_immut)
+
+--
-- RunError
--
function runerr_a()