Changeset 34 in dev for BasicCompiler64


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

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

Location:
BasicCompiler64
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/BasicCompiler.vcproj

    r26 r34  
    14821482                    </File>
    14831483                    <File
    1484                         RelativePath="..\BasicCompiler_Common\schedule.h"
     1484                        RelativePath="..\BasicCompiler_Common\PESchedule.h"
     1485                        >
     1486                    </File>
     1487                    <File
     1488                        RelativePath="..\BasicCompiler_Common\Schedule.cpp"
     1489                        >
     1490                    </File>
     1491                    <File
     1492                        RelativePath="..\BasicCompiler_Common\Schedule.h"
    14851493                        >
    14861494                    </File>
  • BasicCompiler64/Compile_ProcOp.cpp

    r31 r34  
    109109        bCompilingGlobal=1;
    110110
    111         CallDestrouctorsOfScope();
     111        obj_LexScopes.CallDestructorsOfScopeEnd();
    112112
    113113        bCompilingGlobal=bBackCompilingGlobal;
     
    700700    }
    701701
    702     //プロシージャ抜け出しスケジュール(Exit Sub/Function)
    703     for(i3=0;i3<ExitSubScheduleNum;i3++){
    704         *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
    705     }
    706     HeapDefaultFree(pExitSubSchedule);
    707 
    708     if(bDebugCompile&&bDebugSupportProc==0){
    709         //call _DebugSys_EndProc
    710         extern SUBINFO *pSub_DebugSys_EndProc;
    711         op_call(pSub_DebugSys_EndProc);
    712     }
    713 
    714702    //ラベル用のメモリを解放
    715703    for(i3=0;i3<MaxLabelNum;i3++){
     
    744732
    745733    //ローカルオブジェクト(レキシカルスコープレベル=0)の解放処理
    746     CallDestrouctorsOfScope();
     734    obj_LexScopes.CallDestructorsOfScopeEnd();
     735
     736    //プロシージャ抜け出しスケジュール(Exit Sub/Function)
     737    for(i3=0;i3<ExitSubScheduleNum;i3++){
     738        *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
     739    }
     740    HeapDefaultFree(pExitSubSchedule);
     741
     742    if(bDebugCompile&&bDebugSupportProc==0){
     743        //call _DebugSys_EndProc
     744        extern SUBINFO *pSub_DebugSys_EndProc;
     745        op_call(pSub_DebugSys_EndProc);
     746    }
    747747
    748748    if(psi->ReturnType!=-1){
  • BasicCompiler64/Compile_Statement.cpp

    r31 r34  
    191191
    192192    //レキシカルスコープをレベルアップ
    193     obj_LexScopes.LevelUp(obp);
     193    obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
    194194
    195195    i2=CompileBuffer(ESC_ENDIF,0);
    196196
    197197    //レキシカルスコープをレベルダウン
    198     obj_LexScopes.LevelDown();
     198    obj_LexScopes.End();
    199199
    200200
     
    215215
    216216        //レキシカルスコープをレベルアップ
    217         obj_LexScopes.LevelUp(obp);
     217        obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
    218218
    219219        CompileBuffer(ESC_ENDIF,0);
    220220
    221221        //レキシカルスコープをレベルダウン
    222         obj_LexScopes.LevelDown();
     222        obj_LexScopes.End();
    223223
    224224
     
    292292}
    293293void OpcodeWhile(char *Parameter){
    294     extern DWORD *pExitWhileSchedule;
    295     extern int ExitWhileScheduleNum;
    296294    extern HANDLE hHeap;
    297295    int i2;
    298     DWORD *lpdwTemp;
    299     int TempNum;
    300296
    301297    //Continueアドレスのバックアップとセット
     
    321317    pobj_TempSchedule->lock(&je_schedule);
    322318
    323     //ExitWhileスケジュールの準備
    324     lpdwTemp=pExitWhileSchedule;
    325     TempNum=ExitWhileScheduleNum;
    326     pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    327     ExitWhileScheduleNum=0;
    328 
    329319    //レキシカルスコープをレベルアップ
    330     obj_LexScopes.LevelUp(obp);
     320    obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE );
    331321
    332322    //While内をコンパイル
    333323    CompileBuffer(0,COM_WEND);
    334324
    335     CallDestrouctorsOfScope();
     325    obj_LexScopes.CallDestructorsOfScopeEnd();
    336326
    337327    //jmp ...
     
    342332    pobj_TempSchedule->unlock();
    343333
    344     //ExitWhileスケジュール
    345     for(i2=0;i2<ExitWhileScheduleNum;i2++){
    346         *((long *)(OpBuffer+pExitWhileSchedule[i2]))=obp-(pExitWhileSchedule[i2]+sizeof(long));
    347     }
    348     HeapDefaultFree(pExitWhileSchedule);
    349     pExitWhileSchedule=lpdwTemp;
    350     ExitWhileScheduleNum=TempNum;
    351 
    352334    //レキシカルスコープをレベルダウン
    353     obj_LexScopes.LevelDown();
     335    obj_LexScopes.End();
    354336
    355337    *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
     
    359341    dwContinueAddress=dwTempContinue;
    360342}
    361 void OpcodeExitWhile(void){
    362     extern DWORD *pExitWhileSchedule;
    363     extern int ExitWhileScheduleNum;
    364     extern HANDLE hHeap;
    365 
    366     if(!pExitWhileSchedule){
    367         SetError(12,"Exit While",cp);
    368         return;
    369     }
    370 
    371     //jmp ...(Wend addr)
    372     OpBuffer[obp++]=(char)0xE9;
    373 
    374     pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD));
    375     pExitWhileSchedule[ExitWhileScheduleNum]=obp;
    376     ExitWhileScheduleNum++;
    377 
    378     obp+=sizeof(long);
    379 }
     343
    380344char szNextVariable[VN_SIZE];
    381345void OpcodeFor(char *Parameter){
    382     extern DWORD *pExitForSchedule;
    383     extern int ExitForScheduleNum;
    384346    extern HANDLE hHeap;
    385     DWORD *lpdwTemp;
    386     int TempNum;
    387347    int i,i2,i3;
    388348    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
     349    bool isError = false;
    389350
    390351    //第1パラメータを取得
     
    392353    if(!Parameter[i]){
    393354        SetError(12,"For",cp);
     355        isError = true;
    394356        goto ErrorStep;
    395357    }
     
    405367        if(temporary[i2]=='\0'){
    406368            SetError(12,"For",cp);
     369            isError = true;
    407370            goto ErrorStep;
    408371        }
     
    488451    pobj_TempSchedule->lock(&je_schedule);
    489452
    490     //ExitForスケジュールの準備
    491     lpdwTemp=pExitForSchedule;
    492     TempNum=ExitForScheduleNum;
    493     pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    494     ExitForScheduleNum=0;
    495 
    496453    //レキシカルスコープをレベルアップ
    497     obj_LexScopes.LevelUp(obp);
     454    obj_LexScopes.Start( obp, SCOPE_TYPE_FOR );
    498455
    499456    //For内をコンパイル
    500457    CompileBuffer(0,COM_NEXT);
    501458
    502     CallDestrouctorsOfScope();
     459    obj_LexScopes.CallDestructorsOfScopeEnd();
    503460
    504461    if(szNextVariable[0]){
     
    512469    *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    513470    obp+=sizeof(long);
    514     pobj_TempSchedule->unlock();
    515     pobj_TempSchedule->unlock();
    516 
    517     //ExitForスケジュール
    518     for(i=0;i<ExitForScheduleNum;i++){
    519         *((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long));
    520     }
    521     HeapDefaultFree(pExitForSchedule);
    522     pExitForSchedule=lpdwTemp;
    523     ExitForScheduleNum=TempNum;
     471    if( isError == false ){
     472        pobj_TempSchedule->unlock();
     473        pobj_TempSchedule->unlock();
     474    }
    524475
    525476    //レキシカルスコープをレベルダウン
    526     obj_LexScopes.LevelDown();
     477    obj_LexScopes.End();
    527478
    528479    *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
     
    532483    dwContinueAddress=dwTempContinue;
    533484}
    534 void OpcodeExitFor(void){
    535     extern DWORD *pExitForSchedule;
    536     extern int ExitForScheduleNum;
    537     extern HANDLE hHeap;
    538 
    539     if(!pExitForSchedule){
    540         SetError(12,"Exit For",cp);
    541         return;
    542     }
    543 
    544     //jmp ...(Next addr)
    545     OpBuffer[obp++]=(char)0xE9;
    546 
    547     pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));
    548     pExitForSchedule[ExitForScheduleNum]=obp;
    549     ExitForScheduleNum++;
    550 
    551     obp+=sizeof(long);
    552 }
    553485
    554486void OpcodeDo(char *Parameter){
    555     extern DWORD *pExitDoSchedule;
    556     extern int ExitDoScheduleNum;
    557487    extern HANDLE hHeap;
    558488    int i,i2,i3;
    559     DWORD *lpdwTemp;
    560     int TempNum;
    561489
    562490    if(Parameter[0]) SetError(10,"Do",cp);
    563 
    564     //ExitDoスケジュールの準備
    565     lpdwTemp=pExitDoSchedule;
    566     TempNum=ExitDoScheduleNum;
    567     pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    568     ExitDoScheduleNum=0;
    569491
    570492    //Continueアドレスのバックアップとセット
     
    577499
    578500    //レキシカルスコープをレベルアップ
    579     obj_LexScopes.LevelUp(obp);
     501    obj_LexScopes.Start( obp, SCOPE_TYPE_DO );
    580502
    581503    //Do内をコンパイル
    582504    CompileBuffer(0,COM_LOOP);
    583505
    584     CallDestrouctorsOfScope();
     506    obj_LexScopes.CallDestructorsOfScopeEnd();
    585507
    586508    extern char *basbuf;
     
    637559    pobj_TempSchedule->lock(&je_schedule);
    638560
    639     //ExitDoスケジュール
    640     for(i=0;i<ExitDoScheduleNum;i++){
    641         *((long *)(OpBuffer+pExitDoSchedule[i]))=obp-(pExitDoSchedule[i]+sizeof(long));
    642     }
    643     HeapDefaultFree(pExitDoSchedule);
    644     pExitDoSchedule=lpdwTemp;
    645     ExitDoScheduleNum=TempNum;
    646 
    647561    //レキシカルスコープをレベルダウン
    648     obj_LexScopes.LevelDown();
     562    obj_LexScopes.End();
    649563
    650564    *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値
     
    653567    //Continueアドレスを復元
    654568    dwContinueAddress=dwTempContinue;
    655 }
    656 void OpcodeExitDo(void){
    657     extern HANDLE hHeap;
    658     extern DWORD *pExitDoSchedule;
    659     extern int ExitDoScheduleNum;
    660 
    661     if(!pExitDoSchedule){
    662         SetError(12,"Exit Do",cp);
    663         return;
    664     }
    665 
    666     //jmp ...(Loop addr)
    667     OpBuffer[obp++]=(char)0xE9;
    668 
    669     pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));
    670     pExitDoSchedule[ExitDoScheduleNum]=obp;
    671     ExitDoScheduleNum++;
    672 
    673     obp+=sizeof(long);
    674569}
    675570void OpcodeContinue(void){
     
    698593        return;
    699594    }
     595
     596    //未解放のローカルオブジェクトのデストラクタを呼び出す
     597    obj_LexScopes.CallDestructorsOfReturn();
    700598
    701599    //jmp ...(End Sub/Function)
     
    938836
    939837    //レキシカルスコープをレベルアップ
    940     obj_LexScopes.LevelUp(obp);
     838    obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
    941839
    942840    //Select Case内をコンパイル
     
    955853
    956854    //レキシカルスコープをレベルダウン
    957     obj_LexScopes.LevelDown();
     855    obj_LexScopes.End();
    958856
    959857    pCaseSchedule=temp_pCaseSchedule;
     
    1051949    extern BOOL bCompilingGlobal;
    1052950    if(bCompilingGlobal){
    1053         //Gosub~Returnとして扱う
    1054 
    1055         //mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
    1056         pobj_sf->push(REG_NON);
    1057         pobj_sf->ref(REG_RAX);
    1058         pobj_sf->pop(REG_NON);
    1059 
    1060         //jmp rax
    1061         OpBuffer[obp++]=(char)0xFF;
    1062         OpBuffer[obp++]=(char)0xE0;
     951        SetError(62,NULL,cp);
    1063952    }
    1064953    else{
  • BasicCompiler64/Compile_Var.cpp

    r28 r34  
    408408
    409409        for(i=MaxLocalVarNum-1;i>=0;i--){   //レキシカルスコープを考慮してバックサーチ
    410             if(LocalVar[i].bLiving){
    411                 if(lstrcmp(VarName,LocalVar[i].name)==0) break;
     410            if( LocalVar[i].bLiving                                         //現在のスコープで有効なもの
     411                && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     412                ){
     413                    if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    412414            }
    413415        }
     
    564566
    565567    for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    566         if(GlobalVar[i].bLiving){
    567             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
     568        if( GlobalVar[i].bLiving                                        //現在のスコープで有効なもの
     569            && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()   //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     570            ){
     571                if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    568572        }
    569573    }
  • BasicCompiler64/Opcode.h

    r31 r34  
    411411void OpcodeGoto(char *Parameter);
    412412void OpcodeWhile(char *Parameter);
    413 void OpcodeExitWhile(void);
    414413void OpcodeFor(char *Parameter);
    415 void OpcodeExitFor(void);
    416414void OpcodeDo(char *Parameter);
    417 void OpcodeExitDo(void);
    418415void OpcodeContinue(void);
    419416void OpcodeExitSub(void);
Note: See TracChangeset for help on using the changeset viewer.