Ignore:
Timestamp:
Jun 10, 2008, 11:40:17 PM (16 years ago)
Author:
dai_9181
Message:

libファイルを跨ったテンプレート展開に対応。

Location:
trunk/ab5.0/abdev/ab_common/src/Lexical
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp

    r632 r636  
    677677    }
    678678
     679    _ASSERT( false );
    679680    throw;
    680681}
     
    693694    }
    694695
     696    _ASSERT( false );
    695697    throw;
    696698}
     
    699701    if( vtblMasterListOffset == -1 )
    700702    {
     703        _ASSERT( false );
    701704        throw;
    702705    }
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp

    r632 r636  
    3434}
    3535
    36 void Meta::StaticLink( Meta &meta, long dataSectionBaseOffset, int sourceIndexBase )
     36void Meta::StaticLink( Meta &meta, long dataSectionBaseOffset, const std::vector<int> &relationTable )
    3737{
    3838    // 名前空間
     
    5353
    5454        pUserProc->GetNativeCode().ResetDataSectionBaseOffset( dataSectionBaseOffset );
    55         pUserProc->GetNativeCode().ResetSourceIndexes( sourceIndexBase );
     55        pUserProc->GetNativeCode().ResetSourceIndexes( relationTable );
    5656
    5757        this->userProcs.Put( pUserProc );
     
    7575        CClass *pClass = meta.GetClasses().Iterator_GetNext();
    7676        pClass->isTargetObjectModule = false;
     77        pClass->Readed();
    7778        this->GetClasses().Put( pClass );
    7879    }
  • trunk/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp

    r603 r636  
    4545                sourceLine.GetLineNum(),
    4646                baseOffset + sourceLine.GetNativeCodePos(),
    47                 sourceLine.GetSourceIndex(),
     47                sourceLine.GetRelationalObjectModuleIndex(),    // TODO: 複数libの取り込みを想定できていない(ソースコード行番号とネイティブコード位置の対応情報の追加は静的リンクが完了した後に行うべき)
    4848                sourceLine.GetSourceCodePos(),
    4949                sourceLine.GetCodeType()
     
    152152    }
    153153}
    154 void NativeCode::ResetSourceIndexes( long sourceIndexBase )
     154void NativeCode::ResetSourceIndexes( const std::vector<int> &relationTable )
    155155{
    156156    BOOST_FOREACH( SourceLine &sourceLine, sourceLines )
    157157    {
    158         sourceLine.SetSourceIndex( sourceLine.GetSourceIndex() + sourceIndexBase );
     158        sourceLine.SetRelationalObjectModuleIndex( relationTable[sourceLine.GetRelationalObjectModuleIndex()] );
    159159    }
    160160}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp

    r603 r636  
    5858void ObjectModule::StaticLink( ObjectModule &objectModule )
    5959{
     60    const std::vector<int> relationTable = this->GetRelationTable( objectModule.relationalObjectModuleNames );
     61
    6062    long dataSectionBaseOffset = dataTable.GetSize();
    61     int sourceIndexBase = (int)sources.size();
    6263
    6364    // メタ情報を結合
    64     meta.StaticLink( objectModule.meta, dataSectionBaseOffset, sourceIndexBase );
     65    meta.StaticLink( objectModule.meta, dataSectionBaseOffset, relationTable );
    6566
    6667    // グローバル ネイティブコードを結合
    6768    objectModule.globalNativeCode.ResetDataSectionBaseOffset( dataSectionBaseOffset );
    68     objectModule.globalNativeCode.ResetSourceIndexes( sourceIndexBase );
     69    objectModule.globalNativeCode.ResetSourceIndexes( relationTable );
    6970    globalNativeCode.PutEx( objectModule.globalNativeCode );
    7071
     
    7374    dataTable.Add( objectModule.dataTable );
    7475
    75     // ソースコードを結合
    76     BOOST_FOREACH( const BasicSource &source, objectModule.sources )
    77     {
    78         this->sources.push_back( source );
    79     }
    80 
    8176    // TODO: basbufがいらなくなったら消す
    8277    extern char *basbuf;
    83     basbuf = this->sources[0].GetBuffer();
     78    basbuf = this->source.GetBuffer();
     79}
     80
     81const std::vector<int> ObjectModule::GetRelationTable( const Jenga::Common::Strings &oldRelationalObjectModuleNames )
     82{
     83    // 要素 = 古いインデックス、値 = 新しいインデックス
     84    std::vector<int> relationTable;
     85
     86    // リレーションテーブルを構築
     87    BOOST_FOREACH( const std::string &oldRelationalObjectModuleName, oldRelationalObjectModuleNames )
     88    {
     89        bool isMatch = false;
     90        for( int i=0; i<static_cast<int>(this->relationalObjectModuleNames.size()); i++ )
     91        {
     92            if( oldRelationalObjectModuleName == this->relationalObjectModuleNames[i] )
     93            {
     94                isMatch = true;
     95                relationTable.push_back( i );
     96                break;
     97            }
     98        }
     99
     100        if( !isMatch )
     101        {
     102            // エラー
     103            _ASSERT( false );
     104        }
     105    }
     106
     107    return relationTable;
    84108}
    85109
Note: See TracChangeset for help on using the changeset viewer.