# HG changeset patch # User Waqas Hussain # Date 1290731017 -18000 # Node ID 6f58a3063c1464b80763687c824cc8550d0ad69f # Parent bd491def3efb129511d3d30c55aea8789e4a30fa util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building. diff -r bd491def3efb -r 6f58a3063c14 core/xmlhandlers.lua --- a/core/xmlhandlers.lua Thu Nov 25 08:38:26 2010 +0500 +++ b/core/xmlhandlers.lua Fri Nov 26 05:23:37 2010 +0500 @@ -114,7 +114,8 @@ chardata = {}; end -- Complete stanza - if #stanza.last_add == 0 then + local last_add = stanza.last_add; + if not last_add or #last_add == 0 then if tagname ~= stream_error_tag then cb_handlestanza(session, stanza); else diff -r bd491def3efb -r 6f58a3063c14 util/stanza.lua --- a/util/stanza.lua Thu Nov 25 08:38:26 2010 +0500 +++ b/util/stanza.lua Fri Nov 26 05:23:37 2010 +0500 @@ -46,7 +46,7 @@ stanza_mt.__index = stanza_mt; function stanza(name, attr) - local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}}; + local stanza = { name = name, attr = attr or {}, tags = {} }; return setmetatable(stanza, stanza_mt); end @@ -60,26 +60,27 @@ function stanza_mt:tag(name, attrs) local s = stanza(name, attrs); - (self.last_add[#self.last_add] or self):add_direct_child(s); - t_insert(self.last_add, s); + local last_add = self.last_add; + if not last_add then last_add = {}; self.last_add = last_add; end + (last_add[#last_add] or self):add_direct_child(s); + t_insert(last_add, s); return self; end function stanza_mt:text(text) - (self.last_add[#self.last_add] or self):add_direct_child(text); + local last_add = self.last_add; + (last_add and last_add[#last_add] or self):add_direct_child(text); return self; end function stanza_mt:up() - t_remove(self.last_add); + local last_add = self.last_add; + if last_add then t_remove(last_add); end return self; end function stanza_mt:reset() - local last_add = self.last_add; - for i = 1,#last_add do - last_add[i] = nil; - end + self.last_add = nil; return self; end @@ -91,7 +92,8 @@ end function stanza_mt:add_child(child) - (self.last_add[#self.last_add] or self):add_direct_child(child); + local last_add = self.last_add; + (last_add and last_add[#last_add] or self):add_direct_child(child); return self; end @@ -311,9 +313,6 @@ end end stanza.tags = tags; - if not stanza.last_add then - stanza.last_add = {}; - end end end diff -r bd491def3efb -r 6f58a3063c14 util/xmppstream.lua --- a/util/xmppstream.lua Thu Nov 25 08:38:26 2010 +0500 +++ b/util/xmppstream.lua Fri Nov 26 05:23:37 2010 +0500 @@ -117,7 +117,8 @@ chardata = {}; end -- Complete stanza - if #stanza.last_add == 0 then + local last_add = stanza.last_add; + if not last_add or #last_add == 0 then if tagname ~= stream_error_tag then cb_handlestanza(session, stanza); else