[1364] Re:配列の実装について
    
    投稿者:山
    2009/06/17 20:17:37
    
    
     配列の組み込みにより、バイトコードもまた変わりました、下記に。
S_OpcodeInfo D_opcode_info[] = {
    {"dummy",             "", 0},
    {"push_int_1byte",    "b",16},
    {"push_int_2byte",    "s",16},
    {"push_int_4byte",    "i",16},    // 実際の値を持つ
    {"push_double_0",     "", 16},
    {"push_double_1",     "", 16},
    {"push_double_8byte", "d",16},    // 実際の値を持つ
    {"push_string_const", "s",40},    // 文字列の位置NOを持つ0~
    {"push_null",         "", 16},
    /**********/
    {"push_stack_array",  "s", 16},    // 配列情報をスタックに
    {"push_stack_int",    "s", 16},    // intローカル変数をi
    {"push_stack_double", "s", 16},    // 
    {"push_stack_string", "s", 40},    // 
    {"pop_stack_int",     "s", -16},   // スタックのintをローカル変数に
    {"pop_stack_double",  "s", -16},   // 
    {"pop_stack_string",  "s", -40},   // 
    /**********/
    {"push_static_array", "s", 16},    // 配列情報をスタックに 予約
    {"push_static_int",   "s", 16},    // int静的変数をスタックに 予約
    {"push_static_double","s", 16},    // 
    {"push_static_string","s", 40},    // 
    {"pop_static_int",    "s", -16},   // スタックのintを静的変数に 予約
    {"pop_static_double", "s", -16},   // 
    {"pop_static_string", "s", -40},   // 
    /**********/
    {"push_sysval_array", "i", 16},    // 配列情報をスタックに
    {"push_sysval_int",   "i", 16},    // システムグローバル変数をスタックに
    {"push_sysval_double","i", 16},    //
    {"push_sysval_str",   "i", 40},    //
    {"pop_sysval_int",    "i", -16},   // スタックからシステムグローバル変数に
    {"pop_sysval_double", "i", -16},   //
    {"pop_sysval_str",    "i", -40},   //
    /**********/
    {"push_array_int",    "", -1},    // int配列処理
    {"push_array_double", "", -1},    //
    {"push_array_string", "", -1},    //
    {"pop_array_int",     "", -1},    // スタックからint配列に
    {"pop_array_double",  "", -1},    //
    {"pop_array_string",  "", -1},    //
    /**********/
    {"add_int",      "", -16},    //    以下は総て算術演算子
    {"add_double",   "", -16},
    {"add_string",   "", -40},
    {"sub_int",      "", -16},
    {"sub_double",   "", -16},
    {"mul_int",      "", -16},
    {"mul_double",   "", -16},
    {"div_int",      "", -16},
    {"div_double",   "", -16},
    {"mod_int",      "", -16},
    {"mod_double",   "", -16},
    {"minus_int",    "", 0},
    {"minus_double", "", 0},
    {"increment",    "", 0},
    {"decrement",    "", 0},        // ここまで算術演算子
    {"cast_int_to_double",      "",  0},    // 以下はキャスト処理
    {"cast_double_to_int",      "", -0},
    {"cast_boolean_to_string",  "", 24},
    {"cast_int_to_string",      "", 24},
    {"cast_double_to_string",   "", 24},    // ここまでキャスト処理
    {"eq_int",       "", -16},    // 以下は総て論理演算子
    {"eq_double",    "", -16},
    {"eq_string",    "", -40},
    {"gt_int",       "", -16},
    {"gt_double",    "", -16},
    {"gt_string",    "", -40},
    {"ge_int",       "", -16},
    {"ge_double",    "", -16},
    {"ge_string",    "", -40},
    {"lt_int",       "", -16},
    {"lt_double",    "", -16},
    {"lt_string",    "", -40},
    {"le_int",       "", -16},
    {"le_double",    "", -16},
    {"le_string",    "", -40},
    {"ne_int",       "", -16},
    {"ne_double",    "", -16},
    {"ne_string",    "", -40},    // ここまで論理演算子
    {"logical_and",  "", -16},    // 
    {"logical_or",   "", -16},   // 
    {"logical_not",  "", 0},      // 
    {"pop",          "", -1},     // スタックを1つ減らす
    {"duplicate",    "", 16},     // スタック内容をコピーしてスタックに
    {"jump",         "s", 0},     // 指定ポインターにjump
    {"jump_if_true", "s", -16},   // スタックがtrueならjump
    {"jump_if_false","s", -16},   // スタックがfalseならjump
    /**********/
    {"push_function",    "", 0},    // 関数情報をスタック、未使用
    {"call_function","ssss", 1},    // 関数コール
    {"return",          "", -1},    // 関数戻り
    /**********/
    {"set_array_literal_int",   "ss", 0}, // int定数配列を変数にコピー
    {"set_array_literal_double","ss", 0}, // double定数配列を変数にコピー
    {"set_array_literal_string","ss", 0}, // string定数配列を変数にコピー
};