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

Unified Diff: runtime/lib/typed_data.dart

Issue 856053002: Let Uint16List.setRange detect a String.codeUnits object, and copy directly from the string. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 5 years, 11 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 | « runtime/lib/string_patch.dart ('k') | sdk/lib/_internal/compiler/js_lib/js_string.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/typed_data.dart
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 84905ef08c751aa4dba7f396f2d8e182614fb240..77226239c9e4d1699fc4935f4ab936d0c4e924bc 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -829,6 +829,24 @@ abstract class _TypedList extends _TypedListBase {
Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2";
void _setFloat64x2(int offsetInBytes, Float64x2 value)
native "TypedData_SetFloat64x2";
+
+ /**
+ * Stores the [CodeUnits] as UTF-16 units into this TypedData at
+ * positions [start]..[end] (uint16 indices).
+ */
+ void _setCodeUnits(CodeUnits units,
+ int byteStart, int length, int skipCount) {
+ assert(byteStart + length * Uint16List.BYTES_PER_ELEMENT <= lengthInBytes);
+ String string = CodeUnits.stringOf(units);
+ int sliceEnd = skipCount + length;
+ RangeError.checkValidRange(skipCount, sliceEnd,
+ string.length,
+ "skipCount", "skipCount + length");
+ for (int i = 0; i < length; i++) {
+ _setUint16(byteStart + i * Uint16List.BYTES_PER_ELEMENT,
+ string.codeUnitAt(skipCount + i));
+ }
+ }
}
@@ -979,6 +997,16 @@ class _Int16Array extends _TypedList with _IntListMixin implements Int16List {
_setIndexedInt16(index, _toInt16(value));
}
+ void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+ if (ClassID.getID(iterable) == CodeUnits.cid) {
+ end = RangeError.checkValidRange(start, end, this.length);
+ int length = end - start;
+ int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
+ _setCodeUnits(iterable, byteStart, length, skipCount);
+ } else {
+ super.setRange(start, end, iterable, skipCount);
+ }
+ }
// Method(s) implementing TypedData interface.
@@ -1029,6 +1057,16 @@ class _Uint16Array extends _TypedList with _IntListMixin implements Uint16List {
_setIndexedUint16(index, _toUint16(value));
}
+ void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+ if (ClassID.getID(iterable) == CodeUnits.cid) {
+ end = RangeError.checkValidRange(start, end, this.length);
+ int length = end - start;
+ int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
+ _setCodeUnits(iterable, byteStart, length, skipCount);
+ } else {
+ super.setRange(start, end, iterable, skipCount);
+ }
+ }
// Method(s) implementing the TypedData interface.
@@ -2453,7 +2491,7 @@ class _TypedListView extends _TypedListBase implements TypedData {
return _typedData.buffer;
}
- final TypedData _typedData;
+ final _TypedList _typedData;
final int offsetInBytes;
final int length;
}
@@ -2633,6 +2671,16 @@ class _Int16ArrayView extends _TypedListView with _IntListMixin implements Int16
_toInt16(value));
}
+ void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+ if (ClassID.getID(iterable) == CodeUnits.cid) {
+ end = RangeError.checkValidRange(start, end, this.length);
+ int length = end - start;
+ int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
+ _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
+ } else {
+ super.setRange(start, end, iterable, skipCount);
+ }
+ }
// Method(s) implementing TypedData interface.
@@ -2681,6 +2729,16 @@ class _Uint16ArrayView extends _TypedListView with _IntListMixin implements Uint
_toUint16(value));
}
+ void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+ if (ClassID.getID(iterable) == CodeUnits.cid) {
+ end = RangeError.checkValidRange(start, end, this.length);
+ int length = end - start;
+ int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
+ _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
+ } else {
+ super.setRange(start, end, iterable, skipCount);
+ }
+ }
// Method(s) implementing TypedData interface.
@@ -2688,7 +2746,6 @@ class _Uint16ArrayView extends _TypedListView with _IntListMixin implements Uint
return Uint16List.BYTES_PER_ELEMENT;
}
-
// Internal utility methods.
Uint16List _createList(int length) {
« no previous file with comments | « runtime/lib/string_patch.dart ('k') | sdk/lib/_internal/compiler/js_lib/js_string.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698