Skip to content

Commit

Permalink
small optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jun 21, 2013
1 parent 7a7723f commit 11f3521
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 67 deletions.
2 changes: 1 addition & 1 deletion Changes
@@ -1,5 +1,5 @@

4.17 2013-06-20
4.17 2013-06-22

4.16 2013-06-19
- Improved Perl 5.10.x and 5.12.x compatibility. (trinitum)
Expand Down
2 changes: 1 addition & 1 deletion lib/Mojo/Content.pm
Expand Up @@ -220,7 +220,7 @@ sub _parse_chunked {
# Start new chunk (ignore the chunk extension)
unless ($self->{chunk_len}) {
last
unless $self->{pre_buffer} =~ s/^(?:\x0d?\x0a)?([[:xdigit:]]+).*\x0a//;
unless $self->{pre_buffer} =~ s/^(?:\x0d?\x0a)?([0-9a-fA-F]+).*\x0a//;
next if $self->{chunk_len} = hex $1;

# Last chunk
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojo/DOM/CSS.pm
Expand Up @@ -3,7 +3,7 @@ use Mojo::Base -base;

has 'tree';

my $ESCAPE_RE = qr/\\[^[:xdigit:]]|\\[[:xdigit:]]{1,6}/;
my $ESCAPE_RE = qr/\\[^0-9a-fA-F]|\\[0-9a-fA-F]{1,6}/;
my $ATTR_RE = qr/
\[
((?:$ESCAPE_RE|[\w\-])+) # Key
Expand Down Expand Up @@ -367,7 +367,7 @@ sub _unescape {
$value =~ s/\\\n//g;

# Unescape Unicode characters
$value =~ s/\\([[:xdigit:]]{1,6})\s?/pack('U', hex $1)/ge;
$value =~ s/\\([0-9a-fA-F]{1,6})\s?/pack('U', hex $1)/ge;

# Remove backslash
$value =~ s/\\//g;
Expand Down
21 changes: 10 additions & 11 deletions lib/Mojo/JSON.pm
Expand Up @@ -20,15 +20,15 @@ my %ESCAPE = (
'\\' => '\\',
'/' => '/',
'b' => "\x07",
'f' => "\x0C",
'n' => "\x0A",
'r' => "\x0D",
'f' => "\x0c",
'n' => "\x0a",
'r' => "\x0d",
't' => "\x09",
'u2028' => "\x{2028}",
'u2029' => "\x{2029}"
);
my %REVERSE = map { $ESCAPE{$_} => "\\$_" } keys %ESCAPE;
for (0x00 .. 0x1F, 0x7F) { $REVERSE{pack 'C', $_} //= sprintf '\u%.4X', $_ }
for (0x00 .. 0x1f, 0x7f) { $REVERSE{pack 'C', $_} //= sprintf '\u%.4X', $_ }

# Unicode encoding detection
my $UTF_PATTERNS = {
Expand Down Expand Up @@ -166,13 +166,13 @@ sub _decode_string {
my $pos = pos;

# Extract string with escaped characters
m#\G(((?:[^\x00-\x1F\\"]|\\(?:["\\/bfnrt]|u[[:xdigit:]]{4})){0,32766})*)#gc;
m!\G((?:(?:[^\x00-\x1f\\"]|\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})){0,32766})*)!gc;
my $str = $1;

# Missing quote
unless (m/\G"/gc) {
_exception('Unexpected character or invalid escape while parsing string')
if m/\G[\x00-\x1F\\]/;
if m/\G[\x00-\x1f\\]/;
_exception('Unterminated string');
}

Expand All @@ -195,18 +195,17 @@ sub _decode_string {
my $ord = hex $3;

# Surrogate pair
if (($ord & 0xF800) == 0xD800) {
if (($ord & 0xf800) == 0xd800) {

# High surrogate
($ord & 0xFC00) == 0xD800
($ord & 0xfc00) == 0xd800
or pos($_) = $pos + pos($str), _exception('Missing high-surrogate');

# Low surrogate
$str =~ m/\G\\u([Dd][C-Fc-f]..)/gc
or pos($_) = $pos + pos($str), _exception('Missing low-surrogate');

# Pair
$ord = 0x10000 + ($ord - 0xD800) * 0x400 + (hex($1) - 0xDC00);
$ord = 0x10000 + ($ord - 0xd800) * 0x400 + (hex($1) - 0xdc00);
}

# Character
Expand Down Expand Up @@ -263,7 +262,7 @@ sub _encode_object {

sub _encode_string {
my $str = shift;
$str =~ s!([\x00-\x1F\x7F\x{2028}\x{2029}\\"/\b\f\n\r\t])!$REVERSE{$1}!gs;
$str =~ s!([\x00-\x1f\x7f\x{2028}\x{2029}\\"/\b\f\n\r\t])!$REVERSE{$1}!gs;
return "\"$str\"";
}

Expand Down
2 changes: 1 addition & 1 deletion lib/Mojo/Transaction/WebSocket.pm
Expand Up @@ -69,7 +69,7 @@ sub build_frame {
warn "-- Extended 64bit payload ($len)\n$payload\n" if DEBUG;
vec($prefix, 0, 8) = $masked ? (127 | 0b10000000) : 127;
$frame .= $prefix;
$frame .= MODERN ? pack('Q>', $len) : pack('NN', 0, $len & 0xFFFFFFFF);
$frame .= MODERN ? pack('Q>', $len) : pack('NN', 0, $len & 0xffffffff);
}

# Mask payload
Expand Down
5 changes: 2 additions & 3 deletions lib/Mojo/Util.pm
Expand Up @@ -114,8 +114,7 @@ sub hmac_sha1_sum { unpack 'H*', hmac_sha1(@_) }
sub html_unescape {
my $str = shift;
return $str if index($str, '&') == -1;
$str
=~ s/&(?:\#((?:\d{1,7}|x[[:xdigit:]]{1,6}));|(\w+;?))/_decode($1, $2)/ge;
$str =~ s/&(?:\#((?:\d{1,7}|x[0-9a-fA-F]{1,6}));|(\w+;?))/_decode($1, $2)/ge;
return $str;
}
Expand Down Expand Up @@ -308,7 +307,7 @@ sub url_escape {
sub url_unescape {
my $str = shift;
return $str if index($str, '%') == -1;
$str =~ s/%([[:xdigit:]]{2})/chr(hex($1))/ge;
$str =~ s/%([0-9a-fA-F]{2})/chr(hex($1))/ge;
return $str;
}

Expand Down
96 changes: 48 additions & 48 deletions t/mojo/util.t
Expand Up @@ -191,96 +191,96 @@ is punycode_decode('bcher-kva'), 'bücher', 'right punycode decoded result';
# RFC 3492
my @tests = (
'(A) Arabic (Egyptian):',
"\x{0644}\x{064A}\x{0647}\x{0645}\x{0627}\x{0628}\x{062A}\x{0643}"
. "\x{0644}\x{0645}\x{0648}\x{0634}\x{0639}\x{0631}\x{0628}\x{064A}"
. "\x{061F}",
"\x{0644}\x{064a}\x{0647}\x{0645}\x{0627}\x{0628}\x{062a}\x{0643}"
. "\x{0644}\x{0645}\x{0648}\x{0634}\x{0639}\x{0631}\x{0628}\x{064a}"
. "\x{061f}",
'egbpdaj6bu4bxfgehfvwxn',
'(B) Chinese (simplified):',
"\x{4ED6}\x{4EEC}\x{4E3A}\x{4EC0}\x{4E48}\x{4E0D}\x{8BF4}\x{4E2D}"
"\x{4ed6}\x{4eec}\x{4e3a}\x{4ec0}\x{4e48}\x{4e0d}\x{8bf4}\x{4e2d}"
. "\x{6587}",
'ihqwcrb4cv8a8dqg056pqjye',
'(C) Chinese (traditional):',
"\x{4ED6}\x{5011}\x{7232}\x{4EC0}\x{9EBD}\x{4E0D}\x{8AAA}\x{4E2D}"
"\x{4ed6}\x{5011}\x{7232}\x{4ec0}\x{9ebd}\x{4e0d}\x{8aaa}\x{4e2d}"
. "\x{6587}",
'ihqwctvzc91f659drss3x8bo0yb',
'(D) Czech: Pro<ccaron>prost<ecaron>nemluv<iacute><ccaron>esky',
"\x{0050}\x{0072}\x{006F}\x{010D}\x{0070}\x{0072}\x{006F}\x{0073}"
. "\x{0074}\x{011B}\x{006E}\x{0065}\x{006D}\x{006C}\x{0075}\x{0076}"
. "\x{00ED}\x{010D}\x{0065}\x{0073}\x{006B}\x{0079}",
"\x{0050}\x{0072}\x{006f}\x{010d}\x{0070}\x{0072}\x{006f}\x{0073}"
. "\x{0074}\x{011b}\x{006e}\x{0065}\x{006d}\x{006c}\x{0075}\x{0076}"
. "\x{00ed}\x{010d}\x{0065}\x{0073}\x{006b}\x{0079}",
'Proprostnemluvesky-uyb24dma41a',
'(E) Hebrew:',
"\x{05DC}\x{05DE}\x{05D4}\x{05D4}\x{05DD}\x{05E4}\x{05E9}\x{05D5}"
. "\x{05D8}\x{05DC}\x{05D0}\x{05DE}\x{05D3}\x{05D1}\x{05E8}\x{05D9}"
. "\x{05DD}\x{05E2}\x{05D1}\x{05E8}\x{05D9}\x{05EA}",
"\x{05dc}\x{05de}\x{05d4}\x{05d4}\x{05dd}\x{05e4}\x{05e9}\x{05d5}"
. "\x{05d8}\x{05dc}\x{05d0}\x{05de}\x{05d3}\x{05d1}\x{05e8}\x{05d9}"
. "\x{05dd}\x{05e2}\x{05d1}\x{05e8}\x{05d9}\x{05ea}",
'4dbcagdahymbxekheh6e0a7fei0b',
'(F) Hindi (Devanagari):',
"\x{092F}\x{0939}\x{0932}\x{094B}\x{0917}\x{0939}\x{093F}\x{0928}"
. "\x{094D}\x{0926}\x{0940}\x{0915}\x{094D}\x{092F}\x{094B}\x{0902}"
. "\x{0928}\x{0939}\x{0940}\x{0902}\x{092C}\x{094B}\x{0932}\x{0938}"
"\x{092f}\x{0939}\x{0932}\x{094b}\x{0917}\x{0939}\x{093f}\x{0928}"
. "\x{094d}\x{0926}\x{0940}\x{0915}\x{094d}\x{092f}\x{094b}\x{0902}"
. "\x{0928}\x{0939}\x{0940}\x{0902}\x{092c}\x{094b}\x{0932}\x{0938}"
. "\x{0915}\x{0924}\x{0947}\x{0939}\x{0948}\x{0902}",
'i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd',
'(G) Japanese (kanji and hiragana):',
"\x{306A}\x{305C}\x{307F}\x{3093}\x{306A}\x{65E5}\x{672C}\x{8A9E}"
. "\x{3092}\x{8A71}\x{3057}\x{3066}\x{304F}\x{308C}\x{306A}\x{3044}"
. "\x{306E}\x{304B}",
"\x{306a}\x{305c}\x{307f}\x{3093}\x{306a}\x{65e5}\x{672c}\x{8a9e}"
. "\x{3092}\x{8a71}\x{3057}\x{3066}\x{304f}\x{308c}\x{306a}\x{3044}"
. "\x{306e}\x{304b}",
'n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa',
'(H) Korean (Hangul syllables):',
"\x{C138}\x{ACC4}\x{C758}\x{BAA8}\x{B4E0}\x{C0AC}\x{B78C}\x{B4E4}"
. "\x{C774}\x{D55C}\x{AD6D}\x{C5B4}\x{B97C}\x{C774}\x{D574}\x{D55C}"
. "\x{B2E4}\x{BA74}\x{C5BC}\x{B9C8}\x{B098}\x{C88B}\x{C744}\x{AE4C}",
"\x{c138}\x{acc4}\x{c758}\x{baa8}\x{b4e0}\x{c0ac}\x{b78c}\x{b4e4}"
. "\x{c774}\x{d55c}\x{ad6d}\x{c5b4}\x{b97c}\x{c774}\x{d574}\x{d55c}"
. "\x{b2e4}\x{ba74}\x{c5bc}\x{b9c8}\x{b098}\x{c88b}\x{c744}\x{ae4c}",
'989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c',
'(I) Russian (Cyrillic):',
"\x{043F}\x{043E}\x{0447}\x{0435}\x{043C}\x{0443}\x{0436}\x{0435}"
. "\x{043E}\x{043D}\x{0438}\x{043D}\x{0435}\x{0433}\x{043E}\x{0432}"
. "\x{043E}\x{0440}\x{044F}\x{0442}\x{043F}\x{043E}\x{0440}\x{0443}"
. "\x{0441}\x{0441}\x{043A}\x{0438}",
"\x{043f}\x{043e}\x{0447}\x{0435}\x{043c}\x{0443}\x{0436}\x{0435}"
. "\x{043e}\x{043d}\x{0438}\x{043d}\x{0435}\x{0433}\x{043e}\x{0432}"
. "\x{043e}\x{0440}\x{044f}\x{0442}\x{043f}\x{043e}\x{0440}\x{0443}"
. "\x{0441}\x{0441}\x{043a}\x{0438}",
'b1abfaaepdrnnbgefbadotcwatmq2g4l',
'(J) Spanish: Porqu<eacute>nopuedensimplementehablarenEspa<ntilde>ol',
"\x{0050}\x{006F}\x{0072}\x{0071}\x{0075}\x{00E9}\x{006E}\x{006F}"
. "\x{0070}\x{0075}\x{0065}\x{0064}\x{0065}\x{006E}\x{0073}\x{0069}"
. "\x{006D}\x{0070}\x{006C}\x{0065}\x{006D}\x{0065}\x{006E}\x{0074}"
. "\x{0065}\x{0068}\x{0061}\x{0062}\x{006C}\x{0061}\x{0072}\x{0065}"
. "\x{006E}\x{0045}\x{0073}\x{0070}\x{0061}\x{00F1}\x{006F}\x{006C}",
"\x{0050}\x{006f}\x{0072}\x{0071}\x{0075}\x{00e9}\x{006e}\x{006f}"
. "\x{0070}\x{0075}\x{0065}\x{0064}\x{0065}\x{006e}\x{0073}\x{0069}"
. "\x{006d}\x{0070}\x{006c}\x{0065}\x{006d}\x{0065}\x{006e}\x{0074}"
. "\x{0065}\x{0068}\x{0061}\x{0062}\x{006c}\x{0061}\x{0072}\x{0065}"
. "\x{006e}\x{0045}\x{0073}\x{0070}\x{0061}\x{00f1}\x{006f}\x{006c}",
'PorqunopuedensimplementehablarenEspaol-fmd56a',
'(K) Vietnamese: T<adotbelow>isaoh<odotbelow>kh<ocirc>ngth'
. '<ecirchookabove>ch<ihookabove>n<oacute>iti<ecircacute>ngVi'
. '<ecircdotbelow>t',
"\x{0054}\x{1EA1}\x{0069}\x{0073}\x{0061}\x{006F}\x{0068}\x{1ECD}"
. "\x{006B}\x{0068}\x{00F4}\x{006E}\x{0067}\x{0074}\x{0068}\x{1EC3}"
. "\x{0063}\x{0068}\x{1EC9}\x{006E}\x{00F3}\x{0069}\x{0074}\x{0069}"
. "\x{1EBF}\x{006E}\x{0067}\x{0056}\x{0069}\x{1EC7}\x{0074}",
"\x{0054}\x{1ea1}\x{0069}\x{0073}\x{0061}\x{006f}\x{0068}\x{1ecd}"
. "\x{006b}\x{0068}\x{00f4}\x{006e}\x{0067}\x{0074}\x{0068}\x{1ec3}"
. "\x{0063}\x{0068}\x{1ec9}\x{006e}\x{00f3}\x{0069}\x{0074}\x{0069}"
. "\x{1ebf}\x{006e}\x{0067}\x{0056}\x{0069}\x{1ec7}\x{0074}",
'TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g',
'(L) 3<nen>B<gumi><kinpachi><sensei>',
"\x{0033}\x{5E74}\x{0042}\x{7D44}\x{91D1}\x{516B}\x{5148}\x{751F}",
"\x{0033}\x{5e74}\x{0042}\x{7d44}\x{91d1}\x{516b}\x{5148}\x{751f}",
'3B-ww4c5e180e575a65lsy2b',
'(M) <amuro><namie>-with-SUPER-MONKEYS',
"\x{5B89}\x{5BA4}\x{5948}\x{7F8E}\x{6075}\x{002D}\x{0077}\x{0069}"
. "\x{0074}\x{0068}\x{002D}\x{0053}\x{0055}\x{0050}\x{0045}\x{0052}"
. "\x{002D}\x{004D}\x{004F}\x{004E}\x{004B}\x{0045}\x{0059}\x{0053}",
"\x{5b89}\x{5ba4}\x{5948}\x{7f8e}\x{6075}\x{002d}\x{0077}\x{0069}"
. "\x{0074}\x{0068}\x{002d}\x{0053}\x{0055}\x{0050}\x{0045}\x{0052}"
. "\x{002d}\x{004d}\x{004f}\x{004e}\x{004b}\x{0045}\x{0059}\x{0053}",
'-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n',
'(N) Hello-Another-Way-<sorezore><no><basho>',
"\x{0048}\x{0065}\x{006C}\x{006C}\x{006F}\x{002D}\x{0041}\x{006E}"
. "\x{006F}\x{0074}\x{0068}\x{0065}\x{0072}\x{002D}\x{0057}\x{0061}"
. "\x{0079}\x{002D}\x{305D}\x{308C}\x{305E}\x{308C}\x{306E}\x{5834}"
"\x{0048}\x{0065}\x{006c}\x{006c}\x{006f}\x{002d}\x{0041}\x{006e}"
. "\x{006f}\x{0074}\x{0068}\x{0065}\x{0072}\x{002d}\x{0057}\x{0061}"
. "\x{0079}\x{002d}\x{305d}\x{308c}\x{305e}\x{308c}\x{306e}\x{5834}"
. "\x{6240}",
'Hello-Another-Way--fc4qua05auwb3674vfr0b',
'(O) <hitotsu><yane><no><shita>2',
"\x{3072}\x{3068}\x{3064}\x{5C4B}\x{6839}\x{306E}\x{4E0B}\x{0032}",
"\x{3072}\x{3068}\x{3064}\x{5c4b}\x{6839}\x{306e}\x{4e0b}\x{0032}",
'2-u9tlzr9756bt3uc0v',
'(P) Maji<de>Koi<suru>5<byou><mae>',
"\x{004D}\x{0061}\x{006A}\x{0069}\x{3067}\x{004B}\x{006F}\x{0069}"
. "\x{3059}\x{308B}\x{0035}\x{79D2}\x{524D}",
"\x{004d}\x{0061}\x{006a}\x{0069}\x{3067}\x{004b}\x{006f}\x{0069}"
. "\x{3059}\x{308b}\x{0035}\x{79d2}\x{524d}",
'MajiKoi5-783gue6qz075azm5e',
'(Q) <pafii>de<runba>',
"\x{30D1}\x{30D5}\x{30A3}\x{30FC}\x{0064}\x{0065}\x{30EB}\x{30F3}"
. "\x{30D0}",
"\x{30d1}\x{30d5}\x{30a3}\x{30fc}\x{0064}\x{0065}\x{30eb}\x{30f3}"
. "\x{30d0}",
'de-jg4avhby1noc0d',
'(R) <sono><supiido><de>',
"\x{305D}\x{306E}\x{30B9}\x{30D4}\x{30FC}\x{30C9}\x{3067}",
"\x{305d}\x{306e}\x{30b9}\x{30d4}\x{30fc}\x{30c9}\x{3067}",
'd9juau41awczczp',
'(S) -> $1.00 <-',
"\x{002D}\x{003E}\x{0020}\x{0024}\x{0031}\x{002E}\x{0030}\x{0030}"
. "\x{0020}\x{003C}\x{002D}",
"\x{002d}\x{003e}\x{0020}\x{0024}\x{0031}\x{002e}\x{0030}\x{0030}"
. "\x{0020}\x{003c}\x{002d}",
'-> $1.00 <--'
);

Expand Down

0 comments on commit 11f3521

Please sign in to comment.