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

Unified Diff: sdk/lib/io/websocket_impl.dart

Issue 218493012: Make non-copying version of BytesBuidler and make file-reads faster. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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/io/file_impl.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/websocket_impl.dart
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index ee56378d788a279caf39372d7084f05931c712b9..3e012108707d1659a5730d71390d0e43c205c5cc 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -69,7 +69,7 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
final bool _serverSide;
final List _maskingBytes = new List(4);
- final List<Uint8List> _payloads = new List<Uint8List>();
+ final BytesBuilder _payload = new BytesBuilder(copy: false);
_WebSocketProtocolTransformer([this._serverSide = false]);
@@ -90,27 +90,6 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
void close() => _eventSink.close();
- Uint8List _takePayload() {
- if (_payloads.length == 0) return new Uint8List(0);
- if (_payloads.length == 1) {
- Uint8List result = _payloads.single;
- _payloads.clear();
- return result;
- }
- int length = 0;
- for (Uint8List payload in _payloads) {
- length += payload.length;
- }
- Uint8List result = new Uint8List(length);
- int offset = 0;
- for (Uint8List payload in _payloads) {
- result.setRange(offset, offset + payload.length, payload);
- offset += payload.length;
- }
- _payloads.clear();
- return result;
- }
-
/**
* Process data received from the underlying communication channel.
*/
@@ -197,7 +176,7 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
_unmask(index, payloadLength, buffer);
}
// Control frame and data frame share _payloads.
- _payloads.add(
+ _payload.add(
new Uint8List.view(buffer.buffer, index, payloadLength));
index += payloadLength;
if (_isControlFrame()) {
@@ -307,10 +286,10 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
if (_fin) {
switch (_currentMessageType) {
case _WebSocketMessageType.TEXT:
- _eventSink.add(UTF8.decode(_takePayload()));
+ _eventSink.add(UTF8.decode(_payload.takeBytes()));
break;
case _WebSocketMessageType.BINARY:
- _eventSink.add(_takePayload());
+ _eventSink.add(_payload.takeBytes());
break;
}
_currentMessageType = _WebSocketMessageType.NONE;
@@ -322,7 +301,7 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
switch (_opcode) {
case _WebSocketOpcode.CLOSE:
closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
- var payload = _takePayload();
+ var payload = _payload.takeBytes();
if (payload.length > 0) {
if (payload.length == 1) {
throw new WebSocketException("Protocol error");
@@ -340,11 +319,11 @@ class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
break;
case _WebSocketOpcode.PING:
- _eventSink.add(new _WebSocketPing(_takePayload()));
+ _eventSink.add(new _WebSocketPing(_payload.takeBytes()));
break;
case _WebSocketOpcode.PONG:
- _eventSink.add(new _WebSocketPong(_takePayload()));
+ _eventSink.add(new _WebSocketPong(_payload.takeBytes()));
break;
}
_prepareForNextFrame();
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698