dex_file-inl.h revision a2806550cefb7c70781d8ee6279e6ad5769804cb
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * you may not use this file except in compliance with the License. 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * You may obtain a copy of the License at 7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * 8a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * See the License for the specific language governing permissions and 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * limitations under the License. 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 16a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef ART_RUNTIME_DEX_FILE_INL_H_ 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define ART_RUNTIME_DEX_FILE_INL_H_ 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/logging.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/stringpiece.h" 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "dex_file.h" 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "leb128.h" 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "utils.h" 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace art { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DexFile::GetStringLength(const StringId& string_id) const { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const byte* ptr = begin_ + string_id.string_data_off_; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return DecodeUnsignedLeb128(&ptr); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const char* DexFile::GetStringDataAndUtf16Length(const StringId& string_id, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* utf16_length) const { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(utf16_length != NULL) << GetLocation(); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const byte* ptr = begin_ + string_id.string_data_off_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *utf16_length = DecodeUnsignedLeb128(&ptr); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<const char*>(ptr); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const Signature DexFile::GetMethodSignature(const MethodId& method_id) const { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Signature(this, GetProtoId(method_id.proto_idx_)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const DexFile::TryItem* DexFile::GetTryItems(const CodeItem& code_item, uint32_t offset) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint16_t* insns_end_ = &code_item.insns_[code_item.insns_size_in_code_units_]; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<const TryItem*> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (RoundUp(reinterpret_cast<uintptr_t>(insns_end_), 4)) + offset; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool DexFileStringEquals(const DexFile* df1, uint32_t sidx1, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile* df2, uint32_t sidx2) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t s1_len; // Note: utf16 length != mutf8 length. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* s1_data = df1->StringDataAndUtf16LengthByIdx(sidx1, &s1_len); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t s2_len; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* s2_data = df2->StringDataAndUtf16LengthByIdx(sidx2, &s2_len); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (s1_len == s2_len) && (strcmp(s1_data, s2_data) == 0); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool Signature::operator==(const Signature& rhs) const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dex_file_ == nullptr) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rhs.dex_file_ == nullptr; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rhs.dex_file_ == nullptr) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dex_file_ == rhs.dex_file_) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return proto_id_ == rhs.proto_id_; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t lhs_shorty_len; // For a shorty utf16 length == mutf8 length. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* lhs_shorty_data = dex_file_->StringDataAndUtf16LengthByIdx(proto_id_->shorty_idx_, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &lhs_shorty_len); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringPiece lhs_shorty(lhs_shorty_data, lhs_shorty_len); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t rhs_shorty_len; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* rhs_shorty_data = 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rhs.dex_file_->StringDataAndUtf16LengthByIdx(rhs.proto_id_->shorty_idx_, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &rhs_shorty_len); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringPiece rhs_shorty(rhs_shorty_data, rhs_shorty_len); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_shorty != rhs_shorty) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Shorty mismatch. 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_shorty[0] == 'L') { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeId& return_type_id = dex_file_->GetTypeId(proto_id_->return_type_idx_); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeId& rhs_return_type_id = 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rhs.dex_file_->GetTypeId(rhs.proto_id_->return_type_idx_); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DexFileStringEquals(dex_file_, return_type_id.descriptor_idx_, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rhs.dex_file_, rhs_return_type_id.descriptor_idx_)) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Return type mismatch. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_shorty.find('L', 1) != StringPiece::npos) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeList* params = dex_file_->GetProtoParameters(*proto_id_); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeList* rhs_params = rhs.dex_file_->GetProtoParameters(*rhs.proto_id_); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both lists are empty or have contents, or else shorty is broken. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(params == nullptr, rhs_params == nullptr); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params != nullptr) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t params_size = params->Size(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(params_size, rhs_params->Size()); // Parameter list size must match. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < params_size; ++i) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeId& param_id = dex_file_->GetTypeId(params->GetTypeItem(i).type_idx_); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DexFile::TypeId& rhs_param_id = 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rhs.dex_file_->GetTypeId(rhs_params->GetTypeItem(i).type_idx_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DexFileStringEquals(dex_file_, param_id.descriptor_idx_, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rhs.dex_file_, rhs_param_id.descriptor_idx_)) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Parameter type mismatch. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace art 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // ART_RUNTIME_DEX_FILE_INL_H_ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)