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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.