Changeset 702 in dev for trunk


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

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

Location:
trunk/ab5.0/abdev
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp

    r699 r702  
    106106}
    107107
    108 bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn )
     108bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn, int dwCallProcFlags )
    109109{
    110110    //GetSubHash内でエラー提示が行われた場合
     
    144144
    145145        if( isCallOn ){
    146             if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName ) ){
     146            if( !Opcode_CallProc(lpszParms,pUserProc,dwCallProcFlags,ObjectName ) ){
    147147                return false;
    148148            }
  • trunk/ab5.0/abdev/BasicCompiler_Common/common.h

    r699 r702  
    349349int GetProc(char *name,void **ppInfo);
    350350void SplitObjectName(const char *name,char *ObjectName, ReferenceKind &referenceFind );
    351 bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn = true );
     351bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn = true, int dwCallProcFlags = 0 );
    352352bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType);
    353353bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType );
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Messenger.cpp

    r687 r702  
    251251    if(errorCode==143) sprintf(msg,"\"%s\" ジェネリクス型に型パラメータが指定されていません。",tempKeyWord);
    252252    if(errorCode==144) sprintf(msg,"Thisの変数ポインタを取得することはできません。",tempKeyWord);
     253    if(errorCode==145) sprintf(msg,"コンストラクタを直接呼び出すことはできません。。",tempKeyWord);
     254    if(errorCode==146) sprintf(msg,"デストラクタを直接呼び出すことはできません。。",tempKeyWord);
    253255
    254256    //Enum関連
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Procedure.h

    r641 r702  
    304304        return isCompiled;
    305305    }
     306    bool IsConstructor() const
     307    {
     308        return ( this->HasParentClass() && this->GetName() == this->GetParentClass().GetName() );
     309    }
    306310    bool IsDestructor() const
    307311    {
  • trunk/ab5.0/abdev/compiler_x86/Compile_CallProc.cpp

    r687 r702  
    9797            return true;
    9898        }
     99    }
     100    if( (dwFlags&PROCFLAG_PERMIT_CONSTRUCTOR) == 0 && pUserProc->IsConstructor() )
     101    {
     102        // コンストラクタの直接呼出しはエラーとする
     103        compiler.errorMessenger.Output(145,NULL,cp);
     104        return false;
     105    }
     106    if( (dwFlags&PROCFLAG_PERMIT_DESTRUCTOR) == 0 && pUserProc->IsDestructor() )
     107    {
     108        // デストラクタの直接呼出しはエラーとする
     109        compiler.errorMessenger.Output(146,NULL,cp);
     110        return false;
    99111    }
    100112
  • trunk/ab5.0/abdev/compiler_x86/Compile_Object.cpp

    r465 r702  
    7474    Opcode_CallProc(CreateParameter,
    7575        pUserProc,
    76         PROCFLAG_NEW,"");
     76        PROCFLAG_NEW | PROCFLAG_PERMIT_CONSTRUCTOR,"");
    7777
    7878
  • 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                    );
  • trunk/ab5.0/abdev/compiler_x86/Opcode.h

    r684 r702  
    213213
    214214//Compile_CallProc.cpp
    215 #define PROCFLAG_NEW    1
     215#define PROCFLAG_NEW                1
     216#define PROCFLAG_PERMIT_CONSTRUCTOR 2
     217#define PROCFLAG_PERMIT_DESTRUCTOR  4
    216218bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
    217219bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName );
Note: See TracChangeset for help on using the changeset viewer.