Chromium Code Reviews| Index: sdk/lib/io/http_parser.dart |
| diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart |
| index 2888138174a0c1b0fd665256d6202b2d1ea9987c..de123278b2aa76b29b0dd1a031a8ca2bf6502604 100644 |
| --- a/sdk/lib/io/http_parser.dart |
| +++ b/sdk/lib/io/http_parser.dart |
| @@ -547,7 +547,7 @@ class _HttpParser extends Stream<_HttpIncoming> { |
| _state = _State.HEADER_ENDING; |
| } else { |
| // Start of new header field. |
| - _headerField.add(_toLowerCase(byte)); |
| + _headerField.add(_toLowerCaseByte(byte)); |
| _state = _State.HEADER_FIELD; |
| } |
| break; |
| @@ -559,7 +559,7 @@ class _HttpParser extends Stream<_HttpIncoming> { |
| if (!_isTokenChar(byte)) { |
| throw new HttpException("Invalid header field name"); |
| } |
| - _headerField.add(_toLowerCase(byte)); |
| + _headerField.add(_toLowerCaseByte(byte)); |
| } |
| break; |
| @@ -615,7 +615,7 @@ class _HttpParser extends Stream<_HttpIncoming> { |
| _state = _State.HEADER_ENDING; |
| } else { |
| // Start of new header field. |
| - _headerField.add(_toLowerCase(byte)); |
| + _headerField.add(_toLowerCaseByte(byte)); |
| _state = _State.HEADER_FIELD; |
| } |
| } |
| @@ -933,18 +933,20 @@ class _HttpParser extends Stream<_HttpIncoming> { |
| return tokens; |
| } |
| - int _toLowerCase(int byte) { |
| - final int aCode = "A".codeUnitAt(0); |
| - final int zCode = "Z".codeUnitAt(0); |
| - final int delta = "a".codeUnitAt(0) - aCode; |
| - return (aCode <= byte && byte <= zCode) ? byte + delta : byte; |
| + static int _toLowerCaseByte(int x) { |
| + // Optimzed version: |
|
srdjan
2014/03/25 15:46:31
ditto
|
| + // - 0x41 is 'A' |
| + // - 0x7f is ASCII mask |
| + // - 26 is the number of alpha characters. |
| + // - 0x20 is the delta between lower and upper chars. |
| + return ((x - 0x41) & 0x7f) < 26 ? x | 0x20 : x; |
|
srdjan
2014/03/25 15:46:31
Use more parentheses, again: advantage of OR vs AD
|
| } |
| // expected should already be lowercase. |
| bool _caseInsensitiveCompare(List<int> expected, List<int> value) { |
| if (expected.length != value.length) return false; |
| for (int i = 0; i < expected.length; i++) { |
| - if (expected[i] != _toLowerCase(value[i])) return false; |
| + if (expected[i] != _toLowerCaseByte(value[i])) return false; |
| } |
| return true; |
| } |