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/BasicCompiler32/Compile_CallProc.cpp

    r348 r349  
    330330        //                ->func3
    331331
    332         int vtblMasterListIndex, vtblIndex;
    333         pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
    334 
    335         // vtblマスターリストのポインタを取得
    336         //mov edx,dword ptr[ecx]
    337         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    338        
    339         // vtblのポインタを取得
    340         //mov edx,dword ptr[edx+vtblMasterListIndex]
    341         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     332        int vtblIndex;
     333        if( pobj_c->IsInterface() )
     334        {
     335            // インターフェイスメソッド呼び出し
     336
     337            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
     338
     339
     340            // vtblのポインタを取得
     341            //mov edx,dword ptr[ecx+offset_vtbl]
     342            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 );
     343
     344            int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
     345
     346
     347
     348            // インターフェイスの場合は更に__thisを取得する
     349            //mov rcx,qword ptr[rcx+offset_this]
     350            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
     351
     352            int vtblMasterListIndex;
     353            pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     354            if( vtblMasterListIndex != 0 )
     355            {
     356                SetError();
     357            }
     358        }
     359        else
     360        {
     361            //仮想関数(オブジェクトメソッド)呼び出し
     362            // pObj -> vtbl_master_list -> vtbl1 -> func1
     363            //                                   -> func2
     364            //                                   -> func3
     365            //                          -> vtbl2 -> func1
     366            //                                   -> func2
     367            //                                   -> func3
     368
     369            int vtblMasterListIndex;
     370            pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     371
     372            // vtblマスターリストのポインタを取得
     373            //mov edx,dword ptr[ecx]
     374            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
     375           
     376            // vtblのポインタを取得
     377            //mov edx,dword ptr[edx+vtblMasterListIndex]
     378            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     379        }
    342380
    343381        //call dword ptr[edx+func_index]
Note: See TracChangeset for help on using the changeset viewer.