Changeset 247 in dev for trunk/abdev


Ignore:
Timestamp:
Jul 28, 2007, 4:17:56 PM (17 years ago)
Author:
dai_9181
Message:

Exit Subスケジュールをリファクタリングした

Location:
trunk/abdev
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r246 r247  
    413413
    414414    //プロシージャ抜け出しスケジュール(Exit Sub/Function)
    415     extern DWORD *pExitSubSchedule;
    416     extern int ExitSubScheduleNum;
    417     pExitSubSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    418     ExitSubScheduleNum=0;
     415    compiler.codeGenerator.exitSubCodePositions.clear();
     416    compiler.codeGenerator._exitSubCodePositions_ObpOld.clear();
    419417
    420418    //ラベル用のメモリを確保
     
    620618
    621619    //プロシージャ抜け出しスケジュール(Exit Sub/Function)
    622     for(i3=0;i3<ExitSubScheduleNum;i3++){
    623         *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
    624     }
    625     HeapDefaultFree(pExitSubSchedule);
     620    compiler.codeGenerator.ResolveExitSubSchedule();
    626621
    627622    if(bDebugCompile&&bDebugSupportProc==0){
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r246 r247  
    580580void OpcodeDo(char *Parameter){
    581581    extern HANDLE hHeap;
    582     int i,i2,i3,i4;
     582    int i,i2,i3;
    583583
    584584    if(Parameter[0]) SetError(10,"Do",cp);
     
    702702
    703703                //jne
    704                 OpBuffer[obp++]=(char)0x0F;
    705                 OpBuffer[obp++]=(char)0x85;
    706                 obp+=sizeof(long);
    707                 i2=obp;
    708 
     704                const CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    709705
    710706                //cmp ebx,0
     
    712708
    713709                //jne
    714                 OpBuffer[obp++]=(char)0x0F;
    715                 OpBuffer[obp++]=(char)0x85;
    716                 obp+=sizeof(long);
    717                 i4=obp;
    718 
     710                const CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    719711
    720712                if(basbuf[i3]=='0'){
     
    724716                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
    725717
    726                     *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
    727                     *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
     718                    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     719                    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    728720                }
    729721                else if(basbuf[i3]=='1'){
     
    731723
    732724                    //jmp 2(ループを続ける)
    733                     OpBuffer[obp++]=(char)0xEB;
    734                     OpBuffer[obp++]=(char)0x02;
    735 
    736                     *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
    737                     *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
     725                    const CodeGenerator::PertialSchedule *pTempPertialSchedule3 = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
     726
     727                    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     728                    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    738729
    739730                    //jmp 5(ループ終了)
    740731                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
     732
     733                    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule3 );
    741734                }
    742735            }
     
    791784
    792785void OpcodeExitSub(void){
    793     extern DWORD *pExitSubSchedule;
    794     extern int ExitSubScheduleNum;
    795786    extern HANDLE hHeap;
    796787
     
    804795
    805796    //jmp ...(End Sub/Function)
    806     OpBuffer[obp++]=(char)0xE9;
    807 
    808     pExitSubSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitSubSchedule,(ExitSubScheduleNum+1)*sizeof(DWORD));
    809     pExitSubSchedule[ExitSubScheduleNum]=obp;
    810     ExitSubScheduleNum++;
    811 
    812     obp+=sizeof(long);
     797    compiler.codeGenerator.op_jmp_exitsub();
    813798}
    814799
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r246 r247  
    2828int CaseScheduleNum;
    2929int NowCaseSchedule;
    30 
    31 //プロシージャ抜け出しスケジュール(Exit Sub/Function)
    32 DWORD *pExitSubSchedule;
    33 int ExitSubScheduleNum;
    3430
    3531//グローバル変数初期バッファ
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r246 r247  
    101101public:
    102102
     103    // Exit Subスケジュールの管理
     104    std::vector<long> exitSubCodePositions;
     105    std::vector<int> _exitSubCodePositions_ObpOld;
     106
    103107    // Gotoスケジュールの管理
    104108    std::vector<GotoLabelSchedule> gotoLabelSchedules;
     
    158162        return _continueCodePositions_ObpOld[_continueCodePositions_ObpOld.size()-1];
    159163    }
     164   
     165    void ResolveExitSubSchedule();
    160166
    161167    void CheckUnresolveSchedule();
     
    183189    const PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
    184190    void op_jmp_continue();
     191    void op_jmp_exitsub();
    185192    void op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule );
    186193
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r246 r247  
    33#include <CodeGenerator.h>
    44
     5
     6void CodeGenerator::ResolveExitSubSchedule()
     7{
     8    BOOST_FOREACH( long exitSubCodePosition, exitSubCodePositions )
     9    {
     10        pNativeCode->Overwrite( exitSubCodePosition, (long)( pNativeCode->GetSize()-(exitSubCodePosition+sizeof(long)) ) );
     11    }
     12   
     13    // TODO: 未完成
     14    BOOST_FOREACH( long exitSubCodePositionOld, _exitSubCodePositions_ObpOld )
     15    {
     16        extern int obp;
     17        pNativeCode->OverwriteOld( exitSubCodePositionOld, (long)( obp-(exitSubCodePositionOld+sizeof(long)) ) );
     18    }
     19}
    520
    621void CodeGenerator::CheckUnresolveSchedule()
     
    202217    op_jmp( GetContinueCodePosOld()-obp, sizeof(long), false, true );
    203218}
    204 void CodeGenerator::op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule )
     219void CodeGenerator::op_jmp_exitsub()
    205220{
    206221    // オペコード
    207222    pNativeCode->Put( (char)0xE9 );
    208223
     224    exitSubCodePositions.push_back( pNativeCode->GetSize() );
     225   
     226    extern int obp;
     227    _exitSubCodePositions_ObpOld.push_back( obp );
     228
     229    pNativeCode->Put( (long)0 );
     230}
     231void CodeGenerator::op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule )
     232{
     233    // オペコード
     234    pNativeCode->Put( (char)0xE9 );
     235
    209236    gotoLabelSchedules.push_back( gotoLabelSchedule );
    210237
Note: See TracChangeset for help on using the changeset viewer.