@@ -66,6 +66,10 @@ def parse(str)
66
66
T_TEXT = :TEXT # any char except CRLF
67
67
T_EOF = :EOF # end of response string
68
68
69
+ # Use to avoid allocation when we know the result is empty
70
+ EMPTY_ARRAY = [ ] . freeze
71
+ private_constant :EMPTY_ARRAY
72
+
69
73
module ResponseConditions
70
74
OK = "OK"
71
75
NO = "NO"
@@ -618,7 +622,7 @@ def tagged_ext_simple
618
622
# "(" [tagged-ext-comp] ")"
619
623
def tagged_ext_val
620
624
if lpar?
621
- _ = peek_rpar? ? [ ] : tagged_ext_comp
625
+ _ = peek_rpar? ? EMPTY_ARRAY : tagged_ext_comp
622
626
rpar
623
627
_
624
628
else
@@ -1397,7 +1401,7 @@ def mailbox_data__list
1397
1401
# ; This is the list information pointed to by the ABNF
1398
1402
# ; item "mailbox-data", which is defined above
1399
1403
def mailbox_list
1400
- lpar ; attr = peek_rpar? ? [ ] : mbx_list_flags ; rpar
1404
+ lpar ; attr = peek_rpar? ? EMPTY_ARRAY : mbx_list_flags ; rpar
1401
1405
SP! ; delim = nquoted
1402
1406
SP! ; name = mailbox
1403
1407
# TODO: mbox-list-extended
@@ -1497,8 +1501,12 @@ def acl_data
1497
1501
# obsolete-search-response = "SEARCH" *(SP nz-number)
1498
1502
def mailbox_data__search
1499
1503
name = label_in ( "SEARCH" , "SORT" )
1500
- data = [ ]
1501
- while _ = SP? && nz_number? do data << _ end
1504
+ if ( _ = SP? && nz_number? )
1505
+ data = [ _ ]
1506
+ while _ = SP? && nz_number? do data << _ end
1507
+ else
1508
+ data = EMPTY_ARRAY
1509
+ end
1502
1510
if lpar?
1503
1511
label ( "MODSEQ" ) ; SP!
1504
1512
modseq = mod_sequence_value
@@ -1652,7 +1660,7 @@ def thread_members
1652
1660
else nested = thread_nested ; break
1653
1661
end
1654
1662
end
1655
- members . reverse . inject ( nested || [ ] ) { |subthreads , number |
1663
+ members . reverse . inject ( nested || EMPTY_ARRAY ) { |subthreads , number |
1656
1664
[ ThreadMember . new ( number , subthreads ) ]
1657
1665
} . first
1658
1666
end
@@ -1824,7 +1832,7 @@ def namespace_response
1824
1832
1825
1833
# namespace = nil / "(" 1*namespace-descr ")"
1826
1834
def namespace
1827
- NIL? and return [ ]
1835
+ NIL? and return EMPTY_ARRAY
1828
1836
lpar
1829
1837
list = [ namespace_descr ]
1830
1838
list << namespace_descr until rpar?
@@ -1954,13 +1962,13 @@ def resp_text_code
1954
1962
data =
1955
1963
case name
1956
1964
when "CAPABILITY" then resp_code__capability
1957
- when "PERMANENTFLAGS" then SP? ? flag_perm__list : [ ]
1965
+ when "PERMANENTFLAGS" then SP? ? flag_perm__list : EMPTY_ARRAY
1958
1966
when "UIDNEXT" then SP! ; nz_number
1959
1967
when "UIDVALIDITY" then SP! ; nz_number
1960
1968
when "UNSEEN" then SP! ; nz_number # rev1 only
1961
1969
when "APPENDUID" then SP! ; resp_code_apnd__data # rev2, UIDPLUS
1962
1970
when "COPYUID" then SP! ; resp_code_copy__data # rev2, UIDPLUS
1963
- when "BADCHARSET" then SP? ? charset__list : [ ]
1971
+ when "BADCHARSET" then SP? ? charset__list : EMPTY_ARRAY
1964
1972
when "ALERT" , "PARSE" , "READ-ONLY" , "READ-WRITE" , "TRYCREATE" ,
1965
1973
"UNAVAILABLE" , "AUTHENTICATIONFAILED" , "AUTHORIZATIONFAILED" ,
1966
1974
"EXPIRED" , "PRIVACYREQUIRED" , "CONTACTADMIN" , "NOPERM" , "INUSE" ,
@@ -2109,7 +2117,7 @@ def x_gm_label; accept(T_BSLASH) ? atom.capitalize.to_sym : astring end
2109
2117
2110
2118
# See https://developers.google.com/gmail/imap/imap-extensions
2111
2119
def x_gm_labels
2112
- lpar ; return [ ] if rpar?
2120
+ lpar ; return EMPTY_ARRAY if rpar?
2113
2121
labels = [ ]
2114
2122
labels << x_gm_label
2115
2123
labels << x_gm_label while SP?
0 commit comments