12b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko/*
22b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * Copyright (C) 2013 The Android Open Source Project
32b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko *
42b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
52b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * you may not use this file except in compliance with the License.
62b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * You may obtain a copy of the License at
72b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko *
82b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
92b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko *
102b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * Unless required by applicable law or agreed to in writing, software
112b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
122b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * See the License for the specific language governing permissions and
142b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko * limitations under the License.
152b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko */
162b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
172b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#ifndef ART_RUNTIME_VERIFIER_METHOD_VERIFIER_INL_H_
182b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#define ART_RUNTIME_VERIFIER_METHOD_VERIFIER_INL_H_
192b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
202b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#include "base/logging.h"
212b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#include "method_verifier.h"
222b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#include "mirror/class_loader.h"
232b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#include "mirror/dex_cache.h"
24eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h"
252b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
262b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Markonamespace art {
272b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Markonamespace verifier {
282b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
290f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline const DexFile::CodeItem* MethodVerifier::CodeItem() const {
302b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return code_item_;
312b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
322b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
330f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline RegisterLine* MethodVerifier::GetRegLine(uint32_t dex_pc) {
342b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return reg_table_.GetLine(dex_pc);
352b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
362b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
370f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline const InstructionFlags& MethodVerifier::GetInstructionFlags(size_t index) const {
382b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return insn_flags_[index];
39de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier}
40de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier
41de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartierinline InstructionFlags& MethodVerifier::GetInstructionFlags(size_t index) {
42de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier  return insn_flags_[index];
432b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
442b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
450f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline mirror::ClassLoader* MethodVerifier::GetClassLoader() {
46bf99f77dda749e2b653e8c45259b1fb56e7bb012Mathieu Chartier  return class_loader_.Get();
472b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
482b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
490f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline mirror::DexCache* MethodVerifier::GetDexCache() {
50bf99f77dda749e2b653e8c45259b1fb56e7bb012Mathieu Chartier  return dex_cache_.Get();
512b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
522b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
53be10e8e99a78caae01fb65769218800d465144aeVladimir Markoinline ArtMethod* MethodVerifier::GetMethod() const {
54be10e8e99a78caae01fb65769218800d465144aeVladimir Marko  return mirror_method_;
55be10e8e99a78caae01fb65769218800d465144aeVladimir Marko}
56be10e8e99a78caae01fb65769218800d465144aeVladimir Marko
570f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline MethodReference MethodVerifier::GetMethodReference() const {
582b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return MethodReference(dex_file_, dex_method_idx_);
592b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
602b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
610f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline uint32_t MethodVerifier::GetAccessFlags() const {
622b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return method_access_flags_;
632b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
642b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
650f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline bool MethodVerifier::HasCheckCasts() const {
662b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return has_check_casts_;
672b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
682b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
690f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline bool MethodVerifier::HasVirtualOrInterfaceInvokes() const {
702b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return has_virtual_or_interface_invokes_;
712b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
722b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
730f98205f10b982e3a5fd8c421d6f3332b5e46873Vladimir Markoinline bool MethodVerifier::HasFailures() const {
742b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return !failure_messages_.empty();
752b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
762b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
77d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogersinline const RegType& MethodVerifier::ResolveCheckedClass(uint32_t class_idx) {
782b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  DCHECK(!HasFailures());
79d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers  const RegType& result = ResolveClassAndCheckAccess(class_idx);
802b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  DCHECK(!HasFailures());
812b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko  return result;
822b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}
832b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
842b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}  // namespace verifier
852b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko}  // namespace art
862b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko
872b5eaa2b49f7489bafdadc4b4463ae27e4261817Vladimir Marko#endif  // ART_RUNTIME_VERIFIER_METHOD_VERIFIER_INL_H_
88