aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2011-02-20 19:16:56 +0500
committerWaqas Hussain <waqas20@gmail.com>2011-02-20 19:16:56 +0500
commit58d70ee4d5a1eeeb67ea4b3573aadb56133d9ca2 (patch)
tree4bd54c7acb60c94c9ff611f053134f5faa0cb65e
parent457036a41d3a9f032baf19e045d2db2de132ad61 (diff)
downloadprosody-58d70ee4d5a1eeeb67ea4b3573aadb56133d9ca2.tar.gz
prosody-58d70ee4d5a1eeeb67ea4b3573aadb56133d9ca2.zip
util.stanza: Rewrite clone() to be more optimized.
-rw-r--r--util/stanza.lua27
1 files changed, 12 insertions, 15 deletions
diff --git a/util/stanza.lua b/util/stanza.lua
index 7d1f5693..bf944115 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -329,24 +329,21 @@ function deserialize(stanza)
return stanza;
end
-function clone(stanza)
- local lookup_table = {};
- local function _copy(object)
- if type(object) ~= "table" then
- return object;
- elseif lookup_table[object] then
- return lookup_table[object];
+local function _clone(stanza)
+ local attr, tags = {}, {};
+ for k,v in pairs(stanza.attr) do attr[k] = v; end
+ local new = { name = stanza.name, attr = attr, tags = tags };
+ for i=1,#stanza do
+ local child = stanza[i];
+ if child.name then
+ child = _clone(child);
+ t_insert(tags, child);
end
- local new_table = {};
- lookup_table[object] = new_table;
- for index, value in pairs(object) do
- new_table[_copy(index)] = _copy(value);
- end
- return setmetatable(new_table, getmetatable(object));
+ t_insert(new, child);
end
-
- return _copy(stanza)
+ return setmetatable(new, stanza_mt);
end
+clone = _clone;
function message(attr, body)
if not body then