diff options
author | Waqas Hussain <waqas20@gmail.com> | 2011-02-20 19:16:56 +0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2011-02-20 19:16:56 +0500 |
commit | d833e47d79b3fa231f1a7e9cfb23b7a2773717f9 (patch) | |
tree | 4bd54c7acb60c94c9ff611f053134f5faa0cb65e /util/stanza.lua | |
parent | 231d285f0ebb5fcc24490060760beb3fca0eb983 (diff) | |
download | prosody-d833e47d79b3fa231f1a7e9cfb23b7a2773717f9.tar.gz prosody-d833e47d79b3fa231f1a7e9cfb23b7a2773717f9.zip |
util.stanza: Rewrite clone() to be more optimized.
Diffstat (limited to 'util/stanza.lua')
-rw-r--r-- | util/stanza.lua | 27 |
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 |