Changeset 34 in dev for BasicCompiler32


Ignore:
Timestamp:
Jan 14, 2007, 6:11:23 AM (18 years ago)
Author:
dai_9181
Message:

スコープ処理を統一した。関数の途中でReturnしても、スコープにあるローカルオブジェクトを正確に破棄できるようにした。

Location:
BasicCompiler32
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/BasicCompiler.vcproj

    r28 r34  
    11681168                    </File>
    11691169                    <File
    1170                         RelativePath="..\BasicCompiler_Common\schedule.h"
     1170                        RelativePath="..\BasicCompiler_Common\PESchedule.h"
    11711171                        >
    11721172                    </File>
  • BasicCompiler32/Compile_ProcOp.cpp

    r31 r34  
    8888        bCompilingGlobal=1;
    8989
    90         CallDestrouctorsOfScope();
     90        obj_LexScopes.CallDestructorsOfScopeEnd();
    9191
    9292        bCompilingGlobal=bBackCompilingGlobal;
     
    658658    }
    659659
    660     //プロシージャ抜け出しスケジュール(Exit Sub/Function)
    661     for(i3=0;i3<ExitSubScheduleNum;i3++){
    662         *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
    663     }
    664     HeapDefaultFree(pExitSubSchedule);
    665 
    666     if(bDebugCompile&&bDebugSupportProc==0){
    667         *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset;
    668 
    669         //call _DebugSys_EndProc
    670         extern SUBINFO *pSub_DebugSys_EndProc;
    671         op_call(pSub_DebugSys_EndProc);
    672     }
    673 
    674660    //ラベル用のメモリを解放
    675661    for(i3=0;i3<MaxLabelNum;i3++){
     
    707693
    708694    //ローカルオブジェクトの解放処理
    709     CallDestrouctorsOfScope();
     695    obj_LexScopes.CallDestructorsOfScopeEnd();
     696
     697    //プロシージャ抜け出しスケジュール(Exit Sub/Function)
     698    for(i3=0;i3<ExitSubScheduleNum;i3++){
     699        *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
     700    }
     701    HeapDefaultFree(pExitSubSchedule);
     702
     703    if(bDebugCompile&&bDebugSupportProc==0){
     704        *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset;
     705
     706        //call _DebugSys_EndProc
     707        extern SUBINFO *pSub_DebugSys_EndProc;
     708        op_call(pSub_DebugSys_EndProc);
     709    }
    710710
    711711    if(psi->ReturnType!=-1){
  • BasicCompiler32/Compile_Statement.cpp

    r31 r34  
    299299
    300300    //レキシカルスコープをレベルアップ
    301     obj_LexScopes.LevelUp(obp);
     301    obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
    302302
    303303    i2=CompileBuffer(ESC_ENDIF,0);
    304304
    305305    //レキシカルスコープをレベルダウン
    306     obj_LexScopes.LevelDown();
     306    obj_LexScopes.End();
    307307
    308308
     
    325325
    326326        //レキシカルスコープをレベルアップ
    327         obj_LexScopes.LevelUp(obp);
     327        obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
    328328
    329329        CompileBuffer(ESC_ENDIF,0);
    330330
    331331        //レキシカルスコープをレベルダウン
    332         obj_LexScopes.LevelDown();
     332        obj_LexScopes.End();
    333333
    334334
     
    402402}
    403403void OpcodeWhile(char *Parameter){
    404     extern DWORD *pExitWhileSchedule;
    405     extern int ExitWhileScheduleNum;
    406404    extern HANDLE hHeap;
    407405    int i2,i3,type;
    408     DWORD *lpdwTemp;
    409     int TempNum;
    410406
    411407    //Continueアドレスのバックアップとセット
     
    550546    }
    551547
    552     //ExitWhileスケジュールの準備
    553     lpdwTemp=pExitWhileSchedule;
    554     TempNum=ExitWhileScheduleNum;
    555     pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    556     ExitWhileScheduleNum=0;
    557 
    558548    //レキシカルスコープをレベルアップ
    559     obj_LexScopes.LevelUp(obp);
     549    obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE );
    560550
    561551    //While内をコンパイル
    562552    CompileBuffer(0,COM_WEND);
    563553
    564     CallDestrouctorsOfScope();
     554    obj_LexScopes.CallDestructorsOfScopeEnd();
    565555
    566556    //jmp ...
     
    569559    obp+=sizeof(long);
    570560
    571     //ExitWhileスケジュール
    572     for(i2=0;i2<ExitWhileScheduleNum;i2++){
    573         *((long *)(OpBuffer+pExitWhileSchedule[i2]))=obp-(pExitWhileSchedule[i2]+sizeof(long));
    574     }
    575     HeapDefaultFree(pExitWhileSchedule);
    576     pExitWhileSchedule=lpdwTemp;
    577     ExitWhileScheduleNum=TempNum;
    578 
    579561    //レキシカルスコープをレベルダウン
    580     obj_LexScopes.LevelDown();
     562    obj_LexScopes.End();
    581563
    582564    *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
     
    585567    dwContinueAddress=dwTempContinue;
    586568}
    587 void OpcodeExitWhile(void){
    588     extern DWORD *pExitWhileSchedule;
    589     extern int ExitWhileScheduleNum;
    590     extern HANDLE hHeap;
    591 
    592     if(!pExitWhileSchedule){
    593         SetError(12,"Exit While",cp);
    594         return;
    595     }
    596 
    597     //jmp ...(Wend addr)
    598     OpBuffer[obp++]=(char)0xE9;
    599 
    600     pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD));
    601     pExitWhileSchedule[ExitWhileScheduleNum]=obp;
    602     ExitWhileScheduleNum++;
    603 
    604     obp+=sizeof(long);
    605 }
     569
    606570char szNextVariable[VN_SIZE];
    607571void OpcodeFor(char *Parameter){
    608     extern DWORD *pExitForSchedule;
    609     extern int ExitForScheduleNum;
    610572    extern HANDLE hHeap;
    611     DWORD *lpdwTemp;
    612     int TempNum;
    613573    int i,i2,i3;
    614574    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
     
    717677    obp+=sizeof(long);
    718678
    719     //ExitForスケジュールの準備
    720     lpdwTemp=pExitForSchedule;
    721     TempNum=ExitForScheduleNum;
    722     pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    723     ExitForScheduleNum=0;
    724 
    725679    //レキシカルスコープをレベルアップ
    726     obj_LexScopes.LevelUp(obp);
     680    obj_LexScopes.Start( obp, SCOPE_TYPE_FOR );
    727681
    728682    //For内をコンパイル
    729683    CompileBuffer(0,COM_NEXT);
    730684
    731     CallDestrouctorsOfScope();
     685    obj_LexScopes.CallDestructorsOfScopeEnd();
    732686
    733687    if(szNextVariable[0]){
     
    742696    obp+=sizeof(long);
    743697
    744     //ExitForスケジュール
    745     for(i=0;i<ExitForScheduleNum;i++){
    746         *((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long));
    747     }
    748     HeapDefaultFree(pExitForSchedule);
    749     pExitForSchedule=lpdwTemp;
    750     ExitForScheduleNum=TempNum;
    751 
    752698    //レキシカルスコープをレベルダウン
    753     obj_LexScopes.LevelDown();
     699    obj_LexScopes.End();
    754700
    755701    *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
     
    758704    dwContinueAddress=dwTempContinue;
    759705}
    760 void OpcodeExitFor(void){
    761     extern DWORD *pExitForSchedule;
    762     extern int ExitForScheduleNum;
    763     extern HANDLE hHeap;
    764 
    765     if(!pExitForSchedule){
    766         SetError(12,"Exit For",cp);
    767         return;
    768     }
    769 
    770     //jmp ...(Next addr)
    771     OpBuffer[obp++]=(char)0xE9;
    772 
    773     pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));
    774     pExitForSchedule[ExitForScheduleNum]=obp;
    775     ExitForScheduleNum++;
    776 
    777     obp+=sizeof(long);
    778 }
    779706
    780707void OpcodeDo(char *Parameter){
    781     extern DWORD *pExitDoSchedule;
    782     extern int ExitDoScheduleNum;
    783708    extern HANDLE hHeap;
    784709    int i,i2,i3,i4,type;
    785     DWORD *lpdwTemp;
    786     int TempNum;
    787710
    788711    if(Parameter[0]) SetError(10,"Do",cp);
    789 
    790     //ExitDoスケジュールの準備
    791     lpdwTemp=pExitDoSchedule;
    792     TempNum=ExitDoScheduleNum;
    793     pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    794     ExitDoScheduleNum=0;
    795712
    796713    //Continueアドレスのバックアップとセット
     
    801718
    802719    //レキシカルスコープをレベルアップ
    803     obj_LexScopes.LevelUp(obp);
     720    obj_LexScopes.Start( obp, SCOPE_TYPE_DO );
    804721
    805722    //Do内をコンパイル
    806723    CompileBuffer(0,COM_LOOP);
    807724
    808     CallDestrouctorsOfScope();
     725    obj_LexScopes.CallDestructorsOfScopeEnd();
    809726
    810727    extern char *basbuf;
     
    1007924    obp+=sizeof(long);
    1008925
    1009     //ExitDoスケジュール
    1010     for(i=0;i<ExitDoScheduleNum;i++){
    1011         *((long *)(OpBuffer+pExitDoSchedule[i]))=obp-(pExitDoSchedule[i]+sizeof(long));
    1012     }
    1013     HeapDefaultFree(pExitDoSchedule);
    1014     pExitDoSchedule=lpdwTemp;
    1015     ExitDoScheduleNum=TempNum;
    1016 
    1017926    //レキシカルスコープをレベルダウン
    1018     obj_LexScopes.LevelDown();
     927    obj_LexScopes.End();
    1019928
    1020929    *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値
     
    1023932    //Continueアドレスを復元
    1024933    dwContinueAddress=dwTempContinue;
    1025 }
    1026 void OpcodeExitDo(void){
    1027     extern HANDLE hHeap;
    1028     extern DWORD *pExitDoSchedule;
    1029     extern int ExitDoScheduleNum;
    1030 
    1031     if(!pExitDoSchedule){
    1032         SetError(12,"Exit Do",cp);
    1033         return;
    1034     }
    1035 
    1036     //jmp ...(Loop addr)
    1037     OpBuffer[obp++]=(char)0xE9;
    1038 
    1039     pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));
    1040     pExitDoSchedule[ExitDoScheduleNum]=obp;
    1041     ExitDoScheduleNum++;
    1042 
    1043     obp+=sizeof(long);
    1044934}
    1045935void OpcodeContinue(void){
     
    1068958        return;
    1069959    }
     960
     961    //未解放のローカルオブジェクトのデストラクタを呼び出す
     962    obj_LexScopes.CallDestructorsOfReturn();
    1070963
    1071964    //jmp ...(End Sub/Function)
     
    13541247
    13551248    //レキシカルスコープをレベルアップ
    1356     obj_LexScopes.LevelUp(obp);
     1249    obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
    13571250
    13581251    //Select Case内をコンパイル
     
    13711264
    13721265    //レキシカルスコープをレベルダウン
    1373     obj_LexScopes.LevelDown();
     1266    obj_LexScopes.End();
    13741267
    13751268    pCaseSchedule=temp_pCaseSchedule;
  • BasicCompiler32/Compile_Var.cpp

    r28 r34  
    381381
    382382        for(i=MaxLocalVarNum-1;i>=0;i--){   //レキシカルスコープを考慮してバックサーチ
    383             if(LocalVar[i].bLiving){
    384                 if(lstrcmp(VarName,LocalVar[i].name)==0) break;
     383            if( LocalVar[i].bLiving                                         //現在のスコープで有効なもの
     384                && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     385                ){
     386                    if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    385387            }
    386388        }
     
    540542
    541543    for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    542         if(GlobalVar[i].bLiving){
    543             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
     544        if( GlobalVar[i].bLiving                                        //現在のスコープで有効なもの
     545            && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()   //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     546            ){
     547                if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    544548        }
    545549    }
  • BasicCompiler32/Opcode.h

    r31 r34  
    247247void OpcodeGoto(char *Parameter);
    248248void OpcodeWhile(char *Parameter);
    249 void OpcodeExitWhile(void);
    250249void OpcodeFor(char *Parameter);
    251 void OpcodeExitFor(void);
    252250void OpcodeDo(char *Parameter);
    253 void OpcodeExitDo(void);
    254251void OpcodeContinue(void);
    255252void OpcodeExitSub(void);
Note: See TracChangeset for help on using the changeset viewer.