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)