/* instruction.h
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of Mysaifu JVM

Mysaifu JVM is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

Mysaifu JVM is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
*/

#ifndef INSTRUCTION_H_INCLUDED
#define INSTRUCTION_H_INCLUDED

#include "java_object.h"
#include "frame.h"

/**
 * instruction関連の情報を初期化する
 */
void init_instruction_settings();

/**
 * OutOfMemoryErrorのインスタンスを準備する
 */
bool prepare_OutOfMemoryError();

/**
 * StackOverflowErrorのインスタンスを準備する
 */
bool prepare_StackOverflowError();

/**
 * 指定されたメソッドを実行する
 *
 * @param	caller_frame	呼び出し側のフレーム。
 * @param	ref				オブジェクトの参照。
 *                          インスタンスメソッドの場合はインスタンスの参照を、
 *                           staticメソッドの場合はクラスオブジェクトをそれぞれ指定する。
 * @param	declaring_class_file		該当メソッドを定義しているClassFile構造体
 * @param	minfo			呼び出し対象メソッド
 */
void invoke_method(frame* caller_frame,
				   jobject ref,
				   ClassFile* declaring_file,
				   method_info* minfo);

/**
 * 「ルート」スタックフレーム数を返す
 */
unsigned int get_root_frames_count();

/**
 * 「ルート」スタックフレームへのポインタを、指定された配列にコピーする
 */
void get_root_frames(frame** buff, unsigned int bufflen);

/**
 * 指定されたオブジェクトが、指定されたクラスのインスタンスであるかを調べる
 *
 * @param	obj	オブジェクトへの参照
 * @param	クラスの名前
 */
bool is_assignable_from(frame* current_frame, ClassFile* s, ClassFile* t);

/**
 * 指定されたUTF-8文字列の内容を保持するStringオブジェクトを作成する
 * 作成したStringオブジェクトの参照は、引数 frame で指定されたスタックフレームに
 * pushされる。
 *
 * @param	frame	スタックフレーム。作成したStringの参照がpushされる。
 * @param	utf8	UTF-8文字列
 */
jstring new_utf8_string(frame* current_frame, java_utf8* utf8);
jstring permanent_utf8_string(frame* current_frame, const java_utf8* utf8);



/**
 * 指定された例外クラスをthrowされた状態にする。
 * 指定されたクラスが java.lang.Throwable の派生クラスであるかはチェックしないため、
 * 呼び出しもとの責任になる。
 *
 * @param	current_frame	カレントフレーム
 * @param	cfile			クラスファイル
 * @param	message			メッセージ
 * @return	処理が成功した場合true。
 */
bool throw_exception(frame* current_frame, const char* classname, const char* message);
bool throw_exception_int(frame* current_frame, const char* classname, jint param);
bool throw_exception(frame* current_frame, ClassFile* cfile, const char* message);
bool throw_exception_int(frame* current_frame, ClassFile* cfile, jint param);
bool throw_exception(frame* current_frame, const char* classname);
bool throw_exception(frame* current_frame, jthrowable t);

/**
 * OutOfMemoryErrorをthrowする
 * メモリ不足が発生した時点では新たにインスタンスを生成することが困難であるため、
 * あらかじめ生成しておいたOutOfMemoryErrorのインスタンスを使用する
 */
bool throw_OutOfMemoryError(frame* current_frame);

bool throw_StackOverflowError(frame* current_frame);

jthrowable exception_occurred(frame* current_frame);
void exception_clear(frame* current_frame);


#endif
