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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.