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_CallProc.cpp

    r348 r349  
    356356
    357357    if( pUserProc->IsVirtual() && !isFixedClass ){
    358         //仮想関数(オブジェクトメソッド)呼び出し
    359         //pObj->func_table->func1
    360         //                ->func2
    361         //                ->func3
    362 
    363         int vtblMasterListIndex, vtblIndex;
    364         pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
    365 
    366         // vtblマスターリストのポインタを取得
    367         //mov r11,qword ptr[rcx]
    368         compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    369 
    370         // vtblのポインタを取得
    371         //mov r11,dword ptr[r11+vtblMasterListIndex]
    372         compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
     358        int vtblIndex;
     359        if( pobj_c->IsInterface() )
     360        {
     361            // インターフェイスメソッド呼び出し
     362
     363            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
     364
     365            // vtblのポインタを取得
     366            //mov r11,qword ptr[rcx+offset_vtbl]
     367            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8);
     368
     369            int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
     370
     371            // インターフェイスの場合は更に__thisを取得する
     372            //mov rcx,qword ptr[rcx+offset_this]
     373            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8);
     374
     375            int vtblMasterListIndex;
     376            pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     377            if( vtblMasterListIndex != 0 )
     378            {
     379                SetError();
     380            }
     381        }
     382        else
     383        {
     384            //仮想関数(オブジェクトメソッド)呼び出し
     385            // pObj -> vtbl_master_list -> vtbl1 -> func1
     386            //                                   -> func2
     387            //                                   -> func3
     388            //                          -> vtbl2 -> func1
     389            //                                   -> func2
     390            //                                   -> func3
     391
     392            int vtblMasterListIndex;
     393            pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     394
     395            // vtblマスターリストのポインタを取得
     396            //mov r11,qword ptr[rcx]
     397            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
     398
     399            // vtblのポインタを取得
     400            //mov r11,dword ptr[r11+vtblMasterListIndex]
     401            compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
     402        }
    373403
    374404        //call qword ptr[r11+func_index]
Note: See TracChangeset for help on using the changeset viewer.