| 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 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 BufferPointer object = ref.derefObject(); | 494 BufferPointer object = ref.derefObject(); |
| 495 int length = object._getUint32(); | 495 int length = object._getUint32(); |
| 496 return UTF8 | 496 return UTF8 |
| 497 .decode(ref._buffer.buffer.asUint8List(object._offset + 4, length)); | 497 .decode(ref._buffer.buffer.asUint8List(object._offset + 4, length)); |
| 498 } | 498 } |
| 499 } | 499 } |
| 500 | 500 |
| 501 /** | 501 /** |
| 502 * An abstract reader for tables. | 502 * An abstract reader for tables. |
| 503 */ | 503 */ |
| 504 abstract class TableReader<T extends TableReader<T>> extends Reader<T> { | 504 abstract class TableReader<T> extends Reader<T> { |
| 505 const TableReader(); | 505 const TableReader(); |
| 506 | 506 |
| 507 @override | 507 @override |
| 508 int get size => 4; | 508 int get size => 4; |
| 509 | 509 |
| 510 /** | 510 /** |
| 511 * Return the [Reader] for reading fields of the object at [bp]. | 511 * Return the object at [bp]. |
| 512 */ | 512 */ |
| 513 T createReader(BufferPointer bp); | 513 T createObject(BufferPointer bp); |
| 514 | 514 |
| 515 @override | 515 @override |
| 516 T read(BufferPointer bp) { | 516 T read(BufferPointer bp) { |
| 517 bp = bp.derefObject(); | 517 bp = bp.derefObject(); |
| 518 return createReader(bp); | 518 return createObject(bp); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 | 521 |
| 522 class _FbList<E> extends Object with ListMixin<E> implements List<E> { | 522 class _FbList<E> extends Object with ListMixin<E> implements List<E> { |
| 523 final Reader<E> elementReader; | 523 final Reader<E> elementReader; |
| 524 final BufferPointer bp; | 524 final BufferPointer bp; |
| 525 List<E> cache; |
| 525 | 526 |
| 526 _FbList(this.elementReader, this.bp); | 527 _FbList(this.elementReader, this.bp); |
| 527 | 528 |
| 528 @override | 529 @override |
| 529 int get length => bp._getUint32(); | 530 int get length => bp._getUint32(); |
| 530 | 531 |
| 531 @override | 532 @override |
| 532 void set length(int i) => | 533 void set length(int i) => |
| 533 throw new StateError('Attempt to modify immutable list'); | 534 throw new StateError('Attempt to modify immutable list'); |
| 534 | 535 |
| 535 @override | 536 @override |
| 536 E operator [](int i) { | 537 E operator [](int i) { |
| 537 BufferPointer ref = bp._advance(4 + elementReader.size * i); | 538 cache ??= new List<E>(length); |
| 538 return elementReader.read(ref); | 539 E item = cache[i]; |
| 540 if (item == null) { |
| 541 BufferPointer ref = bp._advance(4 + elementReader.size * i); |
| 542 item = elementReader.read(ref); |
| 543 cache[i] = item; |
| 544 } |
| 545 return item; |
| 539 } | 546 } |
| 540 | 547 |
| 541 @override | 548 @override |
| 542 void operator []=(int i, E e) => | 549 void operator []=(int i, E e) => |
| 543 throw new StateError('Attempt to modify immutable list'); | 550 throw new StateError('Attempt to modify immutable list'); |
| 544 } | 551 } |
| 545 | 552 |
| 546 /** | 553 /** |
| 547 * Class that describes the structure of a table. | 554 * Class that describes the structure of a table. |
| 548 */ | 555 */ |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 // Table size. | 617 // Table size. |
| 611 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); | 618 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); |
| 612 bufOffset += 2; | 619 bufOffset += 2; |
| 613 // Field offsets. | 620 // Field offsets. |
| 614 for (int fieldOffset in fieldOffsets) { | 621 for (int fieldOffset in fieldOffsets) { |
| 615 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); | 622 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); |
| 616 bufOffset += 2; | 623 bufOffset += 2; |
| 617 } | 624 } |
| 618 } | 625 } |
| 619 } | 626 } |
| OLD | NEW |