Skip to content

Commit 0ea6aae

Browse files
committed
⚡️ Convert msg-att case stmt to use strings
In my benchmarks, this leads to a measurable performance boost. To help avoid conflicts later, they were sorted like so: very common `UID` and `FLAGS`. Next, in both 3051 and 9051, sorted alphabetically. Then, in 3051 but not 9051. Then in 9051 but not 3501. Then all other extensions, sorted alphabetically (more or less)
1 parent 9ae5627 commit 0ea6aae

File tree

1 file changed

+21
-31
lines changed

1 file changed

+21
-31
lines changed

lib/net/imap/response_parser.rb

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -655,41 +655,31 @@ def response_data__simple_numeric
655655
# msg-att-static =/ "BINARY" section-binary ["<" number ">"] SP
656656
# (nstring / literal8)
657657
def msg_att(n)
658-
match(T_LPAR)
658+
lpar
659659
attr = {}
660660
while true
661-
token = lookahead
662-
case token.symbol
663-
when T_RPAR
664-
shift_token
665-
break
666-
when T_SPACE
667-
shift_token
668-
next
669-
end
670-
case token.value
671-
when /\A(?:ENVELOPE)\z/ni
672-
name, val = envelope_data
673-
when /\A(?:FLAGS)\z/ni
674-
name, val = flags_data
675-
when /\A(?:INTERNALDATE)\z/ni
676-
name, val = internaldate_data
677-
when /\A(?:RFC822(?:\.HEADER|\.TEXT)?)\z/ni
678-
name, val = rfc822_text
679-
when /\A(?:RFC822\.SIZE)\z/ni
680-
name, val = rfc822_size
681-
when /\A(?:BODY(?:STRUCTURE)?)\z/ni
682-
name, val = body_data
683-
when /\A(?:UID)\z/ni
684-
name, val = uid_data
685-
when /\A(?:MODSEQ)\z/ni
686-
name, val = modseq_data
687-
else
688-
parse_error("unknown attribute `%s' for {%d}", token.value, n)
689-
end
661+
name = lookahead!(T_ATOM).value.upcase
662+
name, val =
663+
case name
664+
when "UID" then uid_data
665+
when "FLAGS" then flags_data
666+
when "BODY" then body_data
667+
when "BODYSTRUCTURE" then body_data
668+
when "ENVELOPE" then envelope_data
669+
when "INTERNALDATE" then internaldate_data
670+
when "RFC822.SIZE" then rfc822_size
671+
when "RFC822" then rfc822_text
672+
when "RFC822.HEADER" then rfc822_text # not in rev2
673+
when "RFC822.TEXT" then rfc822_text # not in rev2
674+
when "MODSEQ" then modseq_data # CONDSTORE
675+
else parse_error("unknown attribute `%s' for {%d}", name, n)
676+
end
690677
attr[name] = val
678+
break unless SP?
679+
break if lookahead_rpar?
691680
end
692-
return attr
681+
rpar
682+
attr
693683
end
694684

695685
def envelope_data

0 commit comments

Comments
 (0)