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'; |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 int get size => 1; | 729 int get size => 1; |
730 | 730 |
731 @override | 731 @override |
732 int read(BufferPointer bp) => bp._getUint8(); | 732 int read(BufferPointer bp) => bp._getUint8(); |
733 } | 733 } |
734 | 734 |
735 /** | 735 /** |
736 * List of booleans backed by 8-bit unsigned integers. | 736 * List of booleans backed by 8-bit unsigned integers. |
737 */ | 737 */ |
738 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> { | 738 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> { |
739 final List<int> uint8List; | 739 final BufferPointer bp; |
740 int _length; | 740 int _length; |
741 | 741 |
742 _FbBoolList(BufferPointer bp) | 742 _FbBoolList(this.bp); |
743 : uint8List = new _FbGenericList<int>(const Uint8Reader(), bp); | |
744 | 743 |
745 @override | 744 @override |
746 int get length { | 745 int get length { |
747 if (_length == null) { | 746 if (_length == null) { |
748 _length = (uint8List.length - 1) * 8 - uint8List.last; | 747 int byteLength = bp._getUint32(); |
| 748 _length = (byteLength - 1) * 8 - _getByte(byteLength - 1); |
749 } | 749 } |
750 return _length; | 750 return _length; |
751 } | 751 } |
752 | 752 |
753 @override | 753 @override |
754 void set length(int i) => | 754 void set length(int i) => |
755 throw new StateError('Attempt to modify immutable list'); | 755 throw new StateError('Attempt to modify immutable list'); |
756 | 756 |
757 @override | 757 @override |
758 bool operator [](int i) { | 758 bool operator [](int i) { |
759 int index = i ~/ 8; | 759 int index = i ~/ 8; |
760 int mask = 1 << i % 8; | 760 int mask = 1 << i % 8; |
761 return uint8List[index] & mask != 0; | 761 return _getByte(index) & mask != 0; |
762 } | 762 } |
763 | 763 |
764 @override | 764 @override |
765 void operator []=(int i, bool e) => | 765 void operator []=(int i, bool e) => |
766 throw new StateError('Attempt to modify immutable list'); | 766 throw new StateError('Attempt to modify immutable list'); |
| 767 |
| 768 int _getByte(int index) => bp._getUint8(4 + index); |
767 } | 769 } |
768 | 770 |
769 /** | 771 /** |
770 * The list backed by 64-bit values - Uint64 length and Float64. | 772 * The list backed by 64-bit values - Uint64 length and Float64. |
771 */ | 773 */ |
772 class _FbFloat64List extends _FbList<double> { | 774 class _FbFloat64List extends _FbList<double> { |
773 List<double> _items; | |
774 | |
775 _FbFloat64List(BufferPointer bp) : super(bp); | 775 _FbFloat64List(BufferPointer bp) : super(bp); |
776 | 776 |
777 @override | 777 @override |
778 double operator [](int i) { | 778 double operator [](int i) { |
779 _items ??= new List<double>(length); | 779 return bp._getFloat64(8 + 8 * i); |
780 double item = _items[i]; | |
781 if (item == null) { | |
782 BufferPointer ref = bp._advance(8 + 8 * i); | |
783 item = ref._getFloat64(); | |
784 _items[i] = item; | |
785 } | |
786 return item; | |
787 } | 780 } |
788 } | 781 } |
789 | 782 |
790 /** | 783 /** |
791 * List backed by a generic object which may have any size. | 784 * List backed by a generic object which may have any size. |
792 */ | 785 */ |
793 class _FbGenericList<E> extends _FbList<E> { | 786 class _FbGenericList<E> extends _FbList<E> { |
794 final Reader<E> elementReader; | 787 final Reader<E> elementReader; |
795 | 788 |
796 List<E> _items; | 789 List<E> _items; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 | 824 |
832 @override | 825 @override |
833 void operator []=(int i, E e) => | 826 void operator []=(int i, E e) => |
834 throw new StateError('Attempt to modify immutable list'); | 827 throw new StateError('Attempt to modify immutable list'); |
835 } | 828 } |
836 | 829 |
837 /** | 830 /** |
838 * List backed by 32-bit unsigned integers. | 831 * List backed by 32-bit unsigned integers. |
839 */ | 832 */ |
840 class _FbUint32List extends _FbList<int> { | 833 class _FbUint32List extends _FbList<int> { |
841 List<int> _items; | |
842 | |
843 _FbUint32List(BufferPointer bp) : super(bp); | 834 _FbUint32List(BufferPointer bp) : super(bp); |
844 | 835 |
845 @override | 836 @override |
846 int operator [](int i) { | 837 int operator [](int i) { |
847 _items ??= new List<int>(length); | 838 return bp._getUint32(4 + 4 * i); |
848 int item = _items[i]; | |
849 if (item == null) { | |
850 item = bp._getUint32(4 + 4 * i); | |
851 _items[i] = item; | |
852 } | |
853 return item; | |
854 } | 839 } |
855 } | 840 } |
856 | 841 |
857 /** | 842 /** |
858 * Class that describes the structure of a table. | 843 * Class that describes the structure of a table. |
859 */ | 844 */ |
860 class _VTable { | 845 class _VTable { |
861 final List<int> fieldTails = <int>[]; | 846 final List<int> fieldTails = <int>[]; |
862 final List<int> fieldOffsets = <int>[]; | 847 final List<int> fieldOffsets = <int>[]; |
863 | 848 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 // Table size. | 906 // Table size. |
922 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); | 907 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); |
923 bufOffset += 2; | 908 bufOffset += 2; |
924 // Field offsets. | 909 // Field offsets. |
925 for (int fieldOffset in fieldOffsets) { | 910 for (int fieldOffset in fieldOffsets) { |
926 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); | 911 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); |
927 bufOffset += 2; | 912 bufOffset += 2; |
928 } | 913 } |
929 } | 914 } |
930 } | 915 } |
OLD | NEW |