Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(729)

Unified Diff: sdk/lib/convert/utf.dart

Issue 208693008: Speed up ASCII, LATIN1, UTF8 converters, for single-byte codeunits. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Review fixes. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/convert/latin1.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/convert/utf.dart
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 819013913540a3e403d1cfee98bb9c78ec03419c..5b281934ff93aad9b8d19af940fafc7421f9ea77 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -420,10 +420,24 @@ class _Utf8Decoder {
int value = _value;
int expectedUnits = _expectedUnits;
int extraUnits = _extraUnits;
+ int singleBytesCount = 0;
_value = 0;
_expectedUnits = 0;
_extraUnits = 0;
+ void addSingleBytes(int from, int to) {
+ assert(singleBytesCount > 0);
+ assert(from >= startIndex && from <= endIndex);
+ assert(to >= startIndex && to <= endIndex);
+ if (from == 0 && to == codeUnits.length) {
+ _stringSink.write(new String.fromCharCodes(codeUnits));
+ } else {
+ _stringSink.write(
+ new String.fromCharCodes(codeUnits.sublist(from, to)));
+ }
+ singleBytesCount = 0;
+ }
+
int i = startIndex;
loop: while (true) {
multibyte: if (expectedUnits > 0) {
@@ -479,6 +493,10 @@ class _Utf8Decoder {
// https://codereview.chromium.org/22929022/diff/1/sdk/lib/convert/utf.dart?column_width=80
if (unit < 0) {
// TODO(floitsch): should this be unit <= 0 ?
+ if (singleBytesCount > 0) {
+ int to = i - 1;
+ addSingleBytes(to - singleBytesCount, to);
+ }
if (!_allowMalformed) {
throw new FormatException(
"Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}");
@@ -486,8 +504,12 @@ class _Utf8Decoder {
_stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
} else if (unit <= _ONE_BYTE_LIMIT) {
_isFirstCharacter = false;
- _stringSink.writeCharCode(unit);
+ singleBytesCount++;
} else {
+ if (singleBytesCount > 0) {
+ int to = i - 1;
+ addSingleBytes(to - singleBytesCount, to);
+ }
if ((unit & 0xE0) == 0xC0) {
value = unit & 0x1F;
expectedUnits = extraUnits = 1;
@@ -516,6 +538,9 @@ class _Utf8Decoder {
}
break loop;
}
+ if (singleBytesCount > 0) {
+ addSingleBytes(i - singleBytesCount, endIndex);
+ }
if (expectedUnits > 0) {
_value = value;
_expectedUnits = expectedUnits;
« no previous file with comments | « sdk/lib/convert/latin1.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698