Ignore:
Timestamp:
Oct 10, 2007, 4:01:07 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.