@@ -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
@@ -1367,7 +1371,7 @@ def mailbox_data__list
1367
1371
# ; This is the list information pointed to by the ABNF
1368
1372
# ; item "mailbox-data", which is defined above
1369
1373
def mailbox_list
1370
- lpar ; attr = peek_rpar? ? [ ] : mbx_list_flags ; rpar
1374
+ lpar ; attr = peek_rpar? ? EMPTY_ARRAY : mbx_list_flags ; rpar
1371
1375
SP! ; delim = nquoted
1372
1376
SP! ; name = mailbox
1373
1377
# TODO: mbox-list-extended
@@ -1467,8 +1471,12 @@ def acl_data
1467
1471
# obsolete-search-response = "SEARCH" *(SP nz-number)
1468
1472
def mailbox_data__search
1469
1473
name = label_in ( "SEARCH" , "SORT" )
1470
- data = [ ]
1471
- while _ = SP? && nz_number? do data << _ end
1474
+ if ( _ = SP? && nz_number? )
1475
+ data = [ _ ]
1476
+ while _ = SP? && nz_number? do data << _ end
1477
+ else
1478
+ data = EMPTY_ARRAY
1479
+ end
1472
1480
if lpar?
1473
1481
label ( "MODSEQ" ) ; SP!
1474
1482
modseq = mod_sequence_value
@@ -1517,7 +1525,7 @@ def thread_members
1517
1525
else nested = thread_nested ; break
1518
1526
end
1519
1527
end
1520
- members . reverse . inject ( nested || [ ] ) { |subthreads , number |
1528
+ members . reverse . inject ( nested || EMPTY_ARRAY ) { |subthreads , number |
1521
1529
[ ThreadMember . new ( number , subthreads ) ]
1522
1530
} . first
1523
1531
end
@@ -1689,7 +1697,7 @@ def namespace_response
1689
1697
1690
1698
# namespace = nil / "(" 1*namespace-descr ")"
1691
1699
def namespace
1692
- NIL? and return [ ]
1700
+ NIL? and return EMPTY_ARRAY
1693
1701
lpar
1694
1702
list = [ namespace_descr ]
1695
1703
list << namespace_descr until rpar?
@@ -1816,13 +1824,13 @@ def resp_text_code
1816
1824
data =
1817
1825
case name
1818
1826
when "CAPABILITY" then resp_code__capability
1819
- when "PERMANENTFLAGS" then SP? ? flag_perm__list : [ ]
1827
+ when "PERMANENTFLAGS" then SP? ? flag_perm__list : EMPTY_ARRAY
1820
1828
when "UIDNEXT" then SP! ; nz_number
1821
1829
when "UIDVALIDITY" then SP! ; nz_number
1822
1830
when "UNSEEN" then SP! ; nz_number # rev1 only
1823
1831
when "APPENDUID" then SP! ; resp_code_apnd__data # rev2, UIDPLUS
1824
1832
when "COPYUID" then SP! ; resp_code_copy__data # rev2, UIDPLUS
1825
- when "BADCHARSET" then SP? ? charset__list : [ ]
1833
+ when "BADCHARSET" then SP? ? charset__list : EMPTY_ARRAY
1826
1834
when "ALERT" , "PARSE" , "READ-ONLY" , "READ-WRITE" , "TRYCREATE" ,
1827
1835
"UNAVAILABLE" , "AUTHENTICATIONFAILED" , "AUTHORIZATIONFAILED" ,
1828
1836
"EXPIRED" , "PRIVACYREQUIRED" , "CONTACTADMIN" , "NOPERM" , "INUSE" ,
@@ -1953,7 +1961,7 @@ def x_gm_label; accept(T_BSLASH) ? atom.capitalize.to_sym : astring end
1953
1961
1954
1962
# See https://developers.google.com/gmail/imap/imap-extensions
1955
1963
def x_gm_labels
1956
- lpar ; return [ ] if rpar?
1964
+ lpar ; return EMPTY_ARRAY if rpar?
1957
1965
labels = [ ]
1958
1966
labels << x_gm_label
1959
1967
labels << x_gm_label while SP?
0 commit comments