/*
 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
 *
 *  This file is licensed to You under the Common Public License (CPL);
 *  You may not use this file except in compliance with the License. You
 *  may obtain a copy of the License at
 *
 *      http://www.opensource.org/licenses/cpl1.0.php
 *
 *  See the COPYRIGHT.txt file distributed with this work for information
 *  regarding copyright ownership.
 */
package org.mmtk.vm;

import org.vmmagic.pragma.Uninterruptible;

@Uninterruptible public abstract class Assert {
  /**
   * Logs a message and traceback, then exits.
   *
   * @param message the string to log
   */
  public abstract void fail(String message);

  /**
   * Checks that the given condition is true.  If it is not, this
   * method does a traceback and exits.  All calls to this method
   * must be guarded by <code>VM.VERIFY_ASSERTIONS</code>.
   *
   * @param cond the condition to be checked
   */
  public abstract void _assert(boolean cond);

  /**
   * Checks that the given condition is true.  If it is not, this
   * method prints a message, does a traceback and exits. All calls
   * to this method must be guarded by <code>VM.VERIFY_ASSERTIONS</code>.
   *
   * @param cond the condition to be checked
   * @param message the message to print
   */
  public abstract void _assert(boolean cond, String message);

  /**
   * Print a stack trace
   */
  public abstract void dumpStack();

  /**
   * Checks if the virtual machine is running.  This value changes, so
   * the call-through to the VM must be a method.  In Jikes RVM, just
   * returns VM.runningVM.
   *
   * @return <code>true</code> if the virtual machine is running
   */
  public abstract boolean runningVM();

  /*
   * NOTE: The following methods must be implemented by subclasses of this
   * class, but are internal to the VM<->MM interface glue, so are never
   * called by MMTk users.
   */
   /** @return true if assertions should be verified */
  protected abstract boolean getVerifyAssertionsConstant();

  /*
   * NOTE: This method should not be called by anything other than the
   * reflective mechanisms in org.mmtk.vm.VM, and is not implemented by
   * subclasses.
   *
   * This hack exists only to allow us to declare getVerifyAssertions() as
   * a protected method.
   */
  static boolean verifyAssertionsTrapdoor(Assert a) {
    return a.getVerifyAssertionsConstant();
  }
}
