Ignore:
Timestamp:
Oct 14, 2007, 9:41:03 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイスを実装

Location:
trunk/abdev/BasicCompiler_Common/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r349 r350  
    449449    interfaces.push_back( new ::Interface( &interfaceClass ) );
    450450
     451    // キャストメソッドを追加(内部コードは自動生成すること)
     452    {
     453        // Function Operator() As ITest
     454
     455        char temporary[1024];
     456        sprintf(temporary,"%c%c%c%c()%c%c%s",
     457            1, ESC_FUNCTION,
     458            1, ESC_OPERATOR,
     459            1, ESC_AS,
     460            interfaceClass.GetName().c_str()
     461        );
     462
     463        this->AddMethod(this,
     464            Prototype::Public,
     465            0,
     466            false,          // isConst
     467            false,          // isAbstract
     468            false,          // isVirtual
     469            false,          // isOverride
     470            true,           // isAutoGeneration
     471            temporary,
     472            -1
     473        );
     474    }
     475
    451476    return true;
    452477}
     
    505530
    506531void CClass::AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    507                          bool isVirtual, bool isOverride, char *buffer, int nowLine){
     532                         bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine){
    508533    int i,i2;
    509534    char temporary[VN_SIZE];
     
    522547    UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Add( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
    523548    if(!pUserProc) return;
     549
     550    if( isAutoGeneration )
     551    {
     552        // コード自動生成
     553        pUserProc->ThisIsAutoGenerationProc();
     554    }
    524555
    525556
     
    665696}
    666697
    667 void CClass::EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
     698void CClass::EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
    668699{
    669700    // 動的メソッド
     
    676707    }
    677708}
    678 const CMethod *CClass::GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const
     709const CMethod *CClass::GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const
    679710{
    680711    // 動的メソッド
     
    687718        {
    688719            result = pInterface->GetDynamicMethods().GetMethodPtr( pUserProc );
     720            if( result )
     721            {
     722                return result;
     723            }
    689724        }
    690725    }
     
    854889    SetError();
    855890    return;
     891}
     892int CClass::GetVtblMasterListIndex( const CClass *pClass ) const
     893{
     894    int result = 0;
     895
     896    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
     897    {
     898        result++;
     899       
     900        if( &pInterface->GetClass() == pClass )
     901        {
     902            return result;
     903        }
     904    }
     905
     906    SetError();
     907    return 0;
    856908}
    857909long CClass::GetVtblMasterListOffset() const
     
    14281480                pobj_c->AddMethod(pobj_c,
    14291481                    Prototype::Public,  //Publicアクセス権
    1430                     0,                  //Static指定なし
    1431                     false,              //Constではない
    1432                     1,                  //Abstract
    1433                     1,                  //Virtual
    1434                     0,
     1482                    0,                  // bStatic
     1483                    false,              // isConst
     1484                    true,               // isAbstract
     1485                    true,               // isVirtual
     1486                    false,              // isOverride
     1487                    false,              // isAutoGeneration
    14351488                    temporary,
    14361489                    sub_address
     
    17191772                        isVirtual,
    17201773                        isOverride,
     1774                        false,
    17211775                        temporary,
    17221776                        sub_address);
     
    19462000        }
    19472001
    1948         pCompilingMethod = pParentClass->GetDynamicMethodOfInterfaceMethod( pUserProc );
     2002        pCompilingMethod = pParentClass->GetDynamicMethodOrInterfaceMethod( pUserProc );
    19492003        if( !pCompilingMethod ){
    19502004            pCompilingMethod = pParentClass->GetStaticMethods().GetMethodPtr( pUserProc );
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r336 r350  
    2424
    2525    return GetName();
     26}
     27bool UserProc::IsCastOperator() const
     28{
     29    if( GetName()[0] == 1 && GetName()[1] == ESC_OPERATOR && GetName()[2] == CALC_AS )
     30    {
     31        return true;
     32    }
     33    return false;
    2634}
    2735const NamespaceScopes &UserProc::GetNamespaceScopes() const
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r335 r350  
    211211    if( IsObject() )
    212212    {
    213         if( GetClass().IsInterface() ){
    214             // vtblOffsetのサイズを含める
    215             return PTR_SIZE*2;
    216         }
    217213        return PTR_SIZE;
    218214    }
     
    298294bool Type::IsPointer( int basicType )
    299295{
     296    if( basicType == DEF_NON )
     297    {
     298        return false;
     299    }
     300
    300301    if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
    301302        || ( basicType & FLAG_PTR ) ){
     
    448449    return ( IsObject() && GetClass().IsDelegate() );
    449450}
     451bool Type::IsInterface() const
     452{
     453    return ( IsObject() && GetClass().IsInterface() );
     454}
     455
    450456
    451457bool Type::HasMember() const
Note: See TracChangeset for help on using the changeset viewer.