Changeset 364 in dev for trunk


Ignore:
Timestamp:
Nov 11, 2007, 3:12:06 PM (17 years ago)
Author:
dai_9181
Message:

Throw→Catch間のパラメータ引渡しに対応。
グローバル領域でのTryスコープを可能にした。これで例外処理機構実装完了。
エディタの補間機能にTry/Catch/Finally/EndTryを追加。

Location:
trunk/abdev
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Opcode.h

    r350 r364  
    188188
    189189private:
    190     bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
     190    bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored );
    191191public:
    192192    const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
  • trunk/abdev/BasicCompiler32/commandvalue.h

    r118 r364  
    9494#define COM_ABSTRACT    0x11B2
    9595#define COM_NAMESPACE   0x11B3
     96#define COM_TRY         0x11B4
    9697
    9798//ウィンドウ制御
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r358 r364  
    148148        // グローバル領域をコンパイル
    149149        ////////////////////////////////////////
     150
     151        UserProc::pGlobalProc = &userProc;
    150152
    151153        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
  • trunk/abdev/BasicCompiler64/Opcode.h

    r350 r364  
    287287
    288288private:
    289     bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
     289    bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored );
    290290
    291291public:
  • trunk/abdev/BasicCompiler_Common/ParamImpl.cpp

    r353 r364  
    107107}
    108108
    109 bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType ){
     109bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored ){
    110110    //パラメータを識別してオーバーロードを解決
     111
     112    isErrored = false;
    111113
    112114    //パラメータの個数が不一致の場合
     
    137139            Type nullParam( DEF_NON );
    138140
    139             NumOpe_GetType(Parms[i],
     141            if( !NumOpe_GetType(Parms[i],
    140142                ( level <= OVERLOAD_LEVEL3 )? nullParam : param,
    141                 argType);
     143                argType) )
     144            {
     145                isErrored = true;
     146                return false;
     147            }
    142148        }
    143149        else{
     
    206212    const UserProc *pUserProc = NULL;
    207213
    208     for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    209 
    210         BOOST_FOREACH( const UserProc *pTempUserProc, subs ){
    211 
    212             if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){
     214    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ )
     215    {
     216        BOOST_FOREACH( const UserProc *pTempUserProc, subs )
     217        {
     218            bool isErrored = false;
     219            bool isHit = false;
     220            isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), isErrored );
     221            if( isErrored )
     222            {
     223                // 照合中にエラーが起きた場合
     224                return NULL;
     225            }
     226
     227            if( isHit )
     228            {
    213229                trace_for_overload( "レベル" << level << " ○適合..." << pTempUserProc->_paramStr );
    214230
     
    216232                    if( isEnabledReturnType ){
    217233                        SetError(52,name,cp);
     234                        return NULL;
    218235                    }
    219236                    else{
     
    238255
    239256    if( !pUserProc ){
    240         BOOST_FOREACH( const UserProc *pTempUserProc, subs ){
    241 
     257        BOOST_FOREACH( const UserProc *pTempUserProc, subs )
     258        {
    242259            //エラーチェック
    243             if(pTempUserProc->Params().size()==this->ParmsNum){
    244                 if( pUserProc ){
     260            if(pTempUserProc->Params().size()==this->ParmsNum)
     261            {
     262                if( pUserProc )
     263                {
    245264                    SetError(52,name,cp);
     265                    return NULL;
    246266                }
    247267
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r357 r364  
    9999public:
    100100    enum SCOPE_TYPE{
    101         //ベース
     101        // ベース
    102102        SCOPE_TYPE_BASE,
    103103
    104         //分岐
     104        // 分岐
    105105        SCOPE_TYPE_IF,
    106106
    107         //ループ
     107        // ループ
    108108        SCOPE_TYPE_DO,
    109109        SCOPE_TYPE_FOR,
    110110        SCOPE_TYPE_WHILE,
    111111
    112         //ケース分け
     112        // ケース分け
    113113        SCOPE_TYPE_SELECT,
     114
     115        // 例外処理
     116        SCOPE_TRY,
     117        SCOPE_CATCH,
     118        SCOPE_FINALLY,
    114119    };
    115120
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r353 r364  
    382382    static const UserProc *pCompilingUserProc;
    383383public:
     384    static const UserProc *pGlobalProc;
    384385    static void CompileStartForGlobalArea(){
    385386        pCompilingUserProc = NULL;
  • trunk/abdev/BasicCompiler_Common/include/ver.h

    r363 r364  
    66// バージョン付加文字列
    77#ifdef _AMD64_
    8 #define VER_INFO        "(x64) (rev.374)"
     8#define VER_INFO        "(x64) (rev.375)"
    99#else
    10 #define VER_INFO        "(rev.374)"
     10#define VER_INFO        "(rev.375)"
    1111#endif
  • trunk/abdev/BasicCompiler_Common/src/Exception.cpp

    r361 r364  
    103103    void Try()
    104104    {
     105        // レキシカルスコープをレベルアップ
     106        compiler.codeGenerator.lexicalScopes.Start(
     107            compiler.codeGenerator.GetNativeCodeSize(),
     108            LexicalScope::SCOPE_TRY
     109        );
    105110    }
    106111
     
    113118        }
    114119
     120        if( catchScopes.size() )
     121        {
     122            // 既に1回以上のCatchが存在するとき
     123
     124            // レキシカルスコープをレベルダウン
     125            compiler.codeGenerator.lexicalScopes.End();
     126        }
     127
    115128        JmpFinally();
    116129
    117130        catchScopes.push_back( CatchScope( paramType, compiler.codeGenerator.GetNativeCodeSize() ) );
     131
     132        // レキシカルスコープをレベルアップ
     133        compiler.codeGenerator.lexicalScopes.Start(
     134            compiler.codeGenerator.GetNativeCodeSize(),
     135            LexicalScope::SCOPE_CATCH
     136        );
    118137    }
    119138    void Finally()
     
    125144        }
    126145
     146        if( catchScopes.size() )
     147        {
     148            // 既に1回以上のCatchが存在するとき
     149
     150            // レキシカルスコープをレベルダウン
     151            compiler.codeGenerator.lexicalScopes.End();
     152        }
     153
    127154        isDefinedFinally = true;
    128155
    129156        ResolveJmpFinally();
     157
     158        // レキシカルスコープをレベルアップ
     159        compiler.codeGenerator.lexicalScopes.Start(
     160            compiler.codeGenerator.GetNativeCodeSize(),
     161            LexicalScope::SCOPE_FINALLY
     162        );
    130163    }
    131164
     
    136169            Finally();
    137170        }
     171
     172        if( catchScopes.size() || isDefinedFinally )
     173        {
     174            // 既に1回以上のCatch、またはFinallyが存在するとき
     175
     176            // レキシカルスコープをレベルダウン
     177            compiler.codeGenerator.lexicalScopes.End();
     178        }
     179
     180        // レキシカルスコープをレベルダウン
     181        compiler.codeGenerator.lexicalScopes.End();
    138182    }
    139183
     
    174218
    175219            // Catchアドレス
    176             compiler.GetObjectModule().dataTable.schedules.push_back( Schedule( &UserProc::CompilingUserProc(), dataTableOffset + pos ) );
     220            const UserProc *pUserProc = &UserProc::CompilingUserProc();
     221            if( UserProc::IsGlobalAreaCompiling() )
     222            {
     223                pUserProc = UserProc::pGlobalProc;
     224            }
     225            compiler.GetObjectModule().dataTable.schedules.push_back( Schedule( pUserProc, dataTableOffset + pos ) );
    177226            compiler.GetObjectModule().dataTable.schedules.back().SpecifyCatchAddress();
    178227            pos += sizeof(LONG_PTR);
     
    188237void TryCommand()
    189238{
    190     if( UserProc::IsGlobalAreaCompiling() )
    191     {
    192         SetError();
    193     }
    194 
    195239    tryScopes.push_back( TryScope() );
    196240    tryScopes.back().Try();
     
    213257    }
    214258
     259    char varName[VN_SIZE];
    215260    Type paramType;
    216261    if( parameter[0] )
    217262    {
    218         char varName[VN_SIZE], typeName[VN_SIZE];
     263        char typeName[VN_SIZE];
    219264        SplitSyntacticForAs( parameter, varName, typeName );
    220265        if( !typeName[0] )
     
    232277
    233278    tryScopes.back().Catch( paramType );
     279
     280    if( paramType.IsObject() )
     281    {
     282        int backCp = cp;
     283
     284        char temporary[1024];
     285        sprintf( temporary, "Dim %s = Thread.CurrentThread().__GetThrowintParamObject() As %s", varName, paramType.GetClass().GetFullName().c_str() );
     286        MakeMiddleCode( temporary );
     287        ChangeOpcode( temporary );
     288        lstrcpy( temporary, "Thread.CurrentThread().__Catched()" );
     289        MakeMiddleCode( temporary );
     290        ChangeOpcode( temporary );
     291
     292        cp = backCp;
     293    }
    234294}
    235295void FinallyCommand()
  • trunk/abdev/BasicCompiler_Common/src/NativeCode.cpp

    r357 r364  
    4343    if( scheduleType == Schedule::CatchAddress )
    4444    {
    45         PutCatchAddressSchedule( &UserProc::CompilingUserProc(), l );
     45        const UserProc *pUserProc = &UserProc::CompilingUserProc();
     46        if( UserProc::IsGlobalAreaCompiling() )
     47        {
     48            pUserProc = UserProc::pGlobalProc;
     49        }
     50        PutCatchAddressSchedule( pUserProc, l );
    4651    }
    4752    else
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r353 r364  
    434434
    435435const UserProc *UserProc::pCompilingUserProc = NULL;
     436const UserProc *UserProc::pGlobalProc = NULL;
    436437
    437438
  • trunk/abdev/ProjectEditor/Common.h

    r350 r364  
    6666#define APPLICATION_NAME "ActiveBasic 5.0"
    6767#define VERSION_APPLI_NAME APPLICATION_NAME
    68 #define VERSION_STRING "5.00.00 (rev.356)"
     68#define VERSION_STRING "5.00.00 (rev.375)"
    6969
    7070#endif
  • trunk/abdev/ProjectEditor/EndPairCommandComplement.cpp

    r118 r364  
    7575    if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
    7676    if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
     77    if(lstrcmpi(temporary,"Try")==0) return COM_TRY;
    7778    if(lstrcmpi(temporary,"Type")==0) return COM_TYPE;
    7879    if(lstrcmpi(temporary,"While")==0) return COM_WHILE;
     
    150151            lstrcpy(buffer,"End Sub");
    151152            break;
     153        case COM_TRY:
     154            lstrcpy(buffer,"End Try");
     155            break;
    152156        case COM_TYPE:
    153157            lstrcpy(buffer,"End Type");
     
    317321        ComplementWndInfo.pMemberInfo[1].dwProc=0;
    318322        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
     323    }
     324    else if(CmdId==COM_TRY){
     325        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
     326        ComplementWndInfo.MemberNum=3;
     327
     328        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
     329        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Try");
     330        ComplementWndInfo.pMemberInfo[0].dwProc=0;
     331        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
     332
     333        ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,10);
     334        lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Catch");
     335        ComplementWndInfo.pMemberInfo[1].dwProc=0;
     336        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
     337
     338        ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,8);
     339        lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Finally");
     340        ComplementWndInfo.pMemberInfo[2].dwProc=0;
     341        ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
    319342    }
    320343    else{
  • trunk/abdev/ProjectEditor/SubOperation.cpp

    r350 r364  
    439439        case COM_SELECT:
    440440        case COM_SUB:
     441        case COM_TRY:
    441442        case COM_TYPE:
    442443        case COM_TYPEDEF:
     
    465466    }
    466467    else if(str[0]=='c'||str[0]=='C'){
     468        if(lstrcmpi(str,"Catch")==0) return -1;
    467469        if(lstrcmpi(str,"Case")==0) return -1;
    468470        if(lstrcmp(str,"Char")==0) return -1;
     
    508510        if(lstrcmp(str,"False")==0) return -1;
    509511        if(lstrcmpi(str,"Field")==0) return COM_FIELD;
     512        if(lstrcmpi(str,"Finally")==0) return -1;
    510513        if(lstrcmpi(str,"For")==0) return COM_FOR;
    511514        if(lstrcmpi(str,"Function")==0) return COM_FUNCTION;
     
    583586        if(lstrcmpi(str,"Then")==0) return -1;
    584587        if(lstrcmpi(str,"This")==0) return -1;
     588        if(lstrcmpi(str,"Throw")==0) return -1;
    585589        if(lstrcmp(str,"True")==0) return -1;
     590        if(lstrcmp(str,"Try")==0) return COM_TRY;
    586591        if(lstrcmpi(str,"Type")==0) return COM_TYPE;
    587592        if(lstrcmpi(str,"TypeDef")==0) return COM_TYPEDEF;
  • trunk/abdev/ProjectEditor/TextEditor_KeyEvent.cpp

    r118 r364  
    8282        lstrcmpi(temporary,"Private")==0||
    8383        lstrcmpi(temporary,"Protected")==0||
    84         lstrcmpi(temporary,"Public")==0
     84        lstrcmpi(temporary,"Public")==0||
     85
     86        lstrcmpi(temporary,"Try")==0||
     87        lstrcmpi(temporary,"Catch")==0||
     88        lstrcmpi(temporary,"Finally")==0
    8589        ) return 1;
    8690    else if(lstrcmpi(temporary,"Select")==0) return 2;
     
    135139        lstrcmpi(temporary,"Private")==0||
    136140        lstrcmpi(temporary,"Protected")==0||
    137         lstrcmpi(temporary,"Public")==0
     141        lstrcmpi(temporary,"Public")==0||
     142
     143        lstrcmpi(temporary,"Catch")==0||
     144        lstrcmpi(temporary,"Finally")==0
    138145        ) return 1;
    139146    else if(lstrcmpi(temporary,"EndSelect")==0) return 2;
     
    816823    if(
    817824        pobj_nv->BackNum_PairStatementComplement&&
    818         (nVirtualKey=='c'||nVirtualKey=='C'||       //Case
     825        (nVirtualKey=='c'||nVirtualKey=='C'||       //Case、Catch
    819826        nVirtualKey=='e'||nVirtualKey=='E'||        //End ~
     827        nVirtualKey=='f'||nVirtualKey=='F'||        //Finally
    820828        nVirtualKey=='l'||nVirtualKey=='L'||        //Loop
    821829        nVirtualKey=='n'||nVirtualKey=='N'||        //Next
Note: See TracChangeset for help on using the changeset viewer.