@@ -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"
@@ -614,7 +618,7 @@ def tagged_ext_simple
614
618
# "(" [tagged-ext-comp] ")"
615
619
def tagged_ext_val
616
620
if lpar?
617
- _ = peek_rpar? ? [ ] : tagged_ext_comp
621
+ _ = peek_rpar? ? EMPTY_ARRAY : tagged_ext_comp
618
622
rpar
619
623
_
620
624
else
@@ -1386,7 +1390,7 @@ def mailbox_data__list
1386
1390
# ; This is the list information pointed to by the ABNF
1387
1391
# ; item "mailbox-data", which is defined above
1388
1392
def mailbox_list
1389
- lpar ; attr = peek_rpar? ? [ ] : mbx_list_flags ; rpar
1393
+ lpar ; attr = peek_rpar? ? EMPTY_ARRAY : mbx_list_flags ; rpar
1390
1394
SP! ; delim = nquoted
1391
1395
SP! ; name = mailbox
1392
1396
# TODO: mbox-list-extended
@@ -1486,8 +1490,12 @@ def acl_data
1486
1490
# obsolete-search-response = "SEARCH" *(SP nz-number)
1487
1491
def mailbox_data__search
1488
1492
name = label_in ( "SEARCH" , "SORT" )
1489
- data = [ ]
1490
- while _ = SP? && nz_number? do data << _ end
1493
+ if ( _ = SP? && nz_number? )
1494
+ data = [ _ ]
1495
+ while _ = SP? && nz_number? do data << _ end
1496
+ else
1497
+ data = EMPTY_ARRAY
1498
+ end
1491
1499
if lpar?
1492
1500
label ( "MODSEQ" ) ; SP!
1493
1501
modseq = mod_sequence_value
@@ -1641,7 +1649,7 @@ def thread_members
1641
1649
else nested = thread_nested ; break
1642
1650
end
1643
1651
end
1644
- members . reverse . inject ( nested || [ ] ) { |subthreads , number |
1652
+ members . reverse . inject ( nested || EMPTY_ARRAY ) { |subthreads , number |
1645
1653
[ ThreadMember . new ( number , subthreads ) ]
1646
1654
} . first
1647
1655
end
@@ -1813,7 +1821,7 @@ def namespace_response
1813
1821
1814
1822
# namespace = nil / "(" 1*namespace-descr ")"
1815
1823
def namespace
1816
- NIL? and return [ ]
1824
+ NIL? and return EMPTY_ARRAY
1817
1825
lpar
1818
1826
list = [ namespace_descr ]
1819
1827
list << namespace_descr until rpar?
@@ -1940,13 +1948,13 @@ def resp_text_code
1940
1948
data =
1941
1949
case name
1942
1950
when "CAPABILITY" then resp_code__capability
1943
- when "PERMANENTFLAGS" then SP? ? flag_perm__list : [ ]
1951
+ when "PERMANENTFLAGS" then SP? ? flag_perm__list : EMPTY_ARRAY
1944
1952
when "UIDNEXT" then SP! ; nz_number
1945
1953
when "UIDVALIDITY" then SP! ; nz_number
1946
1954
when "UNSEEN" then SP! ; nz_number # rev1 only
1947
1955
when "APPENDUID" then SP! ; resp_code_apnd__data # rev2, UIDPLUS
1948
1956
when "COPYUID" then SP! ; resp_code_copy__data # rev2, UIDPLUS
1949
- when "BADCHARSET" then SP? ? charset__list : [ ]
1957
+ when "BADCHARSET" then SP? ? charset__list : EMPTY_ARRAY
1950
1958
when "ALERT" , "PARSE" , "READ-ONLY" , "READ-WRITE" , "TRYCREATE" ,
1951
1959
"UNAVAILABLE" , "AUTHENTICATIONFAILED" , "AUTHORIZATIONFAILED" ,
1952
1960
"EXPIRED" , "PRIVACYREQUIRED" , "CONTACTADMIN" , "NOPERM" , "INUSE" ,
@@ -2077,7 +2085,7 @@ def x_gm_label; accept(T_BSLASH) ? atom.capitalize.to_sym : astring end
2077
2085
2078
2086
# See https://developers.google.com/gmail/imap/imap-extensions
2079
2087
def x_gm_labels
2080
- lpar ; return [ ] if rpar?
2088
+ lpar ; return EMPTY_ARRAY if rpar?
2081
2089
labels = [ ]
2082
2090
labels << x_gm_label
2083
2091
labels << x_gm_label while SP?
0 commit comments