Changeset 637 in dev for trunk/ab5.0/abdev/ab_common/src


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

リンカの依存関係解決モジュールを製作中

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

Legend:

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

    r517 r637  
    22
    33std::string ActiveBasic::Common::Environment::rootPath;
     4bool ActiveBasic::Common::Environment::isRemoveExternal = false;
    45
    56using namespace ActiveBasic::Common;
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp

    r636 r637  
    22
    33
    4 CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name )
    5     : ClassPrototype( namespaceScopes, name )
     4CClass::CClass( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces )
     5    : ClassPrototype( symbol )
    66    , importedNamespaces( importedNamespaces )
    77    , classType( Class )
     
    2121}
    2222
    23 CClass::CClass( const NamespaceScopes &namespaceScopes,
     23CClass::CClass(
     24    const Symbol &symbol,
    2425    const NamespaceScopesCollection &importedNamespaces,
    25     const std::string &name,
    2626    ClassType classType,
    2727    const GenericTypes &formalGenericTypes,
     
    3131    int vtblNum,
    3232    int fixedAlignment )
    33     : ClassPrototype( namespaceScopes, name )
     33    : ClassPrototype( symbol )
    3434    , importedNamespaces( importedNamespaces )
    3535    , classType( classType )
     
    868868    }
    869869}
     870
     871bool CClass::Resolve()
     872{
     873    // TODO: Resolve
     874    return true;
     875}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Const.cpp

    r603 r637  
    77}
    88
    9 void Consts::Add( const NamespaceScopes &namespaceScopes, const std::string &name, _int64 i64data, const Type &type )
     9bool CConst::Resolve()
    1010{
    11     CConst *newconst = new CConst(namespaceScopes, name, type, i64data);
     11    // TODO: Resolve
     12    return true;
     13}
     14
     15void Consts::Add( const Symbol &symbol, _int64 i64data, const Type &type )
     16{
     17    CConst *newconst = new CConst( symbol, type, i64data );
    1218
    1319    //ハッシュリストに追加
    1420    Put( newconst );
    1521}
    16 void Consts::Add(const NamespaceScopes &namespaceScopes, const std::string &name, int value){
    17     CConst *newconst = new CConst( namespaceScopes, name, value);
     22void Consts::Add(const Symbol &symbol, int value){
     23    CConst *newconst = new CConst( symbol, value);
    1824
    1925    //ハッシュリストに追加
     
    7278}
    7379
     80bool ConstMacro::Resolve()
     81{
     82    // TODO: Resolve
     83    return true;
     84}
     85
    7486// マクロ定数を追加するための関数
    75 bool ConstMacros::Add( const NamespaceScopes &namespaceScopes, const std::string &name, const char *parameterStr )
     87bool ConstMacros::Add( const Symbol &symbol, const char *parameterStr )
    7688{
    7789    std::vector<std::string> parameters;
     
    113125    lstrcpy(temporary,parameterStr+i+1);
    114126
    115     this->Put( new ConstMacro( namespaceScopes, name, parameters, temporary ) );
     127    this->Put( new ConstMacro( symbol, parameters, temporary ) );
    116128
    117129    return true;
  • trunk/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp

    r603 r637  
    7777    }
    7878}
     79
     80void DataTable::Resolve()
     81{
     82    // TODO: Resolve
     83}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Delegate.cpp

    r603 r637  
    1818    return false;
    1919}
     20
     21bool Delegate::Resolve()
     22{
     23    // TODO: Resolve
     24    return true;
     25}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp

    r636 r637  
    5050    {
    5151        UserProc *pUserProc = meta.GetUserProcs().Iterator_GetNext();
    52         pUserProc->isTargetObjectModule = false;
     52        if( pUserProc->IsExternal() )
     53        {
     54            // 外部参照の場合は取り込まない
     55            continue;
     56        }
     57
     58        pUserProc->ResetRelationalObjectModuleIndex( relationTable );
    5359
    5460        pUserProc->GetNativeCode().ResetDataSectionBaseOffset( dataSectionBaseOffset );
    55         pUserProc->GetNativeCode().ResetSourceIndexes( relationTable );
    5661
    5762        this->userProcs.Put( pUserProc );
     
    6469    {
    6570        DllProc *pDllProc = meta.GetDllProcs().Iterator_GetNext();
    66         pDllProc->isTargetObjectModule = false;
     71        if( pDllProc->IsExternal() )
     72        {
     73            // 外部参照の場合は取り込まない
     74            continue;
     75        }
     76
     77        pDllProc->ResetRelationalObjectModuleIndex( relationTable );
    6778        this->dllProcs.Put( pDllProc );
    6879    }
     
    7485    {
    7586        CClass *pClass = meta.GetClasses().Iterator_GetNext();
    76         pClass->isTargetObjectModule = false;
     87        if( pClass->IsExternal() )
     88        {
     89            // 外部参照の場合は取り込まない
     90            continue;
     91        }
     92
     93        pClass->ResetRelationalObjectModuleIndex( relationTable );
    7794        pClass->Readed();
    7895        this->GetClasses().Put( pClass );
     
    84101    BOOST_FOREACH( Variable *pVar, meta.globalVars )
    85102    {
     103        if( pVar->IsExternal() )
     104        {
     105            // 外部参照の場合は取り込まない
     106            continue;
     107        }
     108
    86109        // 基底スコープレベルのグローバル変数の生存値をオンにする
    87110        if( pVar->GetScopeLevel() == 0 )
     
    99122        }
    100123
    101         pVar->isTargetObjectModule = false;
     124        pVar->ResetRelationalObjectModuleIndex( relationTable );
    102125        this->globalVars.Add( pVar, isResetOffsetAddress );
    103126    }
     
    113136    {
    114137        CConst *pConst = meta.GetGlobalConsts().Iterator_GetNext();
    115         pConst->isTargetObjectModule = false;
     138        if( pConst->IsExternal() )
     139        {
     140            // 外部参照の場合は取り込まない
     141            continue;
     142        }
     143
     144        pConst->ResetRelationalObjectModuleIndex( relationTable );
    116145        this->GetGlobalConsts().Put( pConst );
    117146    }
     
    123152    {
    124153        ConstMacro *pConstMacro = meta.GetGlobalConstMacros().Iterator_GetNext();
    125         pConstMacro->isTargetObjectModule = false;
     154        if( pConstMacro->IsExternal() )
     155        {
     156            // 外部参照の場合は取り込まない
     157            continue;
     158        }
     159
     160        pConstMacro->ResetRelationalObjectModuleIndex( relationTable );
    126161        this->GetGlobalConstMacros().Put( pConstMacro );
    127162    }
     
    131166    BOOST_FOREACH( BlittableType &blittableType, meta.blittableTypes )
    132167    {
    133         blittableType.isTargetObjectModule = false;
     168        // TODO: coreモジュール以外でもBlittable型用のクラスモジュールを定義できるようにすべき
    134169        this->blittableTypes.push_back( blittableType );
    135170    }
     
    139174    BOOST_FOREACH( TypeDef &typeDef, meta.typeDefs )
    140175    {
    141         typeDef.isTargetObjectModule = false;
     176        if( typeDef.IsExternal() )
     177        {
     178            // 外部参照の場合は取り込まない
     179            continue;
     180        }
     181
     182        typeDef.ResetRelationalObjectModuleIndex( relationTable );
    142183        this->typeDefs.push_back( typeDef );
    143184    }
     
    147188    BOOST_FOREACH( ProcPointer *pProcPointer, meta.procPointers )
    148189    {
    149         pProcPointer->isTargetObjectModule = false;
     190        if( pProcPointer->IsExternal() )
     191        {
     192            // 外部参照の場合は取り込まない
     193            continue;
     194        }
     195
     196        pProcPointer->ResetRelationalObjectModuleIndex( relationTable );
    150197        this->procPointers.push_back( pProcPointer );
    151198    }
     
    157204    {
    158205        Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext();
    159         pDelegate->isTargetObjectModule = false;
     206        if( pDelegate->IsExternal() )
     207        {
     208            // 外部参照の場合は取り込まない
     209            continue;
     210        }
     211
     212        pDelegate->ResetRelationalObjectModuleIndex( relationTable );
    160213        this->GetDelegates().Put( pDelegate );
    161214    }
     
    199252    return NULL;
    200253}
     254
     255void Meta::Resolve()
     256{
     257    // 関数・メソッド
     258    this->GetUserProcs().Iterator_Init();
     259    this->GetUserProcs().Iterator_Reset();
     260    while( this->GetUserProcs().Iterator_HasNext() )
     261    {
     262        UserProc *pUserProc = this->GetUserProcs().Iterator_GetNext();
     263        pUserProc->Resolve();
     264    }
     265
     266    // DLL関数
     267    this->GetDllProcs().Iterator_Init();
     268    this->GetDllProcs().Iterator_Reset();
     269    while( this->GetDllProcs().Iterator_HasNext() )
     270    {
     271        DllProc *pDllProc = this->GetDllProcs().Iterator_GetNext();
     272        pDllProc->Resolve();
     273    }
     274
     275    // クラス
     276    this->GetClasses().Iterator_Init();
     277    this->GetClasses().Iterator_Reset();
     278    while( this->GetClasses().Iterator_HasNext() )
     279    {
     280        CClass *pClass = this->GetClasses().Iterator_GetNext();
     281        pClass->Resolve();
     282    }
     283
     284    // グローバル変数
     285    BOOST_FOREACH( Variable *pVar, globalVars )
     286    {
     287        pVar->Resolve();
     288    }
     289
     290    // グローバル定数
     291    this->GetGlobalConsts().Iterator_Init();
     292    this->GetGlobalConsts().Iterator_Reset();
     293    while( this->GetGlobalConsts().Iterator_HasNext() )
     294    {
     295        CConst *pConst = this->GetGlobalConsts().Iterator_GetNext();
     296        pConst->Resolve();
     297    }
     298
     299    // グローバル定数マクロ
     300    this->GetGlobalConstMacros().Iterator_Init();
     301    this->GetGlobalConstMacros().Iterator_Reset();
     302    while( this->GetGlobalConstMacros().Iterator_HasNext() )
     303    {
     304        ConstMacro *pConstMacro = this->GetGlobalConstMacros().Iterator_GetNext();
     305        pConstMacro->Resolve();
     306    }
     307
     308    // TypeDef
     309    BOOST_FOREACH( TypeDef &typeDef, typeDefs )
     310    {
     311        typeDef.Resolve();
     312    }
     313
     314    // 関数ポインタ
     315    BOOST_FOREACH( ProcPointer *pProcPointer, procPointers )
     316    {
     317        pProcPointer->Resolve();
     318    }
     319
     320    // デリゲート
     321    this->GetDelegates().Iterator_Init();
     322    this->GetDelegates().Iterator_Reset();
     323    while( this->GetDelegates().Iterator_HasNext() )
     324    {
     325        Delegate *pDelegate = this->GetDelegates().Iterator_GetNext();
     326        pDelegate->Resolve();
     327    }
     328}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp

    r636 r637  
    4343        this->sourceLines.push_back(
    4444            SourceLine(
    45                 sourceLine.GetLineNum(),
    4645                baseOffset + sourceLine.GetNativeCodePos(),
    47                 sourceLine.GetRelationalObjectModuleIndex(),    // TODO: 複数libの取り込みを想定できていない(ソースコード行番号とネイティブコード位置の対応情報の追加は静的リンクが完了した後に行うべき)
    48                 sourceLine.GetSourceCodePos(),
    49                 sourceLine.GetCodeType()
     46                sourceLine.GetCodeType(),
     47                sourceLine.GetSourceCodePosition()
    5048            )
    5149        );
     
    106104}
    107105
    108 void NativeCode::NextSourceLine( int currentSourceIndex, int nowLine )
     106void NativeCode::NextSourceLine( const SourceCodePosition &sourceCodePosition )
    109107{
    110108    if( sourceLines.size() )
     
    112110        if( sourceLines.back().GetNativeCodePos() == GetSize() )
    113111        {
    114             sourceLines.back().SetSourceCodePos( nowLine );
     112            sourceLines.back().SetSourceCodePosition( sourceCodePosition );
    115113            return;
    116114        }
     
    130128    sourceLines.push_back(
    131129        SourceLine(
    132             (long)sourceLines.size(),
    133130            GetSize(),
    134             currentSourceIndex,
    135             nowLine,
    136             sourceLineType
     131            sourceLineType,
     132            sourceCodePosition
    137133        )
    138134    );
     
    152148    }
    153149}
    154 void NativeCode::ResetSourceIndexes( const std::vector<int> &relationTable )
     150void NativeCode::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
    155151{
    156152    BOOST_FOREACH( SourceLine &sourceLine, sourceLines )
    157153    {
    158         sourceLine.SetRelationalObjectModuleIndex( relationTable[sourceLine.GetRelationalObjectModuleIndex()] );
     154        sourceLine.GetSourceCodePosition().SetRelationalObjectModuleIndex(
     155            relationTable[sourceLine.GetSourceCodePosition().GetRelationalObjectModuleIndex()]
     156        );
    159157    }
    160158}
     159
     160void NativeCode::Resolve()
     161{
     162    // TODO: Resolve
     163}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp

    r636 r637  
    5656
    5757
    58 void ObjectModule::StaticLink( ObjectModule &objectModule )
     58void ObjectModule::StaticLink( ObjectModule &objectModule, bool isSll )
    5959{
    6060    const std::vector<int> relationTable = this->GetRelationTable( objectModule.relationalObjectModuleNames );
     
    6565    meta.StaticLink( objectModule.meta, dataSectionBaseOffset, relationTable );
    6666
    67     // グローバル ネイティブコードを結合
    68     objectModule.globalNativeCode.ResetDataSectionBaseOffset( dataSectionBaseOffset );
    69     objectModule.globalNativeCode.ResetSourceIndexes( relationTable );
    70     globalNativeCode.PutEx( objectModule.globalNativeCode );
    71 
    72     // データテーブルを結合
    73     objectModule.dataTable.ResetDataSectionBaseOffset( dataSectionBaseOffset );
    74     dataTable.Add( objectModule.dataTable );
     67    if( !isSll )
     68    {
     69        // グローバル ネイティブコードを結合
     70        objectModule.globalNativeCode.ResetDataSectionBaseOffset( dataSectionBaseOffset );
     71        objectModule.globalNativeCode.ResetRelationalObjectModuleIndex( relationTable );
     72        globalNativeCode.PutEx( objectModule.globalNativeCode );
     73
     74        // データテーブルを結合
     75        objectModule.dataTable.ResetDataSectionBaseOffset( dataSectionBaseOffset );
     76        dataTable.Add( objectModule.dataTable );
     77    }
     78
     79    // 依存関係を解決
     80    this->Resolve();
    7581
    7682    // TODO: basbufがいらなくなったら消す
    7783    extern char *basbuf;
    7884    basbuf = this->source.GetBuffer();
     85}
     86
     87void ObjectModule::Resolve()
     88{
     89    this->meta.Resolve();
     90
     91    // グローバルネイティブコードを解決(スケジュールを解決する)
     92    this->globalNativeCode.Resolve();
     93
     94    // データテーブルを解決(スケジュールを解決する)
     95    this->dataTable.Resolve();
    7996}
    8097
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp

    r632 r637  
    11#include "stdafx.h"
    22
     3
     4void Procedure::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
     5{
     6    RelationalObjectModuleItem::ResetRelationalObjectModuleIndex( relationTable );
     7
     8    if( !this->sourceCodePosition.IsNothing() )
     9    {
     10        this->sourceCodePosition.SetRelationalObjectModuleIndex( relationTable[this->sourceCodePosition.GetRelationalObjectModuleIndex()] );
     11    }
     12}
     13
     14void UserProc::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
     15{
     16    Procedure::ResetRelationalObjectModuleIndex( relationTable );
     17
     18    this->GetNativeCode().ResetRelationalObjectModuleIndex( relationTable );
     19}
     20
    321int id_base = 0;
    422
    5 UserProc::UserProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name, Kind kind, bool isMacro, bool isCdecl, bool isExport )
    6     : Procedure( namespaceScopes, name, kind, isCdecl )
     23UserProc::UserProc( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Kind kind, bool isMacro, bool isCdecl, bool isExport )
     24    : Procedure( symbol, kind, isCdecl )
    725    , importedNamespaces( importedNamespaces )
    826    , pParentClass( NULL )
     
    139157}
    140158
     159bool UserProc::Resolve()
     160{
     161    // TODO: Resolve
     162    return true;
     163}
     164
    141165const UserProc *UserProc::pGlobalProc = NULL;
    142166
     
    161185}
    162186
     187bool DllProc::Resolve()
     188{
     189    // TODO: Resolve
     190    return true;
     191}
     192
     193bool ProcPointer::Resolve()
     194{
     195    // TODO: Resolve
     196    return true;
     197}
     198
    163199void ProcPointers::Clear()
    164200{
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp

    r635 r637  
    941941    return 1;
    942942}
     943
     944int SourceCodePosition::GetRelationalObjectModuleIndex() const
     945{
     946    if( this->IsNothing() )
     947    {
     948        _ASSERTE( false );
     949        throw;
     950    }
     951
     952    return relationalObjectModuleIndex;
     953}
     954bool SourceCodePosition::IsNothing() const
     955{
     956    if( this->relationalObjectModuleIndex == -1 && this->pos == -1 )
     957    {
     958        return true;
     959    }
     960
     961    if( this->relationalObjectModuleIndex == -1 || this->pos == -1 )
     962    {
     963        _ASSERTE( false );
     964        throw;
     965    }
     966
     967    return false;
     968}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/TypeDef.cpp

    r632 r637  
    11#include "stdafx.h"
    22
    3 TypeDef::TypeDef( const NamespaceScopes &namespaceScopes, const std::string &name, const std::string &baseName, const Type &baseType )
    4     : Symbol( namespaceScopes, name )
     3TypeDef::TypeDef( const Symbol &symbol, const std::string &baseName, const Type &baseType )
     4    : RelationalObjectModuleItem( symbol )
    55    , baseName( baseName )
    66    , baseType( baseType )
    77{
     8}
     9
     10bool TypeDef::Resolve()
     11{
     12    // TODO: Resolve
     13    return true;
    814}
    915
     
    1218TypeDefCollection::~TypeDefCollection(){
    1319}
    14 void TypeDefCollection::Add( const NamespaceScopes &namespaceScopes, const std::string &name, const std::string &baseName, int nowLine ){
    15     TypeDef typeDef( namespaceScopes, name, baseName, nowLine );
     20void TypeDefCollection::Add( const Symbol &symbol, const std::string &baseName, int nowLine ){
     21    TypeDef typeDef( symbol, baseName, nowLine );
    1622    this->push_back( typeDef );
    1723}
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Variable.cpp

    r603 r637  
    22
    33Variable::Variable( const Symbol &symbol, const Type &type, bool isConst, bool isRef, const std::string &paramStrForConstructor, bool hasInitData )
    4     : Symbol( symbol )
    5     , type( type )
    6     , isConst( isConst )
    7     , isRef( isRef )
    8     , isArray( false )
    9     , isParameter( false)
    10     , paramStrForConstructor( paramStrForConstructor )
    11     , hasInitData( hasInitData )
    12 {
    13 }
    14 Variable::Variable( const NamespaceScopes &namespaceScopes, const std::string &name, const Type &type, bool isConst, bool isRef, const std::string &paramStrForConstructor, bool hasInitData )
    15     : Symbol( namespaceScopes, name )
     4    : RelationalObjectModuleItem( symbol )
    165    , type( type )
    176    , isConst( isConst )
     
    2413}
    2514Variable::Variable( const Variable &var )
    26     : Symbol( var )
     15    : RelationalObjectModuleItem( var )
    2716    , type( var.type )
    2817    , isConst( var.isConst )
     
    3726Variable::Variable()
    3827{
     28}
     29
     30bool Variable::Resolve()
     31{
     32    // TODO: Resolve
     33    return true;
    3934}
    4035
Note: See TracChangeset for help on using the changeset viewer.