aboutsummaryrefslogtreecommitdiff
path: root/testes
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-04-11 11:29:16 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-04-11 11:29:16 -0300
commitb0810c51c3f075cc8a309bfb3c1714ac42b0f020 (patch)
tree8d9e58246f442f1fbec8bb14ffebb77bd40c3564 /testes
parenta93e0144479f1eb0ac19b8c31862f4cbc2fbe1c4 (diff)
downloadlua-b0810c51c3f075cc8a309bfb3c1714ac42b0f020.tar.gz
lua-b0810c51c3f075cc8a309bfb3c1714ac42b0f020.tar.bz2
lua-b0810c51c3f075cc8a309bfb3c1714ac42b0f020.zip
Small optimizations in 'string.gsub'
Avoid creating extra strings when possible: - avoid creating new resulting string when subject was not modified (instead, return the subject itself); - avoid creating strings representing the captured substrings when handling replacements like '%1' (instead, add the substring directly to the buffer).
Diffstat (limited to 'testes')
-rw-r--r--testes/gc.lua2
-rw-r--r--testes/pm.lua30
2 files changed, 31 insertions, 1 deletions
diff --git a/testes/gc.lua b/testes/gc.lua
index 91e78a48..6d24e0d8 100644
--- a/testes/gc.lua
+++ b/testes/gc.lua
@@ -113,7 +113,7 @@ do
113 contCreate = 0 113 contCreate = 0
114 while contCreate <= limit do 114 while contCreate <= limit do
115 a = contCreate .. "b"; 115 a = contCreate .. "b";
116 a = string.gsub(a, '(%d%d*)', string.upper) 116 a = string.gsub(a, '(%d%d*)', "%1 %1")
117 a = "a" 117 a = "a"
118 contCreate = contCreate+1 118 contCreate = contCreate+1
119 end 119 end
diff --git a/testes/pm.lua b/testes/pm.lua
index 8cc8772e..4d87fad2 100644
--- a/testes/pm.lua
+++ b/testes/pm.lua
@@ -387,5 +387,35 @@ assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0")
387assert(string.find("abc\0\0","\0.") == 4) 387assert(string.find("abc\0\0","\0.") == 4)
388assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4) 388assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4)
389 389
390
391do -- test reuse of original string in gsub
392 local s = string.rep("a", 100)
393 local r = string.gsub(s, "b", "c") -- no match
394 assert(string.format("%p", s) == string.format("%p", r))
395
396 r = string.gsub(s, ".", {x = "y"}) -- no substitutions
397 assert(string.format("%p", s) == string.format("%p", r))
398
399 local count = 0
400 r = string.gsub(s, ".", function (x)
401 assert(x == "a")
402 count = count + 1
403 return nil -- no substitution
404 end)
405 r = string.gsub(r, ".", {b = 'x'}) -- "a" is not a key; no subst.
406 assert(count == 100)
407 assert(string.format("%p", s) == string.format("%p", r))
408
409 count = 0
410 r = string.gsub(s, ".", function (x)
411 assert(x == "a")
412 count = count + 1
413 return x -- substitution...
414 end)
415 assert(count == 100)
416 -- no reuse in this case
417 assert(r == s and string.format("%p", s) ~= string.format("%p", r))
418end
419
390print('OK') 420print('OK')
391 421