/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_RUNTIME_VERIFY_OBJECT_H_
#define ART_RUNTIME_VERIFY_OBJECT_H_

#include <stdint.h>

#include "base/macros.h"
#include "obj_ptr.h"

namespace art {

namespace mirror {
class Class;
class Object;
}  // namespace mirror

// How we want to sanity check the heap's correctness.
enum VerifyObjectMode {
  kVerifyObjectModeDisabled,  // Heap verification is disabled.
  kVerifyObjectModeFast,  // Sanity heap accesses quickly by using VerifyClassClass.
  kVerifyObjectModeAll  // Sanity heap accesses thoroughly.
};

enum VerifyObjectFlags {
  kVerifyNone = 0x0,
  // Verify self when we are doing an operation.
  kVerifyThis = 0x1,
  // Verify reads from objects.
  kVerifyReads = 0x2,
  // Verify writes to objects.
  kVerifyWrites = 0x4,
  // Verify all things.
  kVerifyAll = kVerifyThis | kVerifyReads | kVerifyWrites,
};

static constexpr VerifyObjectFlags kDefaultVerifyFlags = kVerifyNone;
static constexpr VerifyObjectMode kVerifyObjectSupport =
    kDefaultVerifyFlags != 0 ? kVerifyObjectModeFast : kVerifyObjectModeDisabled;

// Implements the actual object checks.
void VerifyObjectImpl(ObjPtr<mirror::Object> obj) NO_THREAD_SAFETY_ANALYSIS;

// Is a front to optimize out any calls if no verification is enabled.
ALWAYS_INLINE
static inline void VerifyObject(ObjPtr<mirror::Object> obj) NO_THREAD_SAFETY_ANALYSIS {
  if (kVerifyObjectSupport > kVerifyObjectModeDisabled && obj != nullptr) {
    VerifyObjectImpl(obj);
  }
}

// Check that c.getClass() == c.getClass().getClass().
ALWAYS_INLINE bool VerifyClassClass(ObjPtr<mirror::Class> c) NO_THREAD_SAFETY_ANALYSIS;

}  // namespace art

#endif  // ART_RUNTIME_VERIFY_OBJECT_H_
