Changeset 704 in dev


Ignore:
Timestamp:
Jul 21, 2008, 2:31:24 PM (16 years ago)
Author:
dai_9181
Message:

[702]を64bit版にマージ。

Location:
trunk/ab5.0/abdev/compiler_x64
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/compiler_x64/Compile_CallProc.cpp

    r598 r704  
    105105            return true;
    106106        }
     107    }
     108    if( (dwFlags&PROCFLAG_PERMIT_CONSTRUCTOR) == 0 && pUserProc->IsConstructor() )
     109    {
     110        // コンストラクタの直接呼出しはエラーとする
     111        compiler.errorMessenger.Output(145,NULL,cp);
     112        return false;
     113    }
     114    if( (dwFlags&PROCFLAG_PERMIT_DESTRUCTOR) == 0 && pUserProc->IsDestructor() )
     115    {
     116        // デストラクタの直接呼出しはエラーとする
     117        compiler.errorMessenger.Output(146,NULL,cp);
     118        return false;
    107119    }
    108120
  • trunk/ab5.0/abdev/compiler_x64/Compile_Object.cpp

    r468 r704  
    6969    Opcode_CallProc(CreateParameter,
    7070        pUserProc,
    71         PROCFLAG_NEW,"");
     71        PROCFLAG_NEW | PROCFLAG_PERMIT_CONSTRUCTOR,"");
    7272
    7373    if(bSomeObjects){
  • trunk/ab5.0/abdev/compiler_x64/Compile_ProcOp.cpp

    r685 r704  
    445445            compiler.GetCompilingClass().NotifyStartConstructorCompile();
    446446
    447             //基底クラスかどうかの識別
    448             //(継承元がインターフェイスの場合も基底クラスと見なす)
    449             BOOL bThisIsSuperClass;
    450             if( !compiler.GetCompilingClass().HasSuperClass() ) bThisIsSuperClass=1;
    451             else if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() == NULL ){
    452                 //インターフェイスを継承したときはコンストラクタを持たない
    453                 bThisIsSuperClass=1;
    454             }
    455             else bThisIsSuperClass=0;
    456 
    457             if(!bThisIsSuperClass){
     447            if( compiler.GetCompilingClass().HasSuperClass() )
     448            {
    458449                /* サブクラスコンストラクタをコンパイルしているときは、
    459450                    基底クラスのコンストラクタを呼び出す */
     
    483474                    RemoveStringPare(temporary);
    484475
    485                     Type dummyType;
    486                     CallProc( PROC_DEFAULT
    487                         , &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc()
    488                         , compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
    489                         , temporary
    490                         , Type()        // baseTypeはなし
    491                         , dummyType
    492                     );
     476
     477                    ////////////////////////
     478                    // オーバーロードを解決
     479                    ////////////////////////
     480
     481                    std::vector<const UserProc *> subs;
     482                    compiler.GetCompilingClass().GetSuperClass().GetDynamicMethods().Enum( compiler.GetCompilingClass().GetSuperClass().GetName().c_str(), subs );
     483
     484                    const UserProc *pUserProc = NULL;
     485                    if( subs.size() > 0 )
     486                    {
     487                        //オーバーロードを解決
     488                        pUserProc=OverloadSolutionWithStrParam(  compiler.GetCompilingClass().GetSuperClass().GetName().c_str(),
     489                            subs,temporary,"");
     490                    }
     491                    if( !pUserProc )
     492                    {
     493                        compiler.errorMessenger.Output(1,NULL,cp);
     494                    }
     495                    else
     496                    {
     497                        Type dummyType;
     498                        CallProc( PROC_DEFAULT
     499                            , pUserProc
     500                            , pUserProc->GetName().c_str()
     501                            , temporary
     502                            , Type()        // baseTypeはなし
     503                            , dummyType
     504                            , true
     505                            , PROCFLAG_PERMIT_CONSTRUCTOR
     506                        );
     507                    }
    493508                }
    494509                else{
    495                     //基底クラスのコンストラクタを暗黙的に呼び出す
    496                     Opcode_CallProc("",
    497                         &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
    498                         0,
    499                         "");
     510                    if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() != NULL )
     511                    {
     512                        // 基底クラスがデフォルトコンストラクタを保有するとき
     513
     514                        // 基底クラスのコンストラクタを暗黙的に呼び出す
     515                        Opcode_CallProc("",
     516                            &compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
     517                            PROCFLAG_PERMIT_CONSTRUCTOR,
     518                            ""
     519                        );
     520                    }
    500521                }
    501522            }
     
    555576                    Opcode_CallProc("",
    556577                        &method->GetUserProc(),
    557                         0,
     578                        PROCFLAG_PERMIT_DESTRUCTOR,
    558579                        "");
    559580                }
  • trunk/ab5.0/abdev/compiler_x64/Opcode.h

    r685 r704  
    328328
    329329//Compile_CallProc.cpp
    330 #define PROCFLAG_NEW    1
     330#define PROCFLAG_NEW                1
     331#define PROCFLAG_PERMIT_CONSTRUCTOR 2
     332#define PROCFLAG_PERMIT_DESTRUCTOR  4
    331333bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
    332334bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
Note: See TracChangeset for help on using the changeset viewer.