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/BasicCompiler_Common/src/Class.cpp

    r276 r282  
    720720    return vtbl_offset;
    721721}
     722void CClass::GenerateVTables()
     723{
     724    if( IsAbstract() )
     725    {
     726        // 抽象クラスは無視
     727        return;
     728    }
     729    if( !IsUsing() )
     730    {
     731        // 使われていないクラスは無視
     732        return;
     733    }
     734
     735    const UserProc **ppsi;
     736    ppsi=(const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *));
     737
     738    //関数テーブルに値をセット
     739    int i2 = 0;
     740    BOOST_FOREACH( const CMethod *pMethod, methods ){
     741        if(pMethod->IsVirtual()){
     742            if( !pMethod->GetUserProc().IsUsing() )
     743            {
     744                ts((char *)pMethod->GetUserProc().GetFullName().c_str());
     745            }
     746            pMethod->GetUserProc().Using();
     747
     748            if(pMethod->IsAbstract()){
     749                extern int cp;
     750                SmoothieException::Throw(300,NULL,cp);
     751
     752                ppsi[i2]=0;
     753            }
     754            else{
     755                ppsi[i2]=&pMethod->GetUserProc();
     756            }
     757            i2++;
     758        }
     759    }
     760
     761    vtbl_offset=compiler.GetObjectModule().dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR));
     762
     763    for( int i=0; i < GetVtblNum(); i++ ){
     764        pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR));
     765    }
     766
     767    free(ppsi);
     768}
    722769void CClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
     770    if( IsAbstract() )
     771    {
     772        // 抽象クラスは無視
     773        return;
     774    }
     775    if( !IsUsing() )
     776    {
     777        // 使われていないクラスは無視
     778        return;
     779    }
    723780    if(vtbl_offset==-1) return;
    724781
     
    731788        pUserProc=(UserProc *)pVtbl[i];
    732789        if(!pUserProc) continue;
     790
     791        if( pUserProc->GetBeginOpAddress() == 0
     792            && pUserProc->GetEndOpAddress() == 0 )
     793        {
     794            Jenga::Throw( "未解決の仮想関数が存在する" );
     795        }
    733796
    734797        pVtbl[i]=pUserProc->GetBeginOpAddress()+ImageBase+MemPos_CodeSection;
     
    908971                }
    909972        }
     973    }
     974}
     975
     976void Classes::GenerateVTables()
     977{
     978    Iterator_Reset();
     979    while( Iterator_HasNext() )
     980    {
     981        CClass *pClass = Iterator_GetNext();
     982        pClass->GenerateVTables();
    910983    }
    911984}
     
    16151688        pParentClass->Using();
    16161689
     1690        // 仮想関数になるメソッドに使用チェックをつける
     1691        BOOST_FOREACH( const CMethod *pMethod, pParentClass->GetMethods() )
     1692        {
     1693            if( pMethod->IsVirtual() )
     1694            {
     1695                pMethod->GetUserProc().Using();
     1696            }
     1697        }
     1698
    16171699        pCompilingMethod = pParentClass->GetMethods().GetMethodPtr( pUserProc );
    16181700        if( !pCompilingMethod ){
Note: See TracChangeset for help on using the changeset viewer.