OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 part of bindings; | 5 part of bindings; |
6 | 6 |
7 int align(int size) => size + (kAlignment - (size % kAlignment)) % kAlignment; | 7 int align(int size) => size + (kAlignment - (size % kAlignment)) % kAlignment; |
8 | 8 |
9 const int kAlignment = 8; | 9 const int kAlignment = 8; |
10 const int kSerializedHandleSize = 4; | 10 const int kSerializedHandleSize = 4; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 result.encodeStructDataHeader(dataHeader); | 98 result.encodeStructDataHeader(dataHeader); |
99 return result; | 99 return result; |
100 } | 100 } |
101 | 101 |
102 Encoder getArrayEncoderAtOffset(ArrayDataHeader dataHeader) { | 102 Encoder getArrayEncoderAtOffset(ArrayDataHeader dataHeader) { |
103 var result = new Encoder._fromBuffer(_buffer); | 103 var result = new Encoder._fromBuffer(_buffer); |
104 result.encodeArrayDataHeader(dataHeader); | 104 result.encodeArrayDataHeader(dataHeader); |
105 return result; | 105 return result; |
106 } | 106 } |
107 | 107 |
108 Message get message => new Message(_buffer.trimmed, _buffer.handles); | 108 Message get message => new Message( |
| 109 _buffer.trimmed, _buffer.handles, _buffer.extent, _buffer.handles.length); |
109 | 110 |
110 void encodeStructDataHeader(StructDataHeader dataHeader) { | 111 void encodeStructDataHeader(StructDataHeader dataHeader) { |
111 _buffer.claimMemory(align(dataHeader.size)); | 112 _buffer.claimMemory(align(dataHeader.size)); |
112 encodeUint32(dataHeader.size, StructDataHeader.kSizeOffset); | 113 encodeUint32(dataHeader.size, StructDataHeader.kSizeOffset); |
113 encodeUint32(dataHeader.version, StructDataHeader.kVersionOffset); | 114 encodeUint32(dataHeader.version, StructDataHeader.kVersionOffset); |
114 } | 115 } |
115 | 116 |
116 void encodeArrayDataHeader(ArrayDataHeader dataHeader) { | 117 void encodeArrayDataHeader(ArrayDataHeader dataHeader) { |
117 _buffer.claimMemory(align(dataHeader.size)); | 118 _buffer.claimMemory(align(dataHeader.size)); |
118 encodeUint32(dataHeader.size, ArrayDataHeader.kSizeOffset); | 119 encodeUint32(dataHeader.size, ArrayDataHeader.kSizeOffset); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 void encodeInt64(int value, int offset) => | 164 void encodeInt64(int value, int offset) => |
164 _buffer.buffer.setInt64(_base + offset, value, Endianness.LITTLE_ENDIAN); | 165 _buffer.buffer.setInt64(_base + offset, value, Endianness.LITTLE_ENDIAN); |
165 | 166 |
166 void encodeUint64(int value, int offset) { | 167 void encodeUint64(int value, int offset) { |
167 if (value < 0) { | 168 if (value < 0) { |
168 throw new MojoCodecError('$kErrorUnsigned: $value'); | 169 throw new MojoCodecError('$kErrorUnsigned: $value'); |
169 } | 170 } |
170 _buffer.buffer.setUint64(_base + offset, value, Endianness.LITTLE_ENDIAN); | 171 _buffer.buffer.setUint64(_base + offset, value, Endianness.LITTLE_ENDIAN); |
171 } | 172 } |
172 | 173 |
173 void encodeFloat(double value, int offset) => _buffer.buffer.setFloat32( | 174 void encodeFloat(double value, int offset) => _buffer.buffer |
174 _base + offset, value, Endianness.LITTLE_ENDIAN); | 175 .setFloat32(_base + offset, value, Endianness.LITTLE_ENDIAN); |
175 | 176 |
176 void encodeDouble(double value, int offset) => _buffer.buffer.setFloat64( | 177 void encodeDouble(double value, int offset) => _buffer.buffer |
177 _base + offset, value, Endianness.LITTLE_ENDIAN); | 178 .setFloat64(_base + offset, value, Endianness.LITTLE_ENDIAN); |
178 | 179 |
179 void encodeHandle(core.MojoHandle value, int offset, bool nullable) { | 180 void encodeHandle(core.MojoHandle value, int offset, bool nullable) { |
180 if ((value == null) || !value.isValid) { | 181 if ((value == null) || !value.isValid) { |
181 encodeInvalideHandle(offset, nullable); | 182 encodeInvalideHandle(offset, nullable); |
182 } else { | 183 } else { |
183 encodeUint32(_buffer.handles.length, offset); | 184 encodeUint32(_buffer.handles.length, offset); |
184 _buffer.handles.add(value.pass()); | 185 _buffer.handles.add(value.pass()); |
185 } | 186 } |
186 } | 187 } |
187 | 188 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 encodeNullPointer(offset, nullable); | 269 encodeNullPointer(offset, nullable); |
269 return; | 270 return; |
270 } | 271 } |
271 encodePointerToNextUnclaimed(offset); | 272 encodePointerToNextUnclaimed(offset); |
272 value.encode(this); | 273 value.encode(this); |
273 } | 274 } |
274 | 275 |
275 void encodeUnion(Union value, int offset, bool nullable) { | 276 void encodeUnion(Union value, int offset, bool nullable) { |
276 if (value == null) { | 277 if (value == null) { |
277 if (!nullable) { | 278 if (!nullable) { |
278 throw new MojoCodecError( | 279 throw new MojoCodecError('Trying to encode a non-nullable null union.'); |
279 'Trying to encode a non-nullable null union.'); | |
280 } | 280 } |
281 encodeUint64(0, offset); | 281 encodeUint64(0, offset); |
282 encodeUint64(0, offset + 8); | 282 encodeUint64(0, offset + 8); |
283 return; | 283 return; |
284 } | 284 } |
285 value.encode(this, offset); | 285 value.encode(this, offset); |
286 } | 286 } |
287 | 287 |
288 void encodeEnum(MojoEnum value, int offset) => | 288 void encodeEnum(MojoEnum value, int offset) => |
289 encodeUint32(value.value, offset); | 289 encodeUint32(value.value, offset); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 var encoder = | 415 var encoder = |
416 encoderForArray(elementSize, value.length, offset, expectedLength); | 416 encoderForArray(elementSize, value.length, offset, expectedLength); |
417 for (int i = 0; i < value.length; ++i) { | 417 for (int i = 0; i < value.length; ++i) { |
418 int elementOffset = ArrayDataHeader.kHeaderSize + elementSize * i; | 418 int elementOffset = ArrayDataHeader.kHeaderSize + elementSize * i; |
419 elementEncoder( | 419 elementEncoder( |
420 encoder, value[i], elementOffset, isElementNullable(nullability)); | 420 encoder, value[i], elementOffset, isElementNullable(nullability)); |
421 } | 421 } |
422 } | 422 } |
423 | 423 |
424 void encodeHandleArray(List<core.MojoHandle> value, int offset, | 424 void encodeHandleArray(List<core.MojoHandle> value, int offset, |
425 int nullability, int expectedLength) => _handleArrayEncodeHelper( | 425 int nullability, int expectedLength) => |
426 (e, v, o, n) => e.encodeHandle(v, o, n), value, offset, | 426 _handleArrayEncodeHelper((e, v, o, n) => e.encodeHandle(v, o, n), value, |
427 kSerializedHandleSize, nullability, expectedLength); | 427 offset, kSerializedHandleSize, nullability, expectedLength); |
428 | 428 |
429 void encodeMessagePipeHandleArray(List<core.MojoMessagePipeEndpoint> value, | 429 void encodeMessagePipeHandleArray(List<core.MojoMessagePipeEndpoint> value, |
430 int offset, int nullability, int expectedLength) => | 430 int offset, int nullability, int expectedLength) => |
431 _handleArrayEncodeHelper( | 431 _handleArrayEncodeHelper( |
432 (e, v, o, n) => e.encodeMessagePipeHandle(v, o, n), value, offset, | 432 (e, v, o, n) => e.encodeMessagePipeHandle(v, o, n), |
433 kSerializedHandleSize, nullability, expectedLength); | 433 value, |
| 434 offset, |
| 435 kSerializedHandleSize, |
| 436 nullability, |
| 437 expectedLength); |
434 | 438 |
435 void encodeConsumerHandleArray(List<core.MojoDataPipeConsumer> value, | 439 void encodeConsumerHandleArray(List<core.MojoDataPipeConsumer> value, |
436 int offset, int nullability, int expectedLength) => | 440 int offset, int nullability, int expectedLength) => |
437 _handleArrayEncodeHelper((e, v, o, n) => e.encodeConsumerHandle(v, o, n), | 441 _handleArrayEncodeHelper((e, v, o, n) => e.encodeConsumerHandle(v, o, n), |
438 value, offset, kSerializedHandleSize, nullability, expectedLength); | 442 value, offset, kSerializedHandleSize, nullability, expectedLength); |
439 | 443 |
440 void encodeProducerHandleArray(List<core.MojoDataPipeProducer> value, | 444 void encodeProducerHandleArray(List<core.MojoDataPipeProducer> value, |
441 int offset, int nullability, int expectedLength) => | 445 int offset, int nullability, int expectedLength) => |
442 _handleArrayEncodeHelper((e, v, o, n) => e.encodeProducerHandle(v, o, n), | 446 _handleArrayEncodeHelper((e, v, o, n) => e.encodeProducerHandle(v, o, n), |
443 value, offset, kSerializedHandleSize, nullability, expectedLength); | 447 value, offset, kSerializedHandleSize, nullability, expectedLength); |
444 | 448 |
445 void encodeSharedBufferHandleArray(List<core.MojoSharedBuffer> value, | 449 void encodeSharedBufferHandleArray(List<core.MojoSharedBuffer> value, |
446 int offset, int nullability, int expectedLength) => | 450 int offset, int nullability, int expectedLength) => |
447 _handleArrayEncodeHelper( | 451 _handleArrayEncodeHelper( |
448 (e, v, o, n) => e.encodeSharedBufferHandle(v, o, n), value, offset, | 452 (e, v, o, n) => e.encodeSharedBufferHandle(v, o, n), |
449 kSerializedHandleSize, nullability, expectedLength); | 453 value, |
| 454 offset, |
| 455 kSerializedHandleSize, |
| 456 nullability, |
| 457 expectedLength); |
450 | 458 |
451 void encodeInterfaceRequestArray( | 459 void encodeInterfaceRequestArray( |
452 List<Proxy> value, int offset, int nullability, int expectedLength) => | 460 List<Proxy> value, int offset, int nullability, int expectedLength) => |
453 _handleArrayEncodeHelper( | 461 _handleArrayEncodeHelper( |
454 (e, v, o, n) => e.encodeInterfaceRequest(v, o, n), value, offset, | 462 (e, v, o, n) => e.encodeInterfaceRequest(v, o, n), |
455 kSerializedHandleSize, nullability, expectedLength); | 463 value, |
| 464 offset, |
| 465 kSerializedHandleSize, |
| 466 nullability, |
| 467 expectedLength); |
456 | 468 |
457 void encodeInterfaceArray( | 469 void encodeInterfaceArray( |
458 List<Stub> value, int offset, int nullability, int expectedLength) => | 470 List<Stub> value, int offset, int nullability, int expectedLength) => |
459 _handleArrayEncodeHelper((e, v, o, n) => e.encodeInterface(v, o, n), | 471 _handleArrayEncodeHelper((e, v, o, n) => e.encodeInterface(v, o, n), |
460 value, offset, kSerializedInterfaceSize, nullability, expectedLength); | 472 value, offset, kSerializedInterfaceSize, nullability, expectedLength); |
461 | 473 |
462 static Uint8List _utf8OfString(String s) => | 474 static Uint8List _utf8OfString(String s) => |
463 (new Uint8List.fromList((const Utf8Encoder()).convert(s))); | 475 (new Uint8List.fromList((const Utf8Encoder()).convert(s))); |
464 | 476 |
465 void encodeString(String value, int offset, bool nullable) { | 477 void encodeString(String value, int offset, bool nullable) { |
466 if (value == null) { | 478 if (value == null) { |
467 encodeNullPointer(offset, nullable); | 479 encodeNullPointer(offset, nullable); |
468 return; | 480 return; |
469 } | 481 } |
470 int nullability = nullable ? kArrayNullable : kNothingNullable; | 482 int nullability = nullable ? kArrayNullable : kNothingNullable; |
471 encodeUint8Array( | 483 encodeUint8Array( |
472 _utf8OfString(value), offset, nullability, kUnspecifiedArrayLength); | 484 _utf8OfString(value), offset, nullability, kUnspecifiedArrayLength); |
473 } | 485 } |
474 | 486 |
475 void appendBytes(Uint8List value) { | 487 void appendBytes(Uint8List value) { |
476 _buffer.buffer.buffer | 488 _buffer.buffer.buffer.asUint8List().setRange( |
477 .asUint8List() | 489 _base + ArrayDataHeader.kHeaderSize, |
478 .setRange(_base + ArrayDataHeader.kHeaderSize, | 490 _base + ArrayDataHeader.kHeaderSize + value.lengthInBytes, |
479 _base + ArrayDataHeader.kHeaderSize + value.lengthInBytes, value); | 491 value); |
480 } | 492 } |
481 | 493 |
482 void appendInt8Array(List<int> value) => | 494 void appendInt8Array(List<int> value) => |
483 appendBytes(new Uint8List.view(new Int8List.fromList(value).buffer)); | 495 appendBytes(new Uint8List.view(new Int8List.fromList(value).buffer)); |
484 | 496 |
485 void appendUint8Array(List<int> value) => | 497 void appendUint8Array(List<int> value) => |
486 appendBytes(new Uint8List.fromList(value)); | 498 appendBytes(new Uint8List.fromList(value)); |
487 | 499 |
488 void appendInt16Array(List<int> value) => | 500 void appendInt16Array(List<int> value) => |
489 appendBytes(new Uint8List.view(new Int16List.fromList(value).buffer)); | 501 appendBytes(new Uint8List.view(new Int16List.fromList(value).buffer)); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 } | 566 } |
555 } | 567 } |
556 | 568 |
557 class Decoder { | 569 class Decoder { |
558 _Validator _validator; | 570 _Validator _validator; |
559 Message _message; | 571 Message _message; |
560 int _base = 0; | 572 int _base = 0; |
561 | 573 |
562 Decoder(this._message, [this._base = 0, this._validator = null]) { | 574 Decoder(this._message, [this._base = 0, this._validator = null]) { |
563 if (_validator == null) { | 575 if (_validator == null) { |
564 _validator = new _Validator( | 576 _validator = new _Validator(_message.dataLength, _message.handlesLength); |
565 _message.buffer.lengthInBytes, _message.handles.length); | |
566 } | 577 } |
567 } | 578 } |
568 | 579 |
569 Decoder getDecoderAtPosition(int offset) => | 580 Decoder getDecoderAtPosition(int offset) => |
570 new Decoder(_message, offset, _validator); | 581 new Decoder(_message, offset, _validator); |
571 | 582 |
572 factory Decoder.atOffset(Decoder d, int offset, _Validator validator) => | 583 factory Decoder.atOffset(Decoder d, int offset, _Validator validator) => |
573 new Decoder(d._message, offset, validator); | 584 new Decoder(d._message, offset, validator); |
574 | 585 |
575 ByteData get _buffer => _message.buffer; | 586 ByteData get _buffer => _message.buffer; |
576 List<core.MojoHandle> get _handles => _message.handles; | 587 List<core.MojoHandle> get _handles => _message.handles; |
577 List<core.MojoHandle> get excessHandles => new List.from(_message.handles | 588 List<core.MojoHandle> get excessHandles { |
578 .getRange(_validator._minNextClaimedHandle, _message.handles.length)) | 589 if (_message.handlesLength == 0) return null; |
579 ..addAll(_validator._skippedIndices.map((i) => _message.handles[i])); | 590 var leftAtEnd = _message.handles |
| 591 .getRange(_validator._minNextClaimedHandle, _message.handlesLength); |
| 592 var skipped = _validator._skippedIndices.map((i) => _message.handles[i]); |
| 593 return new List.from(leftAtEnd)..addAll(skipped); |
| 594 } |
580 | 595 |
581 int decodeInt8(int offset) => _buffer.getInt8(_base + offset); | 596 int decodeInt8(int offset) => _buffer.getInt8(_base + offset); |
582 int decodeUint8(int offset) => _buffer.getUint8(_base + offset); | 597 int decodeUint8(int offset) => _buffer.getUint8(_base + offset); |
583 int decodeInt16(int offset) => | 598 int decodeInt16(int offset) => |
584 _buffer.getInt16(_base + offset, Endianness.LITTLE_ENDIAN); | 599 _buffer.getInt16(_base + offset, Endianness.LITTLE_ENDIAN); |
585 int decodeUint16(int offset) => | 600 int decodeUint16(int offset) => |
586 _buffer.getUint16(_base + offset, Endianness.LITTLE_ENDIAN); | 601 _buffer.getUint16(_base + offset, Endianness.LITTLE_ENDIAN); |
587 int decodeInt32(int offset) => | 602 int decodeInt32(int offset) => |
588 _buffer.getInt32(_base + offset, Endianness.LITTLE_ENDIAN); | 603 _buffer.getInt32(_base + offset, Endianness.LITTLE_ENDIAN); |
589 int decodeUint32(int offset) => | 604 int decodeUint32(int offset) => |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 } | 717 } |
703 return header; | 718 return header; |
704 } | 719 } |
705 | 720 |
706 List<bool> decodeBoolArray(int offset, int nullability, int expectedLength) { | 721 List<bool> decodeBoolArray(int offset, int nullability, int expectedLength) { |
707 Decoder d = decodePointer(offset, isArrayNullable(nullability)); | 722 Decoder d = decodePointer(offset, isArrayNullable(nullability)); |
708 if (d == null) { | 723 if (d == null) { |
709 return null; | 724 return null; |
710 } | 725 } |
711 var header = d.decodeDataHeaderForBoolArray(expectedLength); | 726 var header = d.decodeDataHeaderForBoolArray(expectedLength); |
712 var bytes = new Uint8List.view(d._buffer.buffer, | 727 var bytes = new Uint8List.view( |
| 728 d._buffer.buffer, |
713 d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize, | 729 d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize, |
714 (header.numElements + 7) ~/ kAlignment); | 730 (header.numElements + 7) ~/ kAlignment); |
715 var result = new List<bool>(header.numElements); | 731 var result = new List<bool>(header.numElements); |
716 for (int i = 0; i < bytes.lengthInBytes; ++i) { | 732 for (int i = 0; i < bytes.lengthInBytes; ++i) { |
717 for (int j = 0; j < kAlignment; ++j) { | 733 for (int j = 0; j < kAlignment; ++j) { |
718 int boolIndex = i * kAlignment + j; | 734 int boolIndex = i * kAlignment + j; |
719 if (boolIndex < result.length) { | 735 if (boolIndex < result.length) { |
720 result[boolIndex] = (bytes[i] & (1 << j)) != 0; | 736 result[boolIndex] = (bytes[i] & (1 << j)) != 0; |
721 } | 737 } |
722 } | 738 } |
(...skipping 28 matching lines...) Expand all Loading... |
751 ArrayDataHeader decodeDataHeaderForEnumArray(int expectedLength) => | 767 ArrayDataHeader decodeDataHeaderForEnumArray(int expectedLength) => |
752 decodeDataHeaderForArray(kEnumSize, expectedLength); | 768 decodeDataHeaderForArray(kEnumSize, expectedLength); |
753 | 769 |
754 List decodeArray(Function arrayViewer, int elementSize, int offset, | 770 List decodeArray(Function arrayViewer, int elementSize, int offset, |
755 int nullability, int expectedLength) { | 771 int nullability, int expectedLength) { |
756 Decoder d = decodePointer(offset, isArrayNullable(nullability)); | 772 Decoder d = decodePointer(offset, isArrayNullable(nullability)); |
757 if (d == null) { | 773 if (d == null) { |
758 return null; | 774 return null; |
759 } | 775 } |
760 var header = d.decodeDataHeaderForArray(elementSize, expectedLength); | 776 var header = d.decodeDataHeaderForArray(elementSize, expectedLength); |
761 return arrayViewer(d._buffer.buffer, | 777 return arrayViewer( |
| 778 d._buffer.buffer, |
762 d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize, | 779 d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize, |
763 header.numElements); | 780 header.numElements).toList(); |
764 } | 781 } |
765 | 782 |
766 List<int> decodeInt8Array(int offset, int nullability, int expectedLength) => | 783 List<int> decodeInt8Array(int offset, int nullability, int expectedLength) => |
767 decodeArray((b, s, l) => new Int8List.view(b, s, l), 1, offset, | 784 decodeArray((b, s, l) => new Int8List.view(b, s, l), 1, offset, |
768 nullability, expectedLength); | 785 nullability, expectedLength); |
769 | 786 |
770 List<int> decodeUint8Array(int offset, int nullability, int expectedLength) => | 787 List<int> decodeUint8Array(int offset, int nullability, int expectedLength) => |
771 decodeArray((b, s, l) => new Uint8List.view(b, s, l), 1, offset, | 788 decodeArray((b, s, l) => new Uint8List.view(b, s, l), 1, offset, |
772 nullability, expectedLength); | 789 nullability, expectedLength); |
773 | 790 |
774 List<int> decodeInt16Array(int offset, int nullability, int expectedLength) => | 791 List<int> decodeInt16Array(int offset, int nullability, int expectedLength) => |
775 decodeArray((b, s, l) => new Int16List.view(b, s, l), 2, offset, | 792 decodeArray((b, s, l) => new Int16List.view(b, s, l), 2, offset, |
776 nullability, expectedLength); | 793 nullability, expectedLength); |
777 | 794 |
778 List<int> decodeUint16Array( | 795 List<int> decodeUint16Array( |
779 int offset, int nullability, int expectedLength) => decodeArray( | 796 int offset, int nullability, int expectedLength) => |
780 (b, s, l) => new Uint16List.view(b, s, l), 2, offset, nullability, | 797 decodeArray((b, s, l) => new Uint16List.view(b, s, l), 2, offset, |
781 expectedLength); | 798 nullability, expectedLength); |
782 | 799 |
783 List<int> decodeInt32Array(int offset, int nullability, int expectedLength) => | 800 List<int> decodeInt32Array(int offset, int nullability, int expectedLength) => |
784 decodeArray((b, s, l) => new Int32List.view(b, s, l), 4, offset, | 801 decodeArray((b, s, l) => new Int32List.view(b, s, l), 4, offset, |
785 nullability, expectedLength); | 802 nullability, expectedLength); |
786 | 803 |
787 List<int> decodeUint32Array( | 804 List<int> decodeUint32Array( |
788 int offset, int nullability, int expectedLength) => decodeArray( | 805 int offset, int nullability, int expectedLength) => |
789 (b, s, l) => new Uint32List.view(b, s, l), 4, offset, nullability, | 806 decodeArray((b, s, l) => new Uint32List.view(b, s, l), 4, offset, |
790 expectedLength); | 807 nullability, expectedLength); |
791 | 808 |
792 List<int> decodeInt64Array(int offset, int nullability, int expectedLength) => | 809 List<int> decodeInt64Array(int offset, int nullability, int expectedLength) => |
793 decodeArray((b, s, l) => new Int64List.view(b, s, l), 8, offset, | 810 decodeArray((b, s, l) => new Int64List.view(b, s, l), 8, offset, |
794 nullability, expectedLength); | 811 nullability, expectedLength); |
795 | 812 |
796 List<int> decodeUint64Array( | 813 List<int> decodeUint64Array( |
797 int offset, int nullability, int expectedLength) => decodeArray( | 814 int offset, int nullability, int expectedLength) => |
798 (b, s, l) => new Uint64List.view(b, s, l), 8, offset, nullability, | 815 decodeArray((b, s, l) => new Uint64List.view(b, s, l), 8, offset, |
799 expectedLength); | 816 nullability, expectedLength); |
800 | 817 |
801 List<double> decodeFloatArray( | 818 List<double> decodeFloatArray( |
802 int offset, int nullability, int expectedLength) => decodeArray( | 819 int offset, int nullability, int expectedLength) => |
803 (b, s, l) => new Float32List.view(b, s, l), 4, offset, nullability, | 820 decodeArray((b, s, l) => new Float32List.view(b, s, l), 4, offset, |
804 expectedLength); | 821 nullability, expectedLength); |
805 | 822 |
806 List<double> decodeDoubleArray( | 823 List<double> decodeDoubleArray( |
807 int offset, int nullability, int expectedLength) => decodeArray( | 824 int offset, int nullability, int expectedLength) => |
808 (b, s, l) => new Float64List.view(b, s, l), 8, offset, nullability, | 825 decodeArray((b, s, l) => new Float64List.view(b, s, l), 8, offset, |
809 expectedLength); | 826 nullability, expectedLength); |
810 | 827 |
811 List _handleArrayDecodeHelper(Function elementDecoder, int offset, | 828 List _handleArrayDecodeHelper(Function elementDecoder, int offset, |
812 int elementSize, int nullability, int expectedLength) { | 829 int elementSize, int nullability, int expectedLength) { |
813 Decoder d = decodePointer(offset, isArrayNullable(nullability)); | 830 Decoder d = decodePointer(offset, isArrayNullable(nullability)); |
814 if (d == null) { | 831 if (d == null) { |
815 return null; | 832 return null; |
816 } | 833 } |
817 var header = d.decodeDataHeaderForArray(elementSize, expectedLength); | 834 var header = d.decodeDataHeaderForArray(elementSize, expectedLength); |
818 var result = new List(header.numElements); | 835 var result = new List(header.numElements); |
819 for (int i = 0; i < result.length; ++i) { | 836 for (int i = 0; i < result.length; ++i) { |
820 result[i] = elementDecoder(d, | 837 result[i] = elementDecoder( |
| 838 d, |
821 ArrayDataHeader.kHeaderSize + elementSize * i, | 839 ArrayDataHeader.kHeaderSize + elementSize * i, |
822 isElementNullable(nullability)); | 840 isElementNullable(nullability)); |
823 } | 841 } |
824 return result; | 842 return result; |
825 } | 843 } |
826 | 844 |
827 List<core.MojoHandle> decodeHandleArray( | 845 List<core.MojoHandle> decodeHandleArray( |
828 int offset, int nullability, int expectedLength) => | 846 int offset, int nullability, int expectedLength) => |
829 _handleArrayDecodeHelper((d, o, n) => d.decodeHandle(o, n), offset, | 847 _handleArrayDecodeHelper((d, o, n) => d.decodeHandle(o, n), offset, |
830 kSerializedHandleSize, nullability, expectedLength); | 848 kSerializedHandleSize, nullability, expectedLength); |
(...skipping 14 matching lines...) Expand all Loading... |
845 offset, kSerializedHandleSize, nullability, expectedLength); | 863 offset, kSerializedHandleSize, nullability, expectedLength); |
846 | 864 |
847 List<core.MojoSharedBuffer> decodeSharedBufferHandleArray( | 865 List<core.MojoSharedBuffer> decodeSharedBufferHandleArray( |
848 int offset, int nullability, int expectedLength) => | 866 int offset, int nullability, int expectedLength) => |
849 _handleArrayDecodeHelper((d, o, n) => d.decodeSharedBufferHandle(o, n), | 867 _handleArrayDecodeHelper((d, o, n) => d.decodeSharedBufferHandle(o, n), |
850 offset, kSerializedHandleSize, nullability, expectedLength); | 868 offset, kSerializedHandleSize, nullability, expectedLength); |
851 | 869 |
852 List<Stub> decodeInterfaceRequestArray(int offset, int nullability, | 870 List<Stub> decodeInterfaceRequestArray(int offset, int nullability, |
853 int expectedLength, Function interfaceFactory) => | 871 int expectedLength, Function interfaceFactory) => |
854 _handleArrayDecodeHelper( | 872 _handleArrayDecodeHelper( |
855 (d, o, n) => d.decodeInterfaceRequest(o, n, interfaceFactory), offset, | 873 (d, o, n) => d.decodeInterfaceRequest(o, n, interfaceFactory), |
856 kSerializedHandleSize, nullability, expectedLength); | 874 offset, |
| 875 kSerializedHandleSize, |
| 876 nullability, |
| 877 expectedLength); |
857 | 878 |
858 List<Proxy> decodeServiceInterfaceArray(int offset, int nullability, | 879 List<Proxy> decodeServiceInterfaceArray(int offset, int nullability, |
859 int expectedLength, Function clientFactory) => _handleArrayDecodeHelper( | 880 int expectedLength, Function clientFactory) => |
860 (d, o, n) => d.decodeServiceInterface(o, n, clientFactory), offset, | 881 _handleArrayDecodeHelper( |
861 kSerializedInterfaceSize, nullability, expectedLength); | 882 (d, o, n) => d.decodeServiceInterface(o, n, clientFactory), |
862 | 883 offset, |
863 static String _stringOfUtf8(Uint8List bytes) => | 884 kSerializedInterfaceSize, |
864 (const Utf8Decoder()).convert(bytes.toList()); | 885 nullability, |
| 886 expectedLength); |
865 | 887 |
866 String decodeString(int offset, bool nullable) { | 888 String decodeString(int offset, bool nullable) { |
867 int nullability = nullable ? kArrayNullable : 0; | 889 int nullability = nullable ? kArrayNullable : 0; |
868 var bytes = decodeUint8Array(offset, nullability, kUnspecifiedArrayLength); | 890 var bytes = decodeUint8Array(offset, nullability, kUnspecifiedArrayLength); |
869 if (bytes == null) { | 891 if (bytes == null) { |
870 return null; | 892 return null; |
871 } | 893 } |
872 return _stringOfUtf8(bytes); | 894 return (const Utf8Decoder()).convert(bytes); |
873 } | 895 } |
874 | 896 |
875 StructDataHeader decodeDataHeaderForMap() { | 897 StructDataHeader decodeDataHeaderForMap() { |
876 var header = decodeStructDataHeader(); | 898 var header = decodeStructDataHeader(); |
877 if (header.size != kMapStructHeader.size) { | 899 if (header.size != kMapStructHeader.size) { |
878 throw new MojoCodecError( | 900 throw new MojoCodecError( |
879 'Incorrect header for map. The size is incorrect.'); | 901 'Incorrect header for map. The size is incorrect.'); |
880 } | 902 } |
881 if (header.version != kMapStructHeader.version) { | 903 if (header.version != kMapStructHeader.version) { |
882 throw new MojoCodecError( | 904 throw new MojoCodecError( |
883 'Incorrect header for map. The version is incorrect.'); | 905 'Incorrect header for map. The version is incorrect.'); |
884 } | 906 } |
885 return header; | 907 return header; |
886 } | 908 } |
887 } | 909 } |
OLD | NEW |