Ignore:
Timestamp:
Jul 27, 2007, 12:06:11 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r236 r241  
    126126
    127127void OpcodeIf(char *Parameter){
    128     int i,i2,i3,i4;
     128    int i,i2;
    129129    Type tempType;
    130130
     
    140140    }
    141141
     142    CodeGenerator::PertialSchedule *pIfPertialSchedule = NULL;
    142143    if( !NumOpe(Parameter,Type(),tempType) ){
    143144        //NumOpe内でエラー
    144         i3=-1;  //ダミー
    145145    }
    146146    else if( tempType.IsDouble() ){
     
    167167
    168168        //jne (endif、または else まで)
    169         OpBuffer[obp++]=(char)0x0F;
    170         OpBuffer[obp++]=(char)0x85;
    171         obp+=sizeof(long);
    172 
    173         //jneの番地
    174         i3=obp;
     169        pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    175170    }
    176171    else if( tempType.IsSingle() ){
     
    197192
    198193        //jne (endif、または else まで)
    199         OpBuffer[obp++]=(char)0x0F;
    200         OpBuffer[obp++]=(char)0x85;
    201         obp+=sizeof(long);
    202 
    203         //jneの番地
    204         i3=obp;
     194        pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    205195    }
    206196    else if( tempType.Is64() ){
     
    217207
    218208        //jne
    219         OpBuffer[obp++]=(char)0x0F;
    220         OpBuffer[obp++]=(char)0x85;
    221         obp+=sizeof(long);
    222         i3=obp;
    223 
     209        CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    224210
    225211        //cmp ebx,0
     
    227213
    228214        //jne
    229         OpBuffer[obp++]=(char)0x0F;
    230         OpBuffer[obp++]=(char)0x85;
    231         obp+=sizeof(long);
    232         i4=obp;
    233 
    234 
     215        CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    235216
    236217        //jmp (endif、または else までジャンプ)
    237         OpBuffer[obp++]=(char)0xE9;
    238         obp+=sizeof(long);
    239 
    240         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
    241         *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
    242 
    243         //jmpの番地
    244         i3=obp;
     218        pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     219
     220        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     221        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    245222    }
    246223    else{
     
    254231
    255232        //je (endif、または else まで条件ジャンプ)
    256         OpBuffer[obp++]=(char)0x0F;
    257         OpBuffer[obp++]=(char)0x84;
    258         obp+=sizeof(long);
    259 
    260         //jeの番地
    261         i3=obp;
     233        pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    262234    }
    263235
     
    276248
    277249
    278     if(i3==-1) return;
     250    if( pIfPertialSchedule == NULL ) return;
    279251
    280252    if(i2==ESC_ELSE){
    281253        //jmp (endifまで)
    282         OpBuffer[obp++]=(char)0xE9;
    283         obp+=sizeof(long);
    284 
    285         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //ifからelseへのジャンプ先のオフセット値
    286 
    287         i3=obp;
     254        CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     255
     256        compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
    288257
    289258
     
    301270
    302271
    303         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //jmpジャンプ先のオフセット値
     272        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    304273    }
    305274    else{
    306         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //jeジャンプ先のオフセット値
     275        compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
    307276    }
    308277}
     
    371340void OpcodeWhile(char *Parameter){
    372341    extern HANDLE hHeap;
    373     int i2,i3 = 0;
    374342
    375343    //Continueアドレスのバックアップとセット
    376     extern DWORD dwContinueAddress;
    377     DWORD dwTempContinue;
    378     dwTempContinue=dwContinueAddress;
    379     dwContinueAddress=obp;
     344    compiler.codeGenerator.ContinueAreaBegin();
    380345
    381346    if(!Parameter[0]) SetError(10,"While",cp);
    382347
    383     int je_schedule;
     348    CodeGenerator::PertialSchedule *pWhilePertialSchedule = NULL;
    384349    Type tempType;
    385350    if( !NumOpe(Parameter,Type(),tempType) ){
    386351        //ダミー
    387         i3=-1;
    388352    }
    389353    else if( tempType.IsDouble() ){
     
    410374
    411375        //jne (Wend まで)
    412         OpBuffer[obp++]=(char)0x0F;
    413         OpBuffer[obp++]=(char)0x85;
    414         obp+=sizeof(long);
    415 
    416         //jeの番地
    417         je_schedule=obp;
     376        pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    418377    }
    419378    else if( tempType.IsSingle() ){
     
    436395        compiler.codeGenerator.op_fnstsw_ax();
    437396
    438         //test ah,40
     397        //test ah,40h
    439398        compiler.codeGenerator.op_test_ah( (char)0x40 );
    440399
    441400        //jne (Wend まで)
    442         OpBuffer[obp++]=(char)0x0F;
    443         OpBuffer[obp++]=(char)0x85;
    444         obp+=sizeof(long);
    445 
    446         //jeの番地
    447         je_schedule=obp;
     401        pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    448402    }
    449403    else if( tempType.Is64() ){
     
    460414
    461415        //jne
    462         OpBuffer[obp++]=(char)0x0F;
    463         OpBuffer[obp++]=(char)0x85;
    464         obp+=sizeof(long);
    465         i2=obp;
    466 
     416        CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    467417
    468418        //cmp ebx,0
     
    470420
    471421        //jne
    472         OpBuffer[obp++]=(char)0x0F;
    473         OpBuffer[obp++]=(char)0x85;
    474         obp+=sizeof(long);
    475         i3=obp;
    476 
    477 
    478         //jmp (endif、または else までジャンプ)
    479         OpBuffer[obp++]=(char)0xE9;
    480         obp+=sizeof(long);
    481 
    482         *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
    483         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
    484 
    485         //jmpの番地
    486         je_schedule=obp;
     422        CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     423
     424        //jmp (Wendまでジャンプ)
     425        pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     426
     427        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     428        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    487429    }
    488430    else{
     
    496438
    497439        //je (Wend まで)
    498         OpBuffer[obp++]=(char)0x0F;
    499         OpBuffer[obp++]=(char)0x84;
    500         obp+=sizeof(long);
    501 
    502         //実行中の番地
    503         je_schedule=obp;
     440        pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    504441    }
    505442
     
    512449    GetLexicalScopes().CallDestructorsOfScopeEnd();
    513450
    514     if( i3 == -1 ){
    515         return;
    516     }
    517 
    518451    //jmp ...
    519     OpBuffer[obp++]=(char)0xE9;
    520     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    521     obp+=sizeof(long);
     452    compiler.codeGenerator.op_jmp_continue();
    522453
    523454    //レキシカルスコープをレベルダウン
    524455    GetLexicalScopes().End();
    525456
    526     *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
    527 
    528     //Continueアドレスを復元
    529     dwContinueAddress=dwTempContinue;
     457    if( pWhilePertialSchedule )
     458    {
     459        compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
     460    }
     461
     462    compiler.codeGenerator.ContinueAreaEnd();
    530463}
    531464
     
    533466void OpcodeFor(char *Parameter){
    534467    extern HANDLE hHeap;
    535     int i,i2,i3;
     468    int i,i2;
    536469    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
    537470
     
    559492
    560493    //jmp ...
    561     OpBuffer[obp++]=(char)0xE9;
    562     i2=obp;
    563     obp+=sizeof(long);
     494    CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
    564495
    565496    //Continueアドレスのバックアップとセット
    566     extern DWORD dwContinueAddress;
    567     DWORD dwTempContinue;
    568     dwTempContinue=dwContinueAddress;
    569     dwContinueAddress=obp;
     497    compiler.codeGenerator.ContinueAreaBegin();
    570498
    571499    //第2パラメータを取得(to~)
     
    583511    OpcodeCalc(temporary);
    584512
    585     *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
     513    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    586514
    587515    //増加か減少かを区別する
     
    596524
    597525    //je [カウンタ減少の場合の判定]
    598     OpBuffer[obp++]=(char)0x0F;
    599     OpBuffer[obp++]=(char)0x84;
    600     i2=obp;
    601     obp+=sizeof(long);
     526    pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    602527
    603528    //判定(カウンタ増加の場合)
     
    609534
    610535    //jmp [カウンタ減少の場合の判定を飛び越す]
    611     OpBuffer[obp++]=(char)0xE9;
    612     i3=obp;
    613     obp+=sizeof(long);
    614 
    615     *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
     536    CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     537
     538    //jeジャンプ先のオフセット値
     539    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    616540
    617541    //判定(カウンタ減少の場合)
     
    622546    compiler.codeGenerator.op_pop(REG_EAX);
    623547
    624     *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
     548    //jmpジャンプ先のオフセット値
     549    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    625550
    626551    //cmp eax,0
     
    630555
    631556    //je ...
    632     OpBuffer[obp++]=(char)0x0F;
    633     OpBuffer[obp++]=(char)0x84;
    634     int je_schedule=obp;
    635     obp+=sizeof(long);
     557    pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    636558
    637559    //レキシカルスコープをレベルアップ
     
    650572
    651573    //jmp ...
    652     OpBuffer[obp++]=(char)0xE9;
    653     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    654     obp+=sizeof(long);
     574    compiler.codeGenerator.op_jmp_continue();
    655575
    656576    //レキシカルスコープをレベルダウン
    657577    GetLexicalScopes().End();
    658578
    659     *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
     579    //jeジャンプ先のオフセット値
     580    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    660581
    661582    //Continueアドレスを復元
    662     dwContinueAddress=dwTempContinue;
     583    compiler.codeGenerator.ContinueAreaEnd();
    663584}
    664585
     
    670591
    671592    //Continueアドレスのバックアップとセット
    672     extern DWORD dwContinueAddress;
    673     DWORD dwTempContinue;
    674     dwTempContinue=dwContinueAddress;
    675     dwContinueAddress=obp;
     593    compiler.codeGenerator.ContinueAreaBegin();
    676594
    677595    //レキシカルスコープをレベルアップ
     
    682600
    683601    GetLexicalScopes().CallDestructorsOfScopeEnd();
     602
     603    CodeGenerator::PertialSchedule *pDoPertialSchedule = NULL;
    684604
    685605    extern char *basbuf;
     
    731651
    732652                    //jne 5(ループ終了)
    733                     OpBuffer[obp++]=(char)0x75;
    734                     OpBuffer[obp++]=(char)0x05;
     653                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    735654                }
    736655                else if(basbuf[i3]=='1'){
     
    738657
    739658                    //je 5(ループ終了)
    740                     OpBuffer[obp++]=(char)0x74;
    741                     OpBuffer[obp++]=(char)0x05;
     659                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    742660                }
    743661            }
     
    768686
    769687                    //jne 5(ループ終了)
    770                     OpBuffer[obp++]=(char)0x75;
    771                     OpBuffer[obp++]=(char)0x05;
     688                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    772689                }
    773690                else if(basbuf[i3]=='1'){
     
    775692
    776693                    //je 5(ループ終了)
    777                     OpBuffer[obp++]=(char)0x74;
    778                     OpBuffer[obp++]=(char)0x05;
     694                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    779695                }
    780696            }
     
    812728
    813729                    //jmp 5(ループ終了)
    814                     OpBuffer[obp++]=(char)0xEB;
    815                     OpBuffer[obp++]=(char)0x05;
     730                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
    816731
    817732                    *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
     
    829744
    830745                    //jmp 5(ループ終了)
    831                     OpBuffer[obp++]=(char)0xEB;
    832                     OpBuffer[obp++]=(char)0x05;
     746                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
    833747                }
    834748            }
     
    844758
    845759                    //je 5(ループ終了)
    846                     OpBuffer[obp++]=(char)0x74;
    847                     OpBuffer[obp++]=(char)0x05;
     760                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    848761                }
    849762                else if(basbuf[i3]=='1'){
     
    851764
    852765                    //jne 5(ループ終了)
    853                     OpBuffer[obp++]=(char)0x75;
    854                     OpBuffer[obp++]=(char)0x05;
     766                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    855767                }
    856768            }
     
    860772
    861773    //jmp ...
    862     OpBuffer[obp++]=(char)0xE9;
    863     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    864     obp+=sizeof(long);
     774    compiler.codeGenerator.op_jmp_continue();
     775
     776    if( pDoPertialSchedule )
     777    {
     778        compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
     779    }
    865780
    866781    //jmp ...
     
    876791
    877792    //Continueアドレスを復元
    878     dwContinueAddress=dwTempContinue;
     793    compiler.codeGenerator.ContinueAreaEnd();
    879794}
    880795void OpcodeContinue(void){
    881     extern DWORD dwContinueAddress;
    882 
    883     if(dwContinueAddress==-1){
    884         SetError(12,"Continue",cp);
    885         return;
    886     }
    887 
    888796    //jmp ...(Continue addr)
    889     OpBuffer[obp++]=(char)0xE9;
    890 
    891     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    892     obp+=sizeof(long);
     797    compiler.codeGenerator.op_jmp_continue();
    893798}
    894799
Note: See TracChangeset for help on using the changeset viewer.