Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library analyzer.src.summary.flat_buffers; | 5 library analyzer.src.summary.flat_buffers; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:math'; | 9 import 'dart:math'; |
| 10 import 'dart:typed_data'; | 10 import 'dart:typed_data'; |
| 11 | 11 |
| 12 /** | 12 /** |
| 13 * Reader of lists of boolean values. | 13 * Reader of lists of boolean values. |
| 14 * | 14 * |
| 15 * The returned unmodifiable lists lazily read values on access. | 15 * The returned unmodifiable lists lazily read values on access. |
| 16 */ | 16 */ |
| 17 class BoolListReader extends Reader<List<bool>> { | 17 class BoolListReader extends Reader<List<bool>> { |
| 18 const BoolListReader(); | 18 const BoolListReader(); |
| 19 | 19 |
| 20 @override | 20 @override |
| 21 int get size => 4; | 21 int get size => 4; |
| 22 | 22 |
| 23 @override | 23 @override |
| 24 List<bool> read(BufferPointer bp) => new _FbBoolList(bp.derefObject()); | 24 List<bool> read(BufferContext bc, int offset) => |
| 25 new _FbBoolList(bc, bc.derefObject(offset)); | |
| 25 } | 26 } |
| 26 | 27 |
| 27 /** | 28 /** |
| 28 * The reader of booleans. | 29 * The reader of booleans. |
| 29 */ | 30 */ |
| 30 class BoolReader extends Reader<bool> { | 31 class BoolReader extends Reader<bool> { |
| 31 const BoolReader() : super(); | 32 const BoolReader() : super(); |
| 32 | 33 |
| 33 @override | 34 @override |
| 34 int get size => 1; | 35 int get size => 1; |
| 35 | 36 |
| 36 @override | 37 @override |
| 37 bool read(BufferPointer bp) => bp._getInt8() != 0; | 38 bool read(BufferContext bc, int offset) => bc._getInt8(offset) != 0; |
| 38 } | 39 } |
| 39 | 40 |
| 40 /** | 41 /** |
| 41 * A pointer to some data. | 42 * Buffer with data and some context about it. |
| 42 */ | 43 */ |
| 43 class BufferPointer { | 44 class BufferContext { |
| 44 final ByteData _buffer; | 45 final ByteData _buffer; |
| 45 final int _offset; | 46 final int _offset; |
| 46 | 47 |
| 47 factory BufferPointer.fromBytes(List<int> byteList, [int offset = 0]) { | 48 factory BufferContext.fromBytes(List<int> byteList) { |
| 48 Uint8List uint8List = _asUint8List(byteList); | 49 Uint8List uint8List = _asUint8List(byteList); |
| 49 ByteData buf = new ByteData.view(uint8List.buffer); | 50 ByteData buf = new ByteData.view(uint8List.buffer); |
|
Paul Berry
2016/05/19 22:12:32
I think if we do:
ByteData buf = new ByteData.vie
scheglov
2016/05/20 03:08:52
Done.
| |
| 50 return new BufferPointer._(buf, uint8List.offsetInBytes + offset); | 51 return new BufferContext._(buf, uint8List.offsetInBytes); |
| 51 } | 52 } |
| 52 | 53 |
| 53 BufferPointer._(this._buffer, this._offset); | 54 BufferContext._(this._buffer, this._offset); |
| 54 | 55 |
| 55 BufferPointer derefObject() { | 56 int derefObject(int offset) { |
| 56 int uOffset = _getUint32(); | 57 return offset + _getUint32(offset); |
|
Paul Berry
2016/05/19 22:12:32
I think this should be:
return offset + _getUint3
scheglov
2016/05/20 03:08:52
_getUint32() already applies _offset.
| |
| 57 return _advance(uOffset); | |
| 58 } | 58 } |
| 59 | 59 |
| 60 @override | 60 Uint8List _asUint8LIst(int offset, int length) => |
| 61 String toString() => _offset.toString(); | 61 _buffer.buffer.asUint8List(_offset + offset, length); |
| 62 | 62 |
| 63 BufferPointer _advance(int delta) { | 63 double _getFloat64(int offset) => |
| 64 return new BufferPointer._(_buffer, _offset + delta); | 64 _buffer.getFloat64(_offset + offset, Endianness.LITTLE_ENDIAN); |
| 65 } | |
| 66 | 65 |
| 67 double _getFloat64([int delta = 0]) => | 66 int _getInt32(int offset) => |
| 68 _buffer.getFloat64(_offset + delta, Endianness.LITTLE_ENDIAN); | 67 _buffer.getInt32(_offset + offset, Endianness.LITTLE_ENDIAN); |
| 69 | 68 |
| 70 int _getInt32([int delta = 0]) => | 69 int _getInt8(int offset) => _buffer.getInt8(_offset + offset); |
| 71 _buffer.getInt32(_offset + delta, Endianness.LITTLE_ENDIAN); | |
| 72 | 70 |
| 73 int _getInt8([int delta = 0]) => _buffer.getInt8(_offset + delta); | 71 int _getUint16(int offset) => |
| 72 _buffer.getUint16(_offset + offset, Endianness.LITTLE_ENDIAN); | |
| 74 | 73 |
| 75 int _getUint16([int delta = 0]) => | 74 int _getUint32(int offset) => |
| 76 _buffer.getUint16(_offset + delta, Endianness.LITTLE_ENDIAN); | 75 _buffer.getUint32(_offset + offset, Endianness.LITTLE_ENDIAN); |
| 77 | 76 |
| 78 int _getUint32([int delta = 0]) => | 77 int _getUint8(int offset) => _buffer.getUint8(_offset + offset); |
| 79 _buffer.getUint32(_offset + delta, Endianness.LITTLE_ENDIAN); | |
| 80 | |
| 81 int _getUint8([int delta = 0]) => _buffer.getUint8(_offset + delta); | |
| 82 | 78 |
| 83 /** | 79 /** |
| 84 * If the [byteList] is already a [Uint8List] return it. | 80 * If the [byteList] is already a [Uint8List] return it. |
| 85 * Otherwise return a [Uint8List] copy of the [byteList]. | 81 * Otherwise return a [Uint8List] copy of the [byteList]. |
| 86 */ | 82 */ |
| 87 static Uint8List _asUint8List(List<int> byteList) { | 83 static Uint8List _asUint8List(List<int> byteList) { |
| 88 if (byteList is Uint8List) { | 84 if (byteList is Uint8List) { |
| 89 return byteList; | 85 return byteList; |
| 90 } else { | 86 } else { |
| 91 return new Uint8List.fromList(byteList); | 87 return new Uint8List.fromList(byteList); |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 * | 552 * |
| 557 * The returned unmodifiable lists lazily read values on access. | 553 * The returned unmodifiable lists lazily read values on access. |
| 558 */ | 554 */ |
| 559 class Float64ListReader extends Reader<List<double>> { | 555 class Float64ListReader extends Reader<List<double>> { |
| 560 const Float64ListReader(); | 556 const Float64ListReader(); |
| 561 | 557 |
| 562 @override | 558 @override |
| 563 int get size => 4; | 559 int get size => 4; |
| 564 | 560 |
| 565 @override | 561 @override |
| 566 List<double> read(BufferPointer bp) => new _FbFloat64List(bp.derefObject()); | 562 List<double> read(BufferContext bc, int offset) => |
| 563 new _FbFloat64List(bc, bc.derefObject(offset)); | |
| 567 } | 564 } |
| 568 | 565 |
| 569 /** | 566 /** |
| 570 * The reader of signed 32-bit integers. | 567 * The reader of signed 32-bit integers. |
| 571 */ | 568 */ |
| 572 class Int32Reader extends Reader<int> { | 569 class Int32Reader extends Reader<int> { |
| 573 const Int32Reader() : super(); | 570 const Int32Reader() : super(); |
| 574 | 571 |
| 575 @override | 572 @override |
| 576 int get size => 4; | 573 int get size => 4; |
| 577 | 574 |
| 578 @override | 575 @override |
| 579 int read(BufferPointer bp) => bp._getInt32(); | 576 int read(BufferContext bc, int offset) => bc._getInt32(offset); |
| 580 } | 577 } |
| 581 | 578 |
| 582 /** | 579 /** |
| 583 * The reader of 8-bit signed integers. | 580 * The reader of 8-bit signed integers. |
| 584 */ | 581 */ |
| 585 class Int8Reader extends Reader<int> { | 582 class Int8Reader extends Reader<int> { |
| 586 const Int8Reader() : super(); | 583 const Int8Reader() : super(); |
| 587 | 584 |
| 588 @override | 585 @override |
| 589 int get size => 1; | 586 int get size => 1; |
| 590 | 587 |
| 591 @override | 588 @override |
| 592 int read(BufferPointer bp) => bp._getInt8(); | 589 int read(BufferContext bc, int offset) => bc._getInt8(offset); |
| 593 } | 590 } |
| 594 | 591 |
| 595 /** | 592 /** |
| 596 * The reader of lists of objects. | 593 * The reader of lists of objects. |
| 597 * | 594 * |
| 598 * The returned unmodifiable lists lazily read objects on access. | 595 * The returned unmodifiable lists lazily read objects on access. |
| 599 */ | 596 */ |
| 600 class ListReader<E> extends Reader<List<E>> { | 597 class ListReader<E> extends Reader<List<E>> { |
| 601 final Reader<E> _elementReader; | 598 final Reader<E> _elementReader; |
| 602 | 599 |
| 603 const ListReader(this._elementReader); | 600 const ListReader(this._elementReader); |
| 604 | 601 |
| 605 @override | 602 @override |
| 606 int get size => 4; | 603 int get size => 4; |
| 607 | 604 |
| 608 @override | 605 @override |
| 609 List<E> read(BufferPointer bp) => | 606 List<E> read(BufferContext bc, int offset) => |
| 610 new _FbGenericList<E>(_elementReader, bp.derefObject()); | 607 new _FbGenericList<E>(_elementReader, bc, bc.derefObject(offset)); |
| 611 } | 608 } |
| 612 | 609 |
| 613 /** | 610 /** |
| 614 * The offset from the end of the buffer to a serialized object of the type [T]. | 611 * The offset from the end of the buffer to a serialized object of the type [T]. |
| 615 */ | 612 */ |
| 616 class Offset<T> { | 613 class Offset<T> { |
| 617 final int _tail; | 614 final int _tail; |
| 618 | 615 |
| 619 Offset(this._tail); | 616 Offset(this._tail); |
| 620 } | 617 } |
| 621 | 618 |
| 622 /** | 619 /** |
| 623 * Object that can read a value at a [BufferPointer]. | 620 * Object that can read a value at a [BufferContext]. |
| 624 */ | 621 */ |
| 625 abstract class Reader<T> { | 622 abstract class Reader<T> { |
| 626 const Reader(); | 623 const Reader(); |
| 627 | 624 |
| 628 /** | 625 /** |
| 629 * The size of the value in bytes. | 626 * The size of the value in bytes. |
| 630 */ | 627 */ |
| 631 int get size; | 628 int get size; |
| 632 | 629 |
| 633 /** | 630 /** |
| 634 * Read the value at the given pointer. | 631 * Read the value at the given [offset] in [bc]. |
| 635 */ | 632 */ |
| 636 T read(BufferPointer bp); | 633 T read(BufferContext bc, int offset); |
| 637 | 634 |
| 638 /** | 635 /** |
| 639 * Read the value of the given [field] in the given [object]. | 636 * Read the value of the given [field] in the given [object]. |
| 640 */ | 637 */ |
| 641 T vTableGet(BufferPointer object, int field, [T defaultValue]) { | 638 T vTableGet(BufferContext object, int offset, int field, [T defaultValue]) { |
| 642 int vTableSOffset = object._getInt32(); | 639 int vTableSOffset = object._getInt32(offset); |
| 643 BufferPointer vTable = object._advance(-vTableSOffset); | 640 int vTableOffset = offset - vTableSOffset; |
| 644 int vTableSize = vTable._getUint16(); | 641 int vTableSize = object._getUint16(vTableOffset); |
| 645 int vTableFieldOffset = (1 + 1 + field) * 2; | 642 int vTableFieldOffset = (1 + 1 + field) * 2; |
| 646 if (vTableFieldOffset < vTableSize) { | 643 if (vTableFieldOffset < vTableSize) { |
| 647 int fieldOffsetInObject = vTable._getUint16(vTableFieldOffset); | 644 int fieldOffsetInObject = |
| 645 object._getUint16(vTableOffset + vTableFieldOffset); | |
| 648 if (fieldOffsetInObject != 0) { | 646 if (fieldOffsetInObject != 0) { |
| 649 BufferPointer fieldPointer = object._advance(fieldOffsetInObject); | 647 return read(object, offset + fieldOffsetInObject); |
| 650 return read(fieldPointer); | |
| 651 } | 648 } |
| 652 } | 649 } |
| 653 return defaultValue; | 650 return defaultValue; |
| 654 } | 651 } |
| 655 } | 652 } |
| 656 | 653 |
| 657 /** | 654 /** |
| 658 * The reader of string values. | 655 * The reader of string values. |
| 659 */ | 656 */ |
| 660 class StringReader extends Reader<String> { | 657 class StringReader extends Reader<String> { |
| 661 const StringReader() : super(); | 658 const StringReader() : super(); |
| 662 | 659 |
| 663 @override | 660 @override |
| 664 int get size => 4; | 661 int get size => 4; |
| 665 | 662 |
| 666 @override | 663 @override |
| 667 String read(BufferPointer ref) { | 664 String read(BufferContext bc, int offset) { |
| 668 BufferPointer object = ref.derefObject(); | 665 int strOffset = bc.derefObject(offset); |
| 669 int length = object._getUint32(); | 666 int length = bc._getUint32(strOffset); |
| 670 Uint8List bytes = ref._buffer.buffer.asUint8List(object._offset + 4, length) ; | 667 Uint8List bytes = bc._asUint8LIst(strOffset + 4, length); |
| 671 if (_isLatin(bytes)) { | 668 if (_isLatin(bytes)) { |
| 672 return new String.fromCharCodes(bytes); | 669 return new String.fromCharCodes(bytes); |
| 673 } | 670 } |
| 674 return UTF8.decode(bytes); | 671 return UTF8.decode(bytes); |
| 675 } | 672 } |
| 676 | 673 |
| 677 static bool _isLatin(Uint8List bytes) { | 674 static bool _isLatin(Uint8List bytes) { |
| 678 int length = bytes.length; | 675 int length = bytes.length; |
| 679 for (int i = 0; i < length; i++) { | 676 for (int i = 0; i < length; i++) { |
| 680 if (bytes[i] > 127) { | 677 if (bytes[i] > 127) { |
| 681 return false; | 678 return false; |
| 682 } | 679 } |
| 683 } | 680 } |
| 684 return true; | 681 return true; |
| 685 } | 682 } |
| 686 } | 683 } |
| 687 | 684 |
| 688 /** | 685 /** |
| 689 * An abstract reader for tables. | 686 * An abstract reader for tables. |
| 690 */ | 687 */ |
| 691 abstract class TableReader<T> extends Reader<T> { | 688 abstract class TableReader<T> extends Reader<T> { |
| 692 const TableReader(); | 689 const TableReader(); |
| 693 | 690 |
| 694 @override | 691 @override |
| 695 int get size => 4; | 692 int get size => 4; |
| 696 | 693 |
| 697 /** | 694 /** |
| 698 * Return the object at [bp]. | 695 * Return the object at [offset]. |
| 699 */ | 696 */ |
| 700 T createObject(BufferPointer bp); | 697 T createObject(BufferContext bc, int offset); |
| 701 | 698 |
| 702 @override | 699 @override |
| 703 T read(BufferPointer bp) { | 700 T read(BufferContext bp, int offset) { |
| 704 bp = bp.derefObject(); | 701 int objectOffset = bp.derefObject(offset); |
| 705 return createObject(bp); | 702 return createObject(bp, objectOffset); |
| 706 } | 703 } |
| 707 } | 704 } |
| 708 | 705 |
| 709 /** | 706 /** |
| 710 * Reader of lists of unsigned 32-bit integer values. | 707 * Reader of lists of unsigned 32-bit integer values. |
| 711 * | 708 * |
| 712 * The returned unmodifiable lists lazily read values on access. | 709 * The returned unmodifiable lists lazily read values on access. |
| 713 */ | 710 */ |
| 714 class Uint32ListReader extends Reader<List<int>> { | 711 class Uint32ListReader extends Reader<List<int>> { |
| 715 const Uint32ListReader(); | 712 const Uint32ListReader(); |
| 716 | 713 |
| 717 @override | 714 @override |
| 718 int get size => 4; | 715 int get size => 4; |
| 719 | 716 |
| 720 @override | 717 @override |
| 721 List<int> read(BufferPointer bp) => new _FbUint32List(bp.derefObject()); | 718 List<int> read(BufferContext bc, int offset) => |
| 719 new _FbUint32List(bc, bc.derefObject(offset)); | |
| 722 } | 720 } |
| 723 | 721 |
| 724 /** | 722 /** |
| 725 * The reader of unsigned 32-bit integers. | 723 * The reader of unsigned 32-bit integers. |
| 726 */ | 724 */ |
| 727 class Uint32Reader extends Reader<int> { | 725 class Uint32Reader extends Reader<int> { |
| 728 const Uint32Reader() : super(); | 726 const Uint32Reader() : super(); |
| 729 | 727 |
| 730 @override | 728 @override |
| 731 int get size => 4; | 729 int get size => 4; |
| 732 | 730 |
| 733 @override | 731 @override |
| 734 int read(BufferPointer bp) => bp._getUint32(); | 732 int read(BufferContext bc, int offset) => bc._getUint32(offset); |
| 735 } | 733 } |
| 736 | 734 |
| 737 /** | 735 /** |
| 738 * Reader of lists of unsigned 8-bit integer values. | 736 * Reader of lists of unsigned 8-bit integer values. |
| 739 * | 737 * |
| 740 * The returned unmodifiable lists lazily read values on access. | 738 * The returned unmodifiable lists lazily read values on access. |
| 741 */ | 739 */ |
| 742 class Uint8ListReader extends Reader<List<int>> { | 740 class Uint8ListReader extends Reader<List<int>> { |
| 743 const Uint8ListReader(); | 741 const Uint8ListReader(); |
| 744 | 742 |
| 745 @override | 743 @override |
| 746 int get size => 4; | 744 int get size => 4; |
| 747 | 745 |
| 748 @override | 746 @override |
| 749 List<int> read(BufferPointer bp) => new _FbUint8List(bp.derefObject()); | 747 List<int> read(BufferContext bc, int offset) => |
| 748 new _FbUint8List(bc, bc.derefObject(offset)); | |
| 750 } | 749 } |
| 751 | 750 |
| 752 /** | 751 /** |
| 753 * The reader of unsigned 8-bit integers. | 752 * The reader of unsigned 8-bit integers. |
| 754 */ | 753 */ |
| 755 class Uint8Reader extends Reader<int> { | 754 class Uint8Reader extends Reader<int> { |
| 756 const Uint8Reader() : super(); | 755 const Uint8Reader() : super(); |
| 757 | 756 |
| 758 @override | 757 @override |
| 759 int get size => 1; | 758 int get size => 1; |
| 760 | 759 |
| 761 @override | 760 @override |
| 762 int read(BufferPointer bp) => bp._getUint8(); | 761 int read(BufferContext bc, int offset) => bc._getUint8(offset); |
| 763 } | 762 } |
| 764 | 763 |
| 765 /** | 764 /** |
| 766 * List of booleans backed by 8-bit unsigned integers. | 765 * List of booleans backed by 8-bit unsigned integers. |
| 767 */ | 766 */ |
| 768 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> { | 767 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> { |
| 769 final BufferPointer bp; | 768 final BufferContext bc; |
| 769 final int offset; | |
| 770 int _length; | 770 int _length; |
| 771 | 771 |
| 772 _FbBoolList(this.bp); | 772 _FbBoolList(this.bc, this.offset); |
| 773 | 773 |
| 774 @override | 774 @override |
| 775 int get length { | 775 int get length { |
| 776 if (_length == null) { | 776 if (_length == null) { |
| 777 int byteLength = bp._getUint32(); | 777 int byteLength = bc._getUint32(offset); |
| 778 _length = (byteLength - 1) * 8 - _getByte(byteLength - 1); | 778 _length = (byteLength - 1) * 8 - _getByte(byteLength - 1); |
| 779 } | 779 } |
| 780 return _length; | 780 return _length; |
| 781 } | 781 } |
| 782 | 782 |
| 783 @override | 783 @override |
| 784 void set length(int i) => | 784 void set length(int i) => |
| 785 throw new StateError('Attempt to modify immutable list'); | 785 throw new StateError('Attempt to modify immutable list'); |
| 786 | 786 |
| 787 @override | 787 @override |
| 788 bool operator [](int i) { | 788 bool operator [](int i) { |
| 789 int index = i ~/ 8; | 789 int index = i ~/ 8; |
| 790 int mask = 1 << i % 8; | 790 int mask = 1 << i % 8; |
| 791 return _getByte(index) & mask != 0; | 791 return _getByte(index) & mask != 0; |
| 792 } | 792 } |
| 793 | 793 |
| 794 @override | 794 @override |
| 795 void operator []=(int i, bool e) => | 795 void operator []=(int i, bool e) => |
| 796 throw new StateError('Attempt to modify immutable list'); | 796 throw new StateError('Attempt to modify immutable list'); |
| 797 | 797 |
| 798 int _getByte(int index) => bp._getUint8(4 + index); | 798 int _getByte(int index) => bc._getUint8(offset + 4 + index); |
| 799 } | 799 } |
| 800 | 800 |
| 801 /** | 801 /** |
| 802 * The list backed by 64-bit values - Uint64 length and Float64. | 802 * The list backed by 64-bit values - Uint64 length and Float64. |
| 803 */ | 803 */ |
| 804 class _FbFloat64List extends _FbList<double> { | 804 class _FbFloat64List extends _FbList<double> { |
| 805 _FbFloat64List(BufferPointer bp) : super(bp); | 805 _FbFloat64List(BufferContext bc, int offset) : super(bc, offset); |
| 806 | 806 |
| 807 @override | 807 @override |
| 808 double operator [](int i) { | 808 double operator [](int i) { |
| 809 return bp._getFloat64(8 + 8 * i); | 809 return bc._getFloat64(offset + 8 + 8 * i); |
| 810 } | 810 } |
| 811 } | 811 } |
| 812 | 812 |
| 813 /** | 813 /** |
| 814 * List backed by a generic object which may have any size. | 814 * List backed by a generic object which may have any size. |
| 815 */ | 815 */ |
| 816 class _FbGenericList<E> extends _FbList<E> { | 816 class _FbGenericList<E> extends _FbList<E> { |
| 817 final Reader<E> elementReader; | 817 final Reader<E> elementReader; |
| 818 | 818 |
| 819 List<E> _items; | 819 List<E> _items; |
| 820 | 820 |
| 821 _FbGenericList(this.elementReader, BufferPointer bp) : super(bp); | 821 _FbGenericList(this.elementReader, BufferContext bp, int offset) |
| 822 : super(bp, offset); | |
| 822 | 823 |
| 823 @override | 824 @override |
| 824 E operator [](int i) { | 825 E operator [](int i) { |
| 825 _items ??= new List<E>(length); | 826 _items ??= new List<E>(length); |
| 826 E item = _items[i]; | 827 E item = _items[i]; |
| 827 if (item == null) { | 828 if (item == null) { |
| 828 BufferPointer ref = bp._advance(4 + elementReader.size * i); | 829 item = elementReader.read(bc, offset + 4 + elementReader.size * i); |
| 829 item = elementReader.read(ref); | |
| 830 _items[i] = item; | 830 _items[i] = item; |
| 831 } | 831 } |
| 832 return item; | 832 return item; |
| 833 } | 833 } |
| 834 } | 834 } |
| 835 | 835 |
| 836 /** | 836 /** |
| 837 * The base class for immutable lists read from flat buffers. | 837 * The base class for immutable lists read from flat buffers. |
| 838 */ | 838 */ |
| 839 abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> { | 839 abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> { |
| 840 final BufferPointer bp; | 840 final BufferContext bc; |
| 841 final int offset; | |
| 841 int _length; | 842 int _length; |
| 842 | 843 |
| 843 _FbList(this.bp); | 844 _FbList(this.bc, this.offset); |
| 844 | 845 |
| 845 @override | 846 @override |
| 846 int get length { | 847 int get length { |
| 847 _length ??= bp._getUint32(); | 848 // _length ??= bp._getUint32(offset); |
|
Paul Berry
2016/05/19 22:12:32
Did you forget to delete this?
scheglov
2016/05/20 03:08:52
Don't remember already why made this change at all
| |
| 849 _length = bc._getUint32(offset); | |
| 848 return _length; | 850 return _length; |
| 849 } | 851 } |
| 850 | 852 |
| 851 @override | 853 @override |
| 852 void set length(int i) => | 854 void set length(int i) => |
| 853 throw new StateError('Attempt to modify immutable list'); | 855 throw new StateError('Attempt to modify immutable list'); |
| 854 | 856 |
| 855 @override | 857 @override |
| 856 void operator []=(int i, E e) => | 858 void operator []=(int i, E e) => |
| 857 throw new StateError('Attempt to modify immutable list'); | 859 throw new StateError('Attempt to modify immutable list'); |
| 858 } | 860 } |
| 859 | 861 |
| 860 /** | 862 /** |
| 861 * List backed by 32-bit unsigned integers. | 863 * List backed by 32-bit unsigned integers. |
| 862 */ | 864 */ |
| 863 class _FbUint32List extends _FbList<int> { | 865 class _FbUint32List extends _FbList<int> { |
| 864 _FbUint32List(BufferPointer bp) : super(bp); | 866 _FbUint32List(BufferContext bc, int offset) : super(bc, offset); |
| 865 | 867 |
| 866 @override | 868 @override |
| 867 int operator [](int i) { | 869 int operator [](int i) { |
| 868 return bp._getUint32(4 + 4 * i); | 870 return bc._getUint32(offset + 4 + 4 * i); |
| 869 } | 871 } |
| 870 } | 872 } |
| 871 | 873 |
| 872 /** | 874 /** |
| 873 * List backed by 8-bit unsigned integers. | 875 * List backed by 8-bit unsigned integers. |
| 874 */ | 876 */ |
| 875 class _FbUint8List extends _FbList<int> { | 877 class _FbUint8List extends _FbList<int> { |
| 876 _FbUint8List(BufferPointer bp) : super(bp); | 878 _FbUint8List(BufferContext bc, int offset) : super(bc, offset); |
| 877 | 879 |
| 878 @override | 880 @override |
| 879 int operator [](int i) { | 881 int operator [](int i) { |
| 880 return bp._getUint8(4 + i); | 882 return bc._getUint8(offset + 4 + i); |
| 881 } | 883 } |
| 882 } | 884 } |
| 883 | 885 |
| 884 /** | 886 /** |
| 885 * Class that describes the structure of a table. | 887 * Class that describes the structure of a table. |
| 886 */ | 888 */ |
| 887 class _VTable { | 889 class _VTable { |
| 888 final List<int> fieldTails = <int>[]; | 890 final List<int> fieldTails = <int>[]; |
| 889 final List<int> fieldOffsets = <int>[]; | 891 final List<int> fieldOffsets = <int>[]; |
| 890 | 892 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 948 // Table size. | 950 // Table size. |
| 949 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); | 951 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); |
| 950 bufOffset += 2; | 952 bufOffset += 2; |
| 951 // Field offsets. | 953 // Field offsets. |
| 952 for (int fieldOffset in fieldOffsets) { | 954 for (int fieldOffset in fieldOffsets) { |
| 953 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); | 955 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); |
| 954 bufOffset += 2; | 956 bufOffset += 2; |
| 955 } | 957 } |
| 956 } | 958 } |
| 957 } | 959 } |
| OLD | NEW |