Changeset 282 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Aug 14, 2007, 11:57:32 PM (17 years ago)
Author:
dai_9181
Message:

vtbl構築をコード生成後(最終リンクの前)に行うようにした

Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r278 r282  
    499499            //仮想関数テーブルを初期化
    500500            if( compiler.pCompilingClass->IsExistVirtualFunctions()
    501                 && !compiler.pCompilingClass->IsAbstract() ){
    502                     //関数テーブルに値をセット
    503                     int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
    504 
    505                     //mov eax,offset
    506                     compiler.codeGenerator.op_mov_RV( REG_EAX, offset, Schedule::DataTable );
    507 
    508                     //Thisポインタをecxにコピー
    509                     SetThisPtrToReg(REG_ECX);
    510 
    511                     //mov dword ptr[ecx],eax
    512                     compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ECX, 0, MOD_BASE );
     501                && !compiler.pCompilingClass->IsAbstract() )
     502            {
     503                // mov eax,vtblAddress
     504                compiler.codeGenerator.op_mov_RV_vtbl( REG_EAX, compiler.pCompilingClass );
     505
     506                /* TODO: 消す
     507                //関数テーブルに値をセット
     508                int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
     509
     510                //mov eax,offset
     511                compiler.codeGenerator.op_mov_RV( REG_EAX, offset, Schedule::DataTable );
     512                */
     513
     514                //Thisポインタをecxにコピー
     515                SetThisPtrToReg(REG_ECX);
     516
     517                //mov dword ptr[ecx],eax
     518                compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ECX, 0, MOD_BASE );
     519
     520
     521                // 仮想関数になるメソッドに使用チェックをつける
     522                BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )
     523                {
     524                    if( pMethod->IsVirtual() )
     525                    {
     526                        pMethod->GetUserProc().Using();
     527                    }
     528                }
    513529            }
    514530        }
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r281 r282  
    509509
    510510
     511    /////////////////////////////////////////////////////////////////
     512    // vtblの構築
     513    /////////////////////////////////////////////////////////////////
     514
     515    compiler.GetObjectModule().meta.GetClasses().GenerateVTables();
     516
     517
    511518
    512519    ////////////////////////////////
    513520    // ここで一旦ログを取る
    514521    ////////////////////////////////
     522
    515523    Diagnose();
    516524
     
    10651073    compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
    10661074    compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
     1075    compiler.linker.ResolveVtblSchedule( MemPos_DataSection );
    10671076
    10681077
  • trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp

    r253 r282  
    13111311    pNativeCode->PutUserProcSchedule( pUserProc, false );
    13121312}
     1313void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
     1314{
     1315    // mov reg,vtblAddress
     1316
     1317    //オペコード、レジスタ
     1318    pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
     1319
     1320    //DISP32
     1321    pNativeCode->PutVtblSchedule( pClass );
     1322}
Note: See TracChangeset for help on using the changeset viewer.