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

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

File:
1 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        }
Note: See TracChangeset for help on using the changeset viewer.