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

    r348 r349  
    269269
    270270
    271         //仮想関数(オブジェクトメソッド)
    272         //pObj->func_table->func1
    273         //                ->func2
    274         //                ->func3
    275 
    276         int vtblMasterListIndex, vtblIndex;
    277         pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
    278 
    279         // vtblマスターリストのポインタを取得
    280         //mov edx,dword ptr[ecx]
    281         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    282        
    283         // vtblのポインタを取得
    284         //mov edx,dword ptr[edx+vtblMasterListIndex]
    285         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     271        int vtblIndex;
     272        if( pobj_c->IsInterface() )
     273        {
     274            // インターフェイスメソッド呼び出し
     275
     276            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
     277
     278
     279            // vtblのポインタを取得
     280            //mov edx,dword ptr[ecx+offset_vtbl]
     281            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 );
     282
     283            int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
     284
     285
     286
     287            // インターフェイスの場合は更に__thisを取得する
     288            //mov rcx,qword ptr[rcx+offset_this]
     289            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
     290
     291            int vtblMasterListIndex;
     292            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     293            if( vtblMasterListIndex != 0 )
     294            {
     295                SetError();
     296            }
     297        }
     298        else
     299        {
     300            //仮想関数(オブジェクトメソッド)呼び出し
     301            // pObj -> vtbl_master_list -> vtbl1 -> func1
     302            //                                   -> func2
     303            //                                   -> func3
     304            //                          -> vtbl2 -> func1
     305            //                                   -> func2
     306            //                                   -> func3
     307
     308            int vtblMasterListIndex;
     309            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     310
     311            // vtblマスターリストのポインタを取得
     312            //mov edx,dword ptr[ecx]
     313            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
     314           
     315            // vtblのポインタを取得
     316            //mov edx,dword ptr[edx+vtblMasterListIndex]
     317            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     318        }
    286319
    287320        //mov eax,dword ptr[edx+func_index]
Note: See TracChangeset for help on using the changeset viewer.