Changeset 636 in dev for trunk/ab5.0/abdev/ab_common


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

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

Location:
trunk/ab5.0/abdev/ab_common
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Interface.h

    r603 r636  
    7272    }
    7373
    74     const CClass &GetClass() const{
     74    const CClass &GetClass() const
     75    {
    7576        return *pInterfaceClass;
    7677    }
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Meta.h

    r603 r636  
    6969
    7070    // 静的リンク
    71     void StaticLink( Meta &meta, long dataSectionBaseOffset, int sourceIndexBase );
     71    void StaticLink( Meta &meta, long dataSectionBaseOffset, const std::vector<int> &relationTable );
    7272
    7373    const NamespaceScopesCollection &GetNamespaces() const
  • trunk/ab5.0/abdev/ab_common/include/Lexical/NativeCode.h

    r603 r636  
    125125    int lineNum;
    126126    long nativeCodePos;
    127     int sourceIndex;
     127    int relationalObjectModuleIndex;
    128128    long sourceCodePos;
    129129    DWORD codeType;
     
    138138        ar & BOOST_SERIALIZATION_NVP( lineNum );
    139139        ar & BOOST_SERIALIZATION_NVP( nativeCodePos );
    140         ar & BOOST_SERIALIZATION_NVP( sourceIndex );
     140        ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleIndex );
    141141        ar & BOOST_SERIALIZATION_NVP( sourceCodePos );
    142142        ar & BOOST_SERIALIZATION_NVP( codeType );
     
    144144
    145145public:
    146     SourceLine( int lineNum, int nativeCodePos, int sourceIndex, int sourceCodePos, DWORD codeType )
     146    SourceLine( int lineNum, int nativeCodePos, int relationalObjectModuleIndex, int sourceCodePos, DWORD codeType )
    147147        : lineNum( lineNum )
    148148        , nativeCodePos( nativeCodePos )
    149         , sourceIndex( sourceIndex )
     149        , relationalObjectModuleIndex( relationalObjectModuleIndex )
    150150        , sourceCodePos( sourceCodePos )
    151151        , codeType( codeType )
     
    164164        return nativeCodePos;
    165165    }
    166     int GetSourceIndex() const
    167     {
    168         return sourceIndex;
    169     }
    170     void SetSourceIndex( int sourceIndex )
    171     {
    172         this->sourceIndex = sourceIndex;
     166    int GetRelationalObjectModuleIndex() const
     167    {
     168        return relationalObjectModuleIndex;
     169    }
     170    void SetRelationalObjectModuleIndex( int relationalObjectModuleIndex )
     171    {
     172        this->relationalObjectModuleIndex = relationalObjectModuleIndex;
    173173    }
    174174    long GetSourceCodePos() const
     
    259259
    260260    void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
    261     void ResetSourceIndexes( long sourceIndexBase );
     261    void ResetSourceIndexes( const std::vector<int> &relationTable );
    262262};
  • trunk/ab5.0/abdev/ab_common/include/Lexical/ObjectModule.h

    r632 r636  
    66    // オブジェクトモジュール名
    77    std::string name;
     8
     9    // 関連オブジェクトモジュールの名前リスト
     10    Jenga::Common::Strings relationalObjectModuleNames;
    811
    912    // メタ情報
     
    1821private:
    1922    // ソースコード
    20     int currentSourceIndex;
    21     BasicSources sources;
     23    BasicSource source;
    2224
    2325    // XMLシリアライズ用
     
    3335
    3436        ar & BOOST_SERIALIZATION_NVP( name );
     37        ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleNames );
    3538        ar & BOOST_SERIALIZATION_NVP( meta );
    3639        ar & BOOST_SERIALIZATION_NVP( globalNativeCode );
    3740        ar & BOOST_SERIALIZATION_NVP( dataTable );
    38         ar & BOOST_SERIALIZATION_NVP( currentSourceIndex );
    39         ar & BOOST_SERIALIZATION_NVP( sources );
     41        ar & BOOST_SERIALIZATION_NVP( source );
    4042    }
    4143
     
    5153        this->name = name;
    5254    }
    53     int GetCurrentSourceIndex() const
     55    const BasicSource &GetSource() const
    5456    {
    55         return currentSourceIndex;
     57        return source;
    5658    }
    57     const BasicSource &GetCurrentSource() const
     59    BasicSource &GetSource()
    5860    {
    59         return sources[currentSourceIndex];
     61        return source;
    6062    }
    61     BasicSource &GetCurrentSource()
    62     {
    63         return sources[currentSourceIndex];
    64     }
    65     void SetCurrentSourceIndex( int currentSourceIndex )
    66     {
    67         this->currentSourceIndex = currentSourceIndex;
    68     }
    69     const BasicSource &GetSource( int sourceIndex ) const
    70     {
    71         return sources[sourceIndex];
    72     }
    73     BasicSources &GetSources()
    74     {
    75         return sources;
    76     }
     63
     64    // 下記の関連になるようなテーブルを取得する
     65    // 要素 = 古いインデックス、値 = 新しいインデックス
     66    const std::vector<int> GetRelationTable( const Jenga::Common::Strings &oldRelationalObjectModule );
    7767
    7868    bool Read( const std::string &filePath );
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Source.h

    r632 r636  
    1111    template<class Archive> void serialize(Archive& ar, const unsigned int version)
    1212    {
    13         trace_for_serialize( "serializing - IncludedFilesRelation" );
    14 
    1513        ar & BOOST_SERIALIZATION_NVP( filePaths );
    1614        ar & BOOST_SERIALIZATION_NVP( lineFileNumbers );
     
    119117    template<class Archive> void load(Archive& ar, const unsigned int version)
    120118    {
    121         trace_for_serialize( "serializing(load) - BasicSource" );
    122 
    123119        std::string _buffer;
    124120        ar & BOOST_SERIALIZATION_NVP( _buffer );
     
    139135    template<class Archive> void save(Archive& ar, const unsigned int version) const
    140136    {
    141         trace_for_serialize( "serializing(save) - BasicSource" );
    142 
    143137        // 保存準備
    144138        char *tempCode = (char *)calloc( (length+1) * 3, 1 );
     
    252246    int cannotIncludeSourcePos;
    253247};
    254 typedef std::vector<BasicSource> BasicSources;
     248class BasicSources
     249    : public std::vector<BasicSource>
     250    , public Jenga::Common::BoostSerializationSupport<BasicSources>
     251{
     252    // XMLシリアライズ用
     253private:
     254    virtual const char *RootTagName() const
     255    {
     256        return "basicSources";
     257    }
     258    friend class boost::serialization::access;
     259    template<class Archive> void serialize(Archive& ar, const unsigned int version)
     260    {
     261        ar & boost::serialization::make_nvp("vector_BasicSource", boost::serialization::base_object<std::vector<BasicSource>>(*this));
     262    }
     263};
    255264
    256265class SourceCodePosition
  • 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.