Ignore:
Timestamp:
Oct 13, 2007, 11:45:58 AM (17 years ago)
Author:
dai_9181
Message:

インターフェイス実装中…

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r348 r349  
    116116
    117117
    118         //仮想関数(オブジェクトメソッド)
    119         //pObj->func_table->func1
    120         //                ->func2
    121         //                ->func3
    122 
    123         int vtblMasterListIndex, vtblIndex;
    124         pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
    125 
    126         // vtblマスターリストのポインタを取得
    127         //mov r11,qword ptr[rcx]
    128         compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    129 
    130         // vtblのポインタを取得
    131         //mov r11,dword ptr[r11+vtblMasterListIndex]
    132         compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
     118        int vtblIndex;
     119        if( pobj_c->IsInterface() )
     120        {
     121            // インターフェイスメソッド
     122
     123            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
     124
     125            // vtblのポインタを取得
     126            //mov r11,qword ptr[rcx+offset_vtbl]
     127            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8);
     128
     129            int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
     130
     131            // インターフェイスの場合は更に__thisを取得する
     132            //mov rcx,qword ptr[rcx+offset_this]
     133            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8);
     134
     135            int vtblMasterListIndex;
     136            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     137            if( vtblMasterListIndex != 0 )
     138            {
     139                SetError();
     140            }
     141        }
     142        else
     143        {
     144            //仮想関数(オブジェクトメソッド)
     145            // pObj -> vtbl_master_list -> vtbl1 -> func1
     146            //                                   -> func2
     147            //                                   -> func3
     148            //                          -> vtbl2 -> func1
     149            //                                   -> func2
     150            //                                   -> func3
     151
     152            int vtblMasterListIndex;
     153            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     154
     155            // vtblマスターリストのポインタを取得
     156            //mov r11,qword ptr[rcx]
     157            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
     158
     159            // vtblのポインタを取得
     160            //mov r11,dword ptr[r11+vtblMasterListIndex]
     161            compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
     162        }
    133163
    134164        //mov rax,qword ptr[r11+func_index]
Note: See TracChangeset for help on using the changeset viewer.