From 9fab594101f3f80325ab63c3947f264cf267d017 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 26 Jun 2012 22:58:24 +0000 Subject: [PATCH] libs/core: improve luci.util.imatch() to not create temporary strings when iterating non-string values --- libs/core/luasrc/util.lua | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 7856d1162..bde803f71 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -36,7 +36,7 @@ local tparser = require "luci.template.parser" local getmetatable, setmetatable = getmetatable, setmetatable local rawget, rawset, unpack = rawget, rawset, unpack local tostring, type, assert = tostring, type, assert -local ipairs, pairs, loadstring = ipairs, pairs, loadstring +local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring local require, pcall, xpcall = require, pcall, xpcall local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit @@ -273,15 +273,27 @@ end -- @param val The value to scan (table, string or nil) -- @return Iterator which returns one token per call function imatch(v) - if v == nil then - v = "" - elseif type(v) == "table" then - v = table.concat(v, " ") - elseif type(v) ~= "string" then - v = tostring(v) + if type(v) == "table" then + local k = nil + return function() + k = next(v, k) + return v[k] + end + + elseif type(v) == "number" or type(v) == "boolean" then + local x = true + return function() + if x then + x = false + return tostring(v) + end + end + + elseif type(v) == "userdata" or type(v) == "string" then + return tostring(v):gmatch("%S+") end - return v:gmatch("%S+") + return function() end end --- Parse certain units from the given string and return the canonical integer -- 2.11.0