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

Side by Side Diff: runtime/lib/string_buffer_patch.dart

Issue 12421002: Change VM's string-buffer patch to use a Uin16Array as backing buffer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments, PTAL. Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class StringBuffer { 5 patch class StringBuffer {
6 List<String> _buffer; 6 /** Backing store for collected UTF-16 code units. */
7 int _length; 7 Uint16List _buffer;
8 /** Number of code units collected. */
9 int _length = 0;
10 /**
11 * Collects the approximate maximal magnitude of the added code units.
12 *
13 * The value of each added code unit is or'ed with this variable, so the
14 * most significant bit set in any code unit is also set in this value.
15 * If below 256, the string is a Latin-1 string.
16 */
17 int _code_magnitude = 0;
srdjan 2013/03/07 17:58:34 s/_code_magnitude/_codeMagnitude/
Lasse Reichstein Nielsen 2013/03/08 07:18:44 On 2013/03/07 17:58:34, srdjan wrote: > s/_code_ma
Lasse Reichstein Nielsen 2013/03/08 07:18:44 _codeUnitMagnitude even.
8 18
9 /// Creates the string buffer with an initial content. 19 /// Creates the string buffer with an initial content.
10 /* patch */ StringBuffer([Object content = ""]) { 20 /* patch */ StringBuffer([Object content = ""])
11 _buffer = new List<String>(); 21 : _buffer = new Uint16List(16) {
12 _length = 0;
13 write(content); 22 write(content);
14 } 23 }
15 24
16 /* patch */ int get length => _length; 25 /* patch */ int get length => _length;
17 26
18 /// Adds [obj] to the buffer. 27 /// Adds [obj] to the buffer.
19 /* patch */ void write(Object obj) { 28 /* patch */ void write(Object obj) {
20 // TODO(srdjan): The following four lines could be replaced by
21 // '$obj', but apparently this is too slow on the Dart VM.
22 String str; 29 String str;
23 if (obj is String) { 30 if (obj is String) {
24 str = obj; 31 str = obj;
25 } else { 32 } else {
33 // TODO(srdjan): The following four lines could be replaced by
34 // '$obj', but apparently this is too slow on the Dart VM.
26 str = obj.toString(); 35 str = obj.toString();
27 if (str is! String) { 36 if (str is! String) {
28 throw new ArgumentError('toString() did not return a string'); 37 throw new ArgumentError('toString() did not return a string');
29 } 38 }
30 } 39 }
31 if (str.isEmpty) return; 40 if (str.isEmpty) return;
32 _buffer.add(str); 41 _ensureCapacity(str.length);
42 for (int i = 0; i < str.length; i++) {
43 int unit = str.codeUnitAt(i);
44 _buffer[_length + i] = unit;
45 _code_magnitude |= unit;
46 }
33 _length += str.length; 47 _length += str.length;
34 } 48 }
35 49
36 /// Clears the string buffer. 50 /* patch */ writeCharCode(int charCode) {
37 /* patch */ void clear() { 51 if (charCode <= 0xFFFF) {
38 _buffer = new List<String>(); 52 if (charCode < 0) {
39 _length = 0; 53 throw new RangeError.range(charCode, 0, 0x10FFFF);
54 }
55 _ensureCapacity(1);
56 _buffer[_length++] = charCode;
57 _code_magnitude |= charCode;
58 } else {
59 if (charCode > 0x10FFFF) {
60 throw new RangeError.range(charCode, 0, 0x10FFFF);
61 }
62 _ensureCapacity(2);
63 int bits = charCode - 0x10000;
64 _buffer[_length++] = 0xD800 | (bits >> 10);
65 _buffer[_length++] = 0xDC00 | (bits & 0x3FF);
66 _code_magnitude |= 0xFFFF;
67 }
40 } 68 }
41 69
42 /// Returns the contents of buffer as a concatenated string. 70 /** Makes the buffer empty. */
71 /* patch */ void clear() {
72 _length = 0;
73 _code_magnitude = 0;
74 }
75
76 /** Returns the contents of buffer as a string. */
43 /* patch */ String toString() { 77 /* patch */ String toString() {
44 if (_buffer.length == 0) return ""; 78 if (_length == 0) return "";
45 if (_buffer.length == 1) return _buffer[0]; 79 return _create(_buffer, _length, _code_magnitude <= 0xFF);
Vyacheslav Egorov (Google) 2013/03/07 13:50:52 consider: final isLatin1 = _code_magnitude <= 0x
Lasse Reichstein Nielsen 2013/03/08 07:18:44 Done.
46 String result = _StringBase.concatAll(_buffer);
47 _buffer.clear();
48 _buffer.add(result);
49 // Since we track the length at each add operation, there is no
50 // need to update it in this function.
51 return result;
52 } 80 }
81
82 /** Ensures that the buffer has enough capacity to contain n code units. */
srdjan 2013/03/07 17:58:34 s/contain/add/
Lasse Reichstein Nielsen 2013/03/08 07:18:44 Done.
83 void _ensureCapacity(int n) {
84 int requiredCapacity = _length + n;
85 if (requiredCapacity <= _buffer.length) return;
Vyacheslav Egorov (Google) 2013/03/07 13:50:52 consider { return; } and more vertical white s
srdjan 2013/03/07 17:58:34 I would split the rare case out: if (requiredCapac
Lasse Reichstein Nielsen 2013/03/08 07:18:44 Done.
86 int newCapacity = _buffer.length;
87 do {
88 newCapacity *= 2;
srdjan 2013/03/07 17:58:34 Optional: This growth may be too aggressive. Opini
Lasse Reichstein Nielsen 2013/03/08 07:18:44 I was wondering if it was too small, and consideri
89 } while (newCapacity < requiredCapacity);
90 List<int> newBuffer = new Uint16List(newCapacity);
91 newBuffer.setRange(0, _length, _buffer);
92 _buffer = newBuffer;
93 }
94
95 /**
96 * Create a [String] from the UFT-16 code units in buffer.
97 */
98 static String _create(List<int> buffer, int length, bool isLatin1)
srdjan 2013/03/07 17:58:34 s/List<int>/Uint16List/
Lasse Reichstein Nielsen 2013/03/08 07:18:44 Done.
99 native "StringBuffer_createStringFromUint16Array";
53 } 100 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698