view Bison-Flex/Compiler-StackBase/UTF8/vm.cpp @ 5:caede627f691

chage encoding
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 17 May 2011 12:45:07 +0900
parents 805d39d28230
children
line wrap: on
line source

//
// 仮想CPU
//
//	switch-caseでの実装例
//
//		(c)2008 Chihiro.SAKAMOTO HyperWorks
//
#include <exception>
#include "vm.h"

// 実行
int vm::vcpu::run()
{
	command_ = data_.command_;						// プログラム格納位置
	text_buffer_ = data_.text_buffer_;				// テキストデータ格納位置
	command_size_ = data_.command_size_;			// プログラムの大きさ
	text_size_ = data_.text_size_;					// データの大きさ

	global_value.resize(data_.value_size_);			// 外部変数テーブル確保
	command_ptr_ = command_ + data_.entry_point_;	// プログラムカウンター初期化

	// mainをcall
	push(0);										// mainへの引数カウントをpush
	push(0);										// stack_baseの初期値をpush
	push(0);										// プログラム終了位置をpush
	stack_base = stack.size();						// スタック参照位置初期化

	try {
		int op;
		while ((op = *command_ptr_++) != VM_HALT) {	// Haltするまでループ
			switch (op) {
				#define	VM_SWITCHTABLE
				#include "vm_code.h"
				#undef	VM_SWITCHTABLE
			}
		}
	}
	catch (const std::exception &e) {
		std::cerr << "例外発生(" << e.what() << ")" << std::endl;
		return -1;
	}
	return top().i_;								// main関数戻り値
}