[1351] その後のVM
投稿者:山
2009/06/11 22:03:54
ようやく下記のようなプログラムがVMで実行可能になりました。可変長
パラメータ用の書式は作らず、一部の組込み関数のみ可能にしました。
言語としての美しさは…、スタック情報も大きく変わり、VMはほとんど別の
ものになりつつあります。VMの完成にはまだまだです。printfはCのprintf
と同等ですが、中身はエミュレートを被せてオーバラン等の危険は一切
ありません。
----------------------------------
int printf(string str);
string sprintf(string str);
int print(string str);
int main()
{
string str;
printf("printf P1 = %d P2 = %d P3 = %d\n",12,20,30);
str = sprintf("sprintf P1 = %d\n",13);
print(str);
print("---------- test ---------\n");
}
----------------------------------
前に出した、組込み関数とのインターフェースは大幅に変更となり。
下記のようになっています。
//== スタック上の組込み関数データ ===================================
struct NFstartDat {
ushort vtype; // データタイプ E_StackDType
ushort size; // スタック消費サイズ
ushort m_vmid; // VMID = スレッドID
ushort m_prm_inno; // 引き渡されたパラメータ数
void *m_sdatp; // スレッド別データ用ポインター
S_Value *m_prmp[PRMMAX]; // 引き渡されたパラメータ
S_Value m_return; // 関数からの戻り値データ
};
//===================================================================
// 組み込み関数用定義
//===================================================================
class C_NFBase
{
protected:
//-- VMから受け取る情報 ----------------
int m_fid; // 関数ID
//-- VMに送る情報 ----------------------
char *m_name; // 関数名
int m_prmno; // 要求するパラメータ数0-10まで20は可変関数
ES_ValueType m_type[PRMMAX]; // 要求するパラメータの型
ES_ValueType m_return_type; // リターン変数タイプ
public:
C_NFBase()
{
this->m_name = NULL;
this->m_prmno = 0;
for(int i=0;i<PRMMAX;i++) {
this->m_type[i] = ES_NON;
}
//-----------------------
this->m_fid = 0;
this->m_return_type = ES_INT;
}
virtual ~C_NFBase() { }
virtual void * VMstart() { } // VM起動時実行
virtual void VMend() { } // VM終了時実行
virtual void funcexe(NFstartDat *nfd) { } // 関数起動メソッド
inline char ** getname() { return &this->m_name; }
inline int getprmno() { return this->m_prmno; }
inline ES_ValueType getprmtype(int no) { return this->m_type[no]; }
inline void setfid(int fid) { this->m_fid = fid; }
inline ES_ValueType getrtntype() { return this->m_return_type; }
};