Changeset 247 in dev for trunk/abdev/BasicCompiler32


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

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

Location:
trunk/abdev/BasicCompiler32
Files:
2 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
Note: See TracChangeset for help on using the changeset viewer.