@@ -62,6 +62,10 @@ def parse(str)
62
62
T_TEXT = :TEXT # any char except CRLF
63
63
T_EOF = :EOF # end of response string
64
64
65
+ # Use to avoid allocation when we know the result is empty
66
+ EMPTY_ARRAY = [ ] . freeze
67
+ private_constant :EMPTY_ARRAY
68
+
65
69
module ResponseConditions
66
70
OK = "OK"
67
71
NO = "NO"
@@ -596,7 +600,7 @@ def tagged_ext_simple
596
600
# "(" [tagged-ext-comp] ")"
597
601
def tagged_ext_val
598
602
if lpar?
599
- _ = peek_rpar? ? [ ] : tagged_ext_comp
603
+ _ = peek_rpar? ? EMPTY_ARRAY : tagged_ext_comp
600
604
rpar
601
605
_
602
606
else
@@ -1356,7 +1360,7 @@ def mailbox_data__list
1356
1360
# ; This is the list information pointed to by the ABNF
1357
1361
# ; item "mailbox-data", which is defined above
1358
1362
def mailbox_list
1359
- lpar ; attr = peek_rpar? ? [ ] : mbx_list_flags ; rpar
1363
+ lpar ; attr = peek_rpar? ? EMPTY_ARRAY : mbx_list_flags ; rpar
1360
1364
SP! ; delim = nquoted
1361
1365
SP! ; name = mailbox
1362
1366
# TODO: mbox-list-extended
@@ -1456,8 +1460,12 @@ def acl_data
1456
1460
# obsolete-search-response = "SEARCH" *(SP nz-number)
1457
1461
def mailbox_data__search
1458
1462
name = label_in ( "SEARCH" , "SORT" )
1459
- data = [ ]
1460
- while _ = SP? && nz_number? do data << _ end
1463
+ if ( _ = SP? && nz_number? )
1464
+ data = [ _ ]
1465
+ while _ = SP? && nz_number? do data << _ end
1466
+ else
1467
+ data = EMPTY_ARRAY
1468
+ end
1461
1469
if lpar?
1462
1470
label ( "MODSEQ" ) ; SP!
1463
1471
modseq = mod_sequence_value
@@ -1506,7 +1514,7 @@ def thread_members
1506
1514
else nested = thread_nested ; break
1507
1515
end
1508
1516
end
1509
- members . reverse . inject ( nested || [ ] ) { |subthreads , number |
1517
+ members . reverse . inject ( nested || EMPTY_ARRAY ) { |subthreads , number |
1510
1518
[ ThreadMember . new ( number , subthreads ) ]
1511
1519
} . first
1512
1520
end
@@ -1678,7 +1686,7 @@ def namespace_response
1678
1686
1679
1687
# namespace = nil / "(" 1*namespace-descr ")"
1680
1688
def namespace
1681
- NIL? and return [ ]
1689
+ NIL? and return EMPTY_ARRAY
1682
1690
lpar
1683
1691
list = [ namespace_descr ]
1684
1692
list << namespace_descr until rpar?
@@ -1805,13 +1813,13 @@ def resp_text_code
1805
1813
data =
1806
1814
case name
1807
1815
when "CAPABILITY" then resp_code__capability
1808
- when "PERMANENTFLAGS" then SP? ? flag_perm__list : [ ]
1816
+ when "PERMANENTFLAGS" then SP? ? flag_perm__list : EMPTY_ARRAY
1809
1817
when "UIDNEXT" then SP! ; nz_number
1810
1818
when "UIDVALIDITY" then SP! ; nz_number
1811
1819
when "UNSEEN" then SP! ; nz_number # rev1 only
1812
1820
when "APPENDUID" then SP! ; resp_code_apnd__data # rev2, UIDPLUS
1813
1821
when "COPYUID" then SP! ; resp_code_copy__data # rev2, UIDPLUS
1814
- when "BADCHARSET" then SP? ? charset__list : [ ]
1822
+ when "BADCHARSET" then SP? ? charset__list : EMPTY_ARRAY
1815
1823
when "ALERT" , "PARSE" , "READ-ONLY" , "READ-WRITE" , "TRYCREATE" ,
1816
1824
"UNAVAILABLE" , "AUTHENTICATIONFAILED" , "AUTHORIZATIONFAILED" ,
1817
1825
"EXPIRED" , "PRIVACYREQUIRED" , "CONTACTADMIN" , "NOPERM" , "INUSE" ,
@@ -1942,7 +1950,7 @@ def x_gm_label; accept(T_BSLASH) ? atom.capitalize.to_sym : astring end
1942
1950
1943
1951
# See https://developers.google.com/gmail/imap/imap-extensions
1944
1952
def x_gm_labels
1945
- lpar ; return [ ] if rpar?
1953
+ lpar ; return EMPTY_ARRAY if rpar?
1946
1954
labels = [ ]
1947
1955
labels << x_gm_label
1948
1956
labels << x_gm_label while SP?
0 commit comments