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

Unified Diff: utils/string_encoding/utf8_impl.dart

Issue 9323077: Optimize special cases in utf8 and utf16 where input can be copied to output. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Optimize special cases in utf8 and utf16 where input can be copied to output. Created 8 years, 10 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
Index: utils/string_encoding/utf8_impl.dart
diff --git a/utils/string_encoding/utf8_impl.dart b/utils/string_encoding/utf8_impl.dart
index 213bb72ea4a1c62c888db9724f866441368ab686..2d83a1c0db355514c609194d341b4fa9af2782d9 100644
--- a/utils/string_encoding/utf8_impl.dart
+++ b/utils/string_encoding/utf8_impl.dart
@@ -130,92 +130,103 @@ List<int> _utf8ToCodepoints(
Math.min(utf8EncodedBytes.length, offset + length) :
utf8EncodedBytes.length;
- void addReplacementCodepoint(void f(int v), int replacementCodepoint) {
- if(replacementCodepoint != null) {
- f(replacementCodepoint);
- } else {
- throw new IllegalArgumentException("Invalid encoding");
- }
- }
-
- void apply(void f(int v)) {
+ void decode(void f(int v)) {
int i = offset;
while (i < end) {
int value = utf8EncodedBytes[i++];
- if (value >= 0) {
- if (value <= _UTF8_ONE_BYTE_MAX) {
- f(value);
- } else if (value < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
- addReplacementCodepoint(f, replacementCodepoint);
- continue;
+ if (value < 0) {
+ f(null);
+ continue;
+ }
+
+ if (value <= _UTF8_ONE_BYTE_MAX) {
+ f(value);
+ } else if (value < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+ f(null);
+ continue;
+ } else {
+ int additionalBytes = 0;
+ if (value < _UTF8_FIRST_BYTE_OF_THREE_BASE) {
+ value -= _UTF8_FIRST_BYTE_OF_TWO_BASE;
+ additionalBytes = 1;
+ } else if (value < _UTF8_FIRST_BYTE_OF_FOUR_BASE) {
+ value -= _UTF8_FIRST_BYTE_OF_THREE_BASE;
+ additionalBytes = 2;
+ } else if (value < _UTF8_FIRST_BYTE_OF_FIVE_BASE) {
+ value -= _UTF8_FIRST_BYTE_OF_FOUR_BASE;
+ additionalBytes = 3;
+ } else if (value < _UTF8_FIRST_BYTE_OF_SIX_BASE) {
+ value -= _UTF8_FIRST_BYTE_OF_FIVE_BASE;
+ additionalBytes = 4;
+ } else if (value < _UTF8_FIRST_BYTE_BOUND_EXCL) {
+ value -= _UTF8_FIRST_BYTE_OF_SIX_BASE;
+ additionalBytes = 5;
} else {
- int additionalBytes = 0;
- if (value < _UTF8_FIRST_BYTE_OF_THREE_BASE) {
- value -= _UTF8_FIRST_BYTE_OF_TWO_BASE;
- additionalBytes = 1;
- } else if (value < _UTF8_FIRST_BYTE_OF_FOUR_BASE) {
- value -= _UTF8_FIRST_BYTE_OF_THREE_BASE;
- additionalBytes = 2;
- } else if (value < _UTF8_FIRST_BYTE_OF_FIVE_BASE) {
- value -= _UTF8_FIRST_BYTE_OF_FOUR_BASE;
- additionalBytes = 3;
- } else if (value < _UTF8_FIRST_BYTE_OF_SIX_BASE) {
- value -= _UTF8_FIRST_BYTE_OF_FIVE_BASE;
- additionalBytes = 4;
- } else if (value < _UTF8_FIRST_BYTE_BOUND_EXCL) {
- value -= _UTF8_FIRST_BYTE_OF_SIX_BASE;
- additionalBytes = 5;
+ f(null);
+ continue;
+ }
+ int j = 0;
+ while (j < additionalBytes && i < end) {
+ int nextValue = utf8EncodedBytes[i++];
+ if (nextValue > _UTF8_ONE_BYTE_MAX &&
+ nextValue < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+ value = (value << 6) | (nextValue & _UTF8_LO_SIX_BIT_MASK);
} else {
- addReplacementCodepoint(f, replacementCodepoint);
- continue;
- }
- int j = 0;
- while (j < additionalBytes && i < end) {
- int nextValue = utf8EncodedBytes[i++];
- if (nextValue > _UTF8_ONE_BYTE_MAX &&
- nextValue < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
- value = (value << 6) | (nextValue & _UTF8_LO_SIX_BIT_MASK);
- } else {
- // if sequence-starting code unit, reposition cursor to start here
- if (nextValue >= _UTF8_FIRST_BYTE_OF_TWO_BASE) {
- i--;
- }
- break;
+ // if sequence-starting code unit, reposition cursor to start here
+ if (nextValue >= _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+ i--;
}
- j++;
+ break;
}
- if (j == additionalBytes && (
- value < UNICODE_UTF16_RESERVED_LO ||
- value > UNICODE_UTF16_RESERVED_HI)) {
- if ((additionalBytes == 1 && value > _UTF8_ONE_BYTE_MAX) ||
- (additionalBytes == 2 && value > _UTF8_TWO_BYTE_MAX) ||
- (additionalBytes == 3 && value > _UTF8_THREE_BYTE_MAX &&
- value <= UNICODE_VALID_RANGE_MAX)) {
- f(value);
- } else {
- addReplacementCodepoint(f, replacementCodepoint);
- }
+ j++;
+ }
+ if (j == additionalBytes && (
+ value < UNICODE_UTF16_RESERVED_LO ||
+ value > UNICODE_UTF16_RESERVED_HI)) {
+ if ((additionalBytes == 1 && value > _UTF8_ONE_BYTE_MAX) ||
+ (additionalBytes == 2 && value > _UTF8_TWO_BYTE_MAX) ||
+ (additionalBytes == 3 && value > _UTF8_THREE_BYTE_MAX &&
+ value <= UNICODE_VALID_RANGE_MAX)) {
+ f(value);
} else {
- addReplacementCodepoint(f, replacementCodepoint);
- continue;
+ f(null);
}
+ } else {
+ f(null);
+ continue;
}
- } else {
- addReplacementCodepoint(f, replacementCodepoint);
- continue;
}
}
}
int codepointBufferLength = 0;
Søren Gjesse 2012/02/06 15:45:44 Please add a comment here regarding the function p
dcarlson 2012/02/06 22:11:29 Done.
- apply(void _(int value) {
+ bool hasReplacements = false;
+ decode(void _(int value) {
codepointBufferLength++;
+ if (value == null) {
+ hasReplacements = true;
+ }
});
+ int _length = end - offset;
List<int> codepointBuffer = new List<int>(codepointBufferLength);
- int i = 0;
- apply(void _(int value) {
- codepointBuffer[i++] = value;
- });
+ if (_length == codepointBufferLength && !hasReplacements) {
+ codepointBuffer.setRange(0, _length, utf8EncodedBytes, offset);
+ } else {
+ int i = 0;
+ decode(
+ void _(int value) {
+ if (value != null) {
+ codepointBuffer[i++] = value;
+ } else {
+ if (replacementCodepoint != null) {
+ codepointBuffer[i++] = replacementCodepoint;
+ } else {
+ throw new IllegalArgumentException("Invalid encoding");
+ }
+ }
+ }
+ );
+ }
return codepointBuffer;
}
« utils/string_encoding/unicode_core.dart ('K') | « utils/string_encoding/unicode_core.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698