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

Side by Side Diff: mojo/public/dart/mojo/lib/src/codec.dart

Issue 1415253008: Dart: Merge message pipe query and read into one native call (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Format Created 5 years, 1 month 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 | « no previous file | mojo/public/dart/mojo/lib/src/message.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 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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | mojo/public/dart/mojo/lib/src/message.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698