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

Side by Side Diff: lib/src/protobuf/coded_buffer_reader.dart

Issue 2094533003: Fix coded buffer reader so all tests pass using dart2js. (Closed) Base URL: git@github.com:dart-lang/dart-protobuf.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « CHANGELOG.md ('k') | test/codec_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 part of protobuf; 5 part of protobuf;
6 6
7 class CodedBufferReader { 7 class CodedBufferReader {
8 static const int DEFAULT_RECURSION_LIMIT = 64; 8 static const int DEFAULT_RECURSION_LIMIT = 64;
9 static const int DEFAULT_SIZE_LIMIT = 64 << 20; 9 static const int DEFAULT_SIZE_LIMIT = 64 << 20;
10 10
11 final Uint8List _buffer; 11 final Uint8List _buffer;
12 int _bufferPos = 0; 12 int _bufferPos = 0;
13 int _currentLimit = -1; 13 int _currentLimit = -1;
14 int _lastTag = 0; 14 int _lastTag = 0;
15 int _recursionDepth = 0; 15 int _recursionDepth = 0;
16 final int _recursionLimit; 16 final int _recursionLimit;
17 final int _sizeLimit; 17 final int _sizeLimit;
18 18
19 CodedBufferReader( 19 CodedBufferReader(List<int> buffer,
20 List<int> buffer,
21 {int recursionLimit: DEFAULT_RECURSION_LIMIT, 20 {int recursionLimit: DEFAULT_RECURSION_LIMIT,
22 int sizeLimit: DEFAULT_SIZE_LIMIT}) : 21 int sizeLimit: DEFAULT_SIZE_LIMIT})
23 _buffer = 22 : _buffer = buffer is Uint8List ? buffer : new Uint8List(buffer.length)
24 buffer is Uint8List 23 ..setRange(0, buffer.length, buffer),
25 ? buffer 24 _recursionLimit = recursionLimit,
26 : new Uint8List(buffer.length)..setRange(0, buffer.length, buffer), 25 _sizeLimit = math.min(sizeLimit, buffer.length) {
27 _recursionLimit = recursionLimit,
28 _sizeLimit = math.min(sizeLimit, buffer.length) {
29 _currentLimit = _sizeLimit; 26 _currentLimit = _sizeLimit;
30 } 27 }
31 28
32 void checkLastTagWas(int value) { 29 void checkLastTagWas(int value) {
33 if (_lastTag != value) { 30 if (_lastTag != value) {
34 throw new InvalidProtocolBufferException.invalidEndTag(); 31 throw new InvalidProtocolBufferException.invalidEndTag();
35 } 32 }
36 } 33 }
37 34
38 bool isAtEnd() => _bufferPos >= _currentLimit; 35 bool isAtEnd() => _bufferPos >= _currentLimit;
(...skipping 16 matching lines...) Expand all
55 52
56 void _checkLimit(int increment) { 53 void _checkLimit(int increment) {
57 assert(_currentLimit != -1); 54 assert(_currentLimit != -1);
58 _bufferPos += increment; 55 _bufferPos += increment;
59 if (_bufferPos > _currentLimit) { 56 if (_bufferPos > _currentLimit) {
60 throw new InvalidProtocolBufferException.truncatedMessage(); 57 throw new InvalidProtocolBufferException.truncatedMessage();
61 } 58 }
62 } 59 }
63 60
64 void readGroup(int fieldNumber, GeneratedMessage message, 61 void readGroup(int fieldNumber, GeneratedMessage message,
65 ExtensionRegistry extensionRegistry) { 62 ExtensionRegistry extensionRegistry) {
66 if (_recursionDepth >= _recursionLimit) { 63 if (_recursionDepth >= _recursionLimit) {
67 throw new InvalidProtocolBufferException.recursionLimitExceeded(); 64 throw new InvalidProtocolBufferException.recursionLimitExceeded();
68 } 65 }
69 ++_recursionDepth; 66 ++_recursionDepth;
70 message.mergeFromCodedBufferReader(this, extensionRegistry); 67 message.mergeFromCodedBufferReader(this, extensionRegistry);
71 checkLastTagWas(makeTag(fieldNumber, WIRETYPE_END_GROUP)); 68 checkLastTagWas(makeTag(fieldNumber, WIRETYPE_END_GROUP));
72 --_recursionDepth; 69 --_recursionDepth;
73 } 70 }
74 71
75 UnknownFieldSet readUnknownFieldSetGroup(int fieldNumber) { 72 UnknownFieldSet readUnknownFieldSetGroup(int fieldNumber) {
76 if (_recursionDepth >= _recursionLimit) { 73 if (_recursionDepth >= _recursionLimit) {
77 throw new InvalidProtocolBufferException.recursionLimitExceeded(); 74 throw new InvalidProtocolBufferException.recursionLimitExceeded();
78 } 75 }
79 ++_recursionDepth; 76 ++_recursionDepth;
80 UnknownFieldSet unknownFieldSet = new UnknownFieldSet(); 77 UnknownFieldSet unknownFieldSet = new UnknownFieldSet();
81 unknownFieldSet.mergeFromCodedBufferReader(this); 78 unknownFieldSet.mergeFromCodedBufferReader(this);
82 checkLastTagWas(makeTag(fieldNumber, WIRETYPE_END_GROUP)); 79 checkLastTagWas(makeTag(fieldNumber, WIRETYPE_END_GROUP));
83 --_recursionDepth; 80 --_recursionDepth;
84 return unknownFieldSet; 81 return unknownFieldSet;
85 } 82 }
86 83
87 void readMessage(GeneratedMessage message, 84 void readMessage(
88 ExtensionRegistry extensionRegistry) { 85 GeneratedMessage message, ExtensionRegistry extensionRegistry) {
89 int length = readInt32(); 86 int length = readInt32();
90 if (_recursionDepth >= _recursionLimit) { 87 if (_recursionDepth >= _recursionLimit) {
91 throw new InvalidProtocolBufferException.recursionLimitExceeded(); 88 throw new InvalidProtocolBufferException.recursionLimitExceeded();
92 } 89 }
93 if (length < 0) { 90 if (length < 0) {
94 throw new ArgumentError( 91 throw new ArgumentError(
95 'CodedBufferReader encountered an embedded string or message' 92 'CodedBufferReader encountered an embedded string or message'
96 ' which claimed to have negative size.'); 93 ' which claimed to have negative size.');
97 } 94 }
98 95
(...skipping 17 matching lines...) Expand all
116 int readSint32() => _decodeZigZag32(readUint32()); 113 int readSint32() => _decodeZigZag32(readUint32());
117 Int64 readSint64() => _decodeZigZag64(readUint64()); 114 Int64 readSint64() => _decodeZigZag64(readUint64());
118 int readFixed32() => _readByteData(4).getUint32(0, Endianness.LITTLE_ENDIAN); 115 int readFixed32() => _readByteData(4).getUint32(0, Endianness.LITTLE_ENDIAN);
119 Int64 readFixed64() => readSfixed64(); 116 Int64 readFixed64() => readSfixed64();
120 int readSfixed32() => _readByteData(4).getInt32(0, Endianness.LITTLE_ENDIAN); 117 int readSfixed32() => _readByteData(4).getInt32(0, Endianness.LITTLE_ENDIAN);
121 Int64 readSfixed64() { 118 Int64 readSfixed64() {
122 var data = _readByteData(8); 119 var data = _readByteData(8);
123 var view = new Uint8List.view(data.buffer, data.offsetInBytes, 8); 120 var view = new Uint8List.view(data.buffer, data.offsetInBytes, 8);
124 return new Int64.fromBytes(view); 121 return new Int64.fromBytes(view);
125 } 122 }
123
126 bool readBool() => _readRawVarint32() != 0; 124 bool readBool() => _readRawVarint32() != 0;
127 List<int> readBytes() { 125 List<int> readBytes() {
128 int length = readInt32(); 126 int length = readInt32();
129 _checkLimit(length); 127 _checkLimit(length);
130 return new Uint8List.view(_buffer.buffer, 128 return new Uint8List.view(
131 _buffer.offsetInBytes + _bufferPos - length, length); 129 _buffer.buffer, _buffer.offsetInBytes + _bufferPos - length, length);
132 } 130 }
131
133 String readString() => _UTF8.decode(readBytes()); 132 String readString() => _UTF8.decode(readBytes());
134 double readFloat() => 133 double readFloat() =>
135 _readByteData(4).getFloat32(0, Endianness.LITTLE_ENDIAN); 134 _readByteData(4).getFloat32(0, Endianness.LITTLE_ENDIAN);
136 double readDouble() => 135 double readDouble() =>
137 _readByteData(8).getFloat64(0, Endianness.LITTLE_ENDIAN); 136 _readByteData(8).getFloat64(0, Endianness.LITTLE_ENDIAN);
138 137
139 int readTag() { 138 int readTag() {
140 if (isAtEnd()) { 139 if (isAtEnd()) {
141 _lastTag = 0; 140 _lastTag = 0;
142 return 0; 141 return 0;
143 } 142 }
144 143
145 _lastTag = readInt32(); 144 _lastTag = readInt32();
146 if (getTagFieldNumber(_lastTag) == 0) { 145 if (getTagFieldNumber(_lastTag) == 0) {
147 throw new InvalidProtocolBufferException.invalidTag(); 146 throw new InvalidProtocolBufferException.invalidTag();
148 } 147 }
149 return _lastTag; 148 return _lastTag;
150 } 149 }
151 150
152 static int _decodeZigZag32(int value) { 151 static int _decodeZigZag32(int value) {
153 if ((value & 0x1) == 1) value = -value; 152 if ((value & 0x1) == 1) {
154 return value >> 1; 153 return -(value >> 1) - 1;
154 } else {
155 return value >> 1;
156 }
155 } 157 }
156 158
157 static Int64 _decodeZigZag64(Int64 value) { 159 static Int64 _decodeZigZag64(Int64 value) {
158 if ((value & 0x1) == 1) value = -value; 160 if ((value & 0x1) == 1) value = -value;
159 return value >> 1; 161 return value >> 1;
160 } 162 }
161 163
162 int _readRawVarintByte() { 164 int _readRawVarintByte() {
163 _checkLimit(1); 165 _checkLimit(1);
164 return _buffer[_bufferPos - 1]; 166 return _buffer[_bufferPos - 1];
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 } 210 }
209 throw new InvalidProtocolBufferException.malformedVarint(); 211 throw new InvalidProtocolBufferException.malformedVarint();
210 } 212 }
211 213
212 ByteData _readByteData(int sizeInBytes) { 214 ByteData _readByteData(int sizeInBytes) {
213 _checkLimit(sizeInBytes); 215 _checkLimit(sizeInBytes);
214 return new ByteData.view(_buffer.buffer, 216 return new ByteData.view(_buffer.buffer,
215 _buffer.offsetInBytes + _bufferPos - sizeInBytes, sizeInBytes); 217 _buffer.offsetInBytes + _bufferPos - sizeInBytes, sizeInBytes);
216 } 218 }
217 } 219 }
OLDNEW
« no previous file with comments | « CHANGELOG.md ('k') | test/codec_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698