Changeset 346 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Oct 10, 2007, 4:01:07 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r345 r346  
    9898    }
    9999};
    100 typedef std::vector<Interface> Interfaces;
     100typedef std::vector<Interface *> Interfaces;
    101101
    102102class CClass: public ClassPrototype, public Jenga::Common::ObjectInHashmap<CClass>
     
    215215    {
    216216        // 動的メンバ
    217         BOOST_FOREACH( CMember *member, dynamicMembers ){
     217        BOOST_FOREACH( CMember *member, dynamicMembers )
     218        {
    218219            delete member;
    219220        }
    220221
    221222        // 静的メンバ
    222         BOOST_FOREACH( CMember *member, staticMembers ){
     223        BOOST_FOREACH( CMember *member, staticMembers )
     224        {
    223225            delete member;
     226        }
     227
     228        // インターフェイス
     229        BOOST_FOREACH( ::Interface *pInterface, interfaces )
     230        {
     231            delete pInterface;
    224232        }
    225233    }
  • trunk/abdev/BasicCompiler_Common/include/Method.h

    r336 r346  
    197197    void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
    198198
     199    // オーバーライド
     200    bool Override( UserProc *pUserProc, Prototype::Accessibility accessibility );
     201
    199202    const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
    200203    bool IsExist( const char *name ) const;
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r345 r346  
    198198bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
    199199{
    200     BOOST_FOREACH( const ::Interface &objInterface, interfaces ){
    201         if( pInterfaceClass == &objInterface.GetClass() ){
     200    BOOST_FOREACH( const ::Interface *pInterface, interfaces ){
     201        if( pInterfaceClass == &pInterface->GetClass() ){
    202202            return true;
    203203        }
     
    447447    }
    448448
    449     interfaces.push_back( ::Interface( &interfaceClass ) );
     449    interfaces.push_back( new ::Interface( &interfaceClass ) );
    450450
    451451    return true;
     
    587587    if( isAbstract ) pUserProc->CompleteCompile();
    588588
    589     //メソッドのオーバーライド
    590     BOOST_FOREACH( CMethod *pMethod, pobj_c->GetDynamicMethods() ){
    591         if( pMethod->GetUserProc().GetName() == temporary ){
    592             if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
    593                 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
     589    // メソッドのオーバーライド
     590    if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) )
     591    {
     592        // オーバーライドが行われた場合
     593        if( !isOverride )
     594        {
     595            SetError(127,NULL,nowLine);
     596        }
     597        return;
     598    }
     599    else
     600    {
     601        // インターフェイス メソッドのオーバーライド
     602        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
     603        {
     604            if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) )
    594605            {
    595                 //メンバ関数を上書き
    596                 pMethod->SetUserProcPtr( pUserProc );
    597                 pMethod->Override();
    598 
    599                 if( !pMethod->IsVirtual() )
    600                 {
    601                     // オーバーライドミス
    602                     SetError(136,NULL,cp);
    603                 }
     606                // オーバーライドが行われた場合
    604607                if( !isOverride )
    605608                {
    606609                    SetError(127,NULL,nowLine);
    607610                }
    608                 if(pMethod->GetAccessibility() != accessibility )
    609                 {
    610                     SetError(128,NULL,nowLine);
    611                 }
    612 
    613                 pUserProc->SetMethod( pMethod );
    614611                return;
    615612            }
     
    802799    }
    803800
    804     BOOST_FOREACH( const ::Interface &objInterface, interfaces )
     801    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
    805802    {
    806803        index++;
    807804
    808         BOOST_FOREACH( const CMethod *pMethod, objInterface.GetClass().GetDynamicMethods() ){
     805        BOOST_FOREACH( const CMethod *pMethod, pInterface->GetClass().GetDynamicMethods() ){
    809806            if( &pMethod->GetUserProc() == pUserProc )
    810807            {
     
    902899
    903900    // インターフェイスのvtblを生成
    904     BOOST_FOREACH( const ::Interface &objInterface, interfaces )
     901    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
    905902    {
    906903        long tempVtblOffset;
    907         objInterface.GetClass().GenerateVTablePart( tempVtblOffset );
     904        pInterface->GetClass().GenerateVTablePart( tempVtblOffset );
    908905        vtblMasterList.push_back( tempVtblOffset );
    909906
    910         objInterface.SetVtblOffset( tempVtblOffset );
     907        pInterface->SetVtblOffset( tempVtblOffset );
    911908    }
    912909
     
    947944
    948945    // インターフェイスのvtbl
    949     BOOST_FOREACH( const ::Interface &objInterface, interfaces )
    950     {
    951         LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + objInterface.GetClass().vtbl_offset);
    952 
    953         for( int i=0; i<objInterface.GetClass().GetVtblNum(); i++ ){
     946    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
     947    {
     948        LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + pInterface->GetClass().vtbl_offset);
     949
     950        for( int i=0; i<pInterface->GetClass().GetVtblNum(); i++ ){
    954951            const UserProc *pUserProc = (UserProc *)pVtbl[i];
    955952            if(!pUserProc) continue;
  • trunk/abdev/BasicCompiler_Common/src/Method.cpp

    r206 r346  
    2424    this->push_back( pMethod );
    2525    pUserProc->SetMethod( pMethod );
     26}
     27
     28bool Methods::Override( UserProc *pUserProc, Prototype::Accessibility accessibility )
     29{
     30    //メソッドのオーバーライド
     31    Methods &methods = *this;
     32    BOOST_FOREACH( CMethod *pMethod, methods )
     33    {
     34        if( pMethod->GetUserProc().GetName() == pUserProc->GetName() )
     35        {
     36            if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
     37                && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
     38            {
     39                //メンバ関数を上書き
     40                pMethod->SetUserProcPtr( pUserProc );
     41                pMethod->Override();
     42
     43                if( !pMethod->IsVirtual() )
     44                {
     45                    // オーバーライドミス
     46                    SetError(136,NULL,cp);
     47                }
     48                if(pMethod->GetAccessibility() != accessibility )
     49                {
     50                    SetError(128,NULL,cp);
     51                }
     52
     53                pUserProc->SetMethod( pMethod );
     54                return true;
     55            }
     56        }
     57    }
     58    return false;
    2659}
    2760
Note: See TracChangeset for help on using the changeset viewer.