| 739 | } |
| 740 | |
| 741 | void EncodedArrayValueIterator::Next() { |
| 742 | pos_++; |
| 743 | if (pos_ >= array_size_) { |
| 744 | return; |
| 745 | } |
| 746 | uint8_t value_type = *ptr_++; |
| 747 | uint8_t value_arg = value_type >> kEncodedValueArgShift; |
| 748 | size_t width = value_arg + 1; // assume and correct later |
| 749 | type_ = static_cast<ValueType>(value_type & kEncodedValueTypeMask); |
| 750 | switch (type_) { |
| 751 | case kBoolean: |
| 752 | jval_.i = (value_arg != 0) ? 1 : 0; |
| 753 | width = 0; |
| 754 | break; |
| 755 | case kByte: |
| 756 | jval_.i = DexFile::ReadSignedInt(ptr_, value_arg); |
| 757 | CHECK(IsInt<8>(jval_.i)); |
| 758 | break; |
| 759 | case kShort: |
| 760 | jval_.i = DexFile::ReadSignedInt(ptr_, value_arg); |
| 761 | CHECK(IsInt<16>(jval_.i)); |
| 762 | break; |
| 763 | case kChar: |
| 764 | jval_.i = DexFile::ReadUnsignedInt(ptr_, value_arg, false); |
| 765 | CHECK(IsUint<16>(jval_.i)); |
| 766 | break; |
| 767 | case kInt: |
| 768 | jval_.i = DexFile::ReadSignedInt(ptr_, value_arg); |
| 769 | break; |
| 770 | case kLong: |
| 771 | jval_.j = DexFile::ReadSignedLong(ptr_, value_arg); |
| 772 | break; |
| 773 | case kFloat: |
| 774 | jval_.i = DexFile::ReadUnsignedInt(ptr_, value_arg, true); |
| 775 | break; |
| 776 | case kDouble: |
| 777 | jval_.j = DexFile::ReadUnsignedLong(ptr_, value_arg, true); |
| 778 | break; |
| 779 | case kString: |
| 780 | case kType: |
| 781 | case kMethodType: |
| 782 | case kMethodHandle: |
| 783 | jval_.i = DexFile::ReadUnsignedInt(ptr_, value_arg, false); |
| 784 | break; |
| 785 | case kField: |
| 786 | case kMethod: |
| 787 | case kEnum: |
| 788 | case kArray: |
| 789 | case kAnnotation: |
| 790 | UNIMPLEMENTED(FATAL) << ": type " << type_; |
| 791 | UNREACHABLE(); |
| 792 | case kNull: |
| 793 | jval_.l = nullptr; |
| 794 | width = 0; |
| 795 | break; |
| 796 | default: |
| 797 | LOG(FATAL) << "Unreached"; |
| 798 | UNREACHABLE(); |
no outgoing calls
no test coverage detected