Ignore:
Timestamp:
Jul 21, 2008, 2:25:54 PM (16 years ago)
Author:
dai_9181
Message:
  • コンストラクタ、デストラクタの直接呼出しをエラー扱いにした。
    • コンストラクタ … New演算子にて、呼ばれるものとする。また、コンストラクタの1ステップ目にて、基底クラスのコンストラクタ呼び出しを許可する。
    • デストラクタ … Delete演算子にて呼ばれるものとする。また、デストラクタ内にて、基底クラスのコンストラクタ呼び出しが自動的に行われるものとする。

※まずは32bit版のみ対応。速やかに64bit版にマージすること。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/compiler_x86/Compile_ProcOp.cpp

    r684 r702  
    469469            compiler.GetCompilingClass().NotifyStartConstructorCompile();
    470470
    471             //基底クラスかどうかの識別
    472             //(継承元がインターフェイスの場合も基底クラスと見なす)
    473             BOOL bThisIsSuperClass;
    474             if( !compiler.GetCompilingClass().HasSuperClass() ) bThisIsSuperClass=1;
    475             else if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() == NULL ){
    476                 //インターフェイスを継承したときはコンストラクタを持たない
    477                 bThisIsSuperClass=1;
    478             }
    479             else bThisIsSuperClass=0;
    480 
    481             if(!bThisIsSuperClass){
     471            if( compiler.GetCompilingClass().HasSuperClass() )
     472            {
    482473                /* サブクラスコンストラクタをコンパイルしているときは、
    483474                    基底クラスのコンストラクタを呼び出す */
     
    507498                    RemoveStringPare(temporary);
    508499
    509                     Type dummyType;
    510                     CallProc( PROC_DEFAULT
    511                         , &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc()
    512                         , compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
    513                         , temporary
    514                         , Type()        // baseTypeはなし
    515                         , dummyType
    516                     );
     500
     501                    ////////////////////////
     502                    // オーバーロードを解決
     503                    ////////////////////////
     504
     505                    std::vector<const UserProc *> subs;
     506                    compiler.GetCompilingClass().GetSuperClass().GetDynamicMethods().Enum( compiler.GetCompilingClass().GetSuperClass().GetName().c_str(), subs );
     507
     508                    const UserProc *pUserProc = NULL;
     509                    if( subs.size() > 0 )
     510                    {
     511                        //オーバーロードを解決
     512                        pUserProc=OverloadSolutionWithStrParam(  compiler.GetCompilingClass().GetSuperClass().GetName().c_str(),
     513                            subs,temporary,"");
     514                    }
     515                    if( !pUserProc )
     516                    {
     517                        compiler.errorMessenger.Output(1,NULL,cp);
     518                    }
     519                    else
     520                    {
     521                        Type dummyType;
     522                        CallProc( PROC_DEFAULT
     523                            , pUserProc
     524                            , pUserProc->GetName().c_str()
     525                            , temporary
     526                            , Type()        // baseTypeはなし
     527                            , dummyType
     528                            , true
     529                            , PROCFLAG_PERMIT_CONSTRUCTOR
     530                        );
     531                    }
    517532                }
    518533                else{
    519                     //基底クラスのコンストラクタを暗黙的に呼び出す
    520                     Opcode_CallProc("",
    521                         &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
    522                         0,
    523                         ""
    524                     );
     534                    if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() != NULL )
     535                    {
     536                        // 基底クラスがデフォルトコンストラクタを保有するとき
     537
     538                        // 基底クラスのコンストラクタを暗黙的に呼び出す
     539                        Opcode_CallProc("",
     540                            &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
     541                            PROCFLAG_PERMIT_CONSTRUCTOR,
     542                            ""
     543                        );
     544                    }
    525545                }
    526546            }
     
    580600                    Opcode_CallProc("",
    581601                        &method->GetUserProc(),
    582                         0,
     602                        PROCFLAG_PERMIT_DESTRUCTOR,
    583603                        ""
    584604                    );
Note: See TracChangeset for help on using the changeset viewer.