Changeset 246 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Jul 28, 2007, 1:30:22 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler32
Files:
4 edited

Legend:

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

    r241 r246  
    425425
    426426    //Gotoラベルスケジュール
    427     extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
    428     extern int GotoLabelScheduleNum;
    429     pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
    430     GotoLabelScheduleNum=0;
     427    compiler.codeGenerator.gotoLabelSchedules.clear();
    431428
    432429    //With情報のメモリを確保
     
    608605    HeapDefaultFree(pLabelNames);
    609606
    610     //Goto未知ラベルスケジュールを解放
    611     for(i3=0;i3<GotoLabelScheduleNum;i3++){
    612         if(pGotoLabelSchedule[i3].pName){
    613             SetError(6,pGotoLabelSchedule[i3].pName,pGotoLabelSchedule[i3].now_cp);
    614             HeapDefaultFree(pGotoLabelSchedule[i3].pName);
    615         }
    616         else{
    617             sprintf(temporary,"%d",pGotoLabelSchedule[i3].line);
    618             SetError(6,temporary,pGotoLabelSchedule[i3].now_cp);
    619         }
    620     }
    621     HeapDefaultFree(pGotoLabelSchedule);
    622 
    623607    //With情報のメモリを解放
    624608    for(i3=0;i3<WithInfo.num;i3++){
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r245 r246  
    300300void OpcodeGoto(char *Parameter){
    301301    extern HANDLE hHeap;
    302     extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
    303     extern int GotoLabelScheduleNum;
    304302    int i,LineNum;
    305303
     
    307305        i=GetLabelAddress(Parameter+1,0);
    308306
    309         //jmp ...
    310         OpBuffer[obp++]=(char)0xE9;
    311         if(i==-1){
    312             pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
    313             pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
    314             lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
    315             pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
    316             pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
    317             GotoLabelScheduleNum++;
    318         }
    319         *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
    320         obp+=sizeof(long);
     307        if( i == -1 )
     308        {
     309            //jmp ...(schedule)
     310            compiler.codeGenerator.op_jmp_goto_schedule( GotoLabelSchedule( (const std::string)(Parameter + 1), obp, cp ) );
     311        }
     312        else
     313        {
     314            //jmp ...
     315            compiler.codeGenerator.op_jmp( i-obp, sizeof(long), false, true );
     316        }
    321317    }
    322318    else{
     
    324320        i=GetLabelAddress(0,LineNum);
    325321
    326         //jmp ...
    327         OpBuffer[obp++]=(char)0xE9;
    328         if(i==-1){
    329             pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
    330             pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
    331             pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
    332             pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
    333             pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
    334             GotoLabelScheduleNum++;
    335         }
    336         *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
    337         obp+=sizeof(long);
     322        if( i == -1 )
     323        {
     324            //jmp ...(schedule)
     325            compiler.codeGenerator.op_jmp_goto_schedule( GotoLabelSchedule( LineNum, obp, cp ) );
     326        }
     327        else
     328        {
     329            //jmp ...
     330            compiler.codeGenerator.op_jmp( i-obp, sizeof(long), false, true );
     331        }
    338332    }
    339333}
     
    11261120void OpcodeGosub(char *Parameter){
    11271121    extern HANDLE hHeap;
    1128     extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
    1129     extern int GotoLabelScheduleNum;
    11301122    int i,LineNum;
    11311123
     
    11331125        i=GetLabelAddress(Parameter+1,0);
    11341126
    1135         //call ...
    1136         OpBuffer[obp++]=(char)0xE8;
    1137         if(i==-1){
    1138             pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
    1139             pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
    1140             lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
    1141             pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
    1142             pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
    1143             GotoLabelScheduleNum++;
    1144         }
    1145         *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
    1146         obp+=sizeof(long);
     1127        if( i == -1 )
     1128        {
     1129            //jmp ...(schedule)
     1130            compiler.codeGenerator.op_jmp_goto_schedule( GotoLabelSchedule( (const std::string)(Parameter + 1), obp, cp ) );
     1131        }
     1132        else
     1133        {
     1134            //jmp ...
     1135            compiler.codeGenerator.op_jmp( i-obp, sizeof(long), false, true );
     1136        }
    11471137    }
    11481138    else{
     
    11501140        i=GetLabelAddress(0,LineNum);
    11511141
    1152         //call ...
    1153         OpBuffer[obp++]=(char)0xE8;
    1154         if(i==-1){
    1155             pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
    1156             pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
    1157             pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
    1158             pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
    1159             pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
    1160             GotoLabelScheduleNum++;
    1161         }
    1162         *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
    1163         obp+=sizeof(long);
     1142        if( i == -1 )
     1143        {
     1144            //jmp ...(schedule)
     1145            compiler.codeGenerator.op_jmp_goto_schedule( GotoLabelSchedule( LineNum, obp, cp ) );
     1146        }
     1147        else
     1148        {
     1149            //jmp ...
     1150            compiler.codeGenerator.op_jmp( i-obp, sizeof(long), false, true );
     1151        }
    11641152    }
    11651153}
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r244 r246  
    422422
    423423        //Gotoラベルスケジュール
    424         extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
    425         extern int GotoLabelScheduleNum;
    426         pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
    427         GotoLabelScheduleNum=0;
     424        compiler.codeGenerator.gotoLabelSchedules.clear();
    428425
    429426        //With情報のメモリを確保
     
    473470        HeapDefaultFree(pLabelNames);
    474471
    475         //Goto未知ラベルスケジュールを解放
    476         for(i=0;i<GotoLabelScheduleNum;i++){
    477             if(pGotoLabelSchedule[i].pName){
    478                 SetError(6,pGotoLabelSchedule[i].pName,pGotoLabelSchedule[i].now_cp);
    479                 HeapDefaultFree(pGotoLabelSchedule[i].pName);
     472        //Goto未知ラベルスケジュールが存在したらエラーにする
     473        BOOST_FOREACH( const GotoLabelSchedule &gotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
     474        {
     475            if(gotoLabelSchedule.GetName().size()>0){
     476                SetError(6,gotoLabelSchedule.GetName(),gotoLabelSchedule.GetSourceCodePos());
    480477            }
    481478            else{
    482                 sprintf(temporary,"%d",pGotoLabelSchedule[i].line);
    483                 SetError(6,temporary,pGotoLabelSchedule[i].now_cp);
     479                sprintf(temporary,"%d",gotoLabelSchedule.GetLineNum());
     480                SetError(6,temporary,gotoLabelSchedule.GetSourceCodePos());
    484481            }
    485482        }
    486         HeapDefaultFree(pGotoLabelSchedule);
    487483
    488484
  • trunk/abdev/BasicCompiler32/Opcode.h

    r225 r246  
    2727    int line;
    2828    DWORD address;
    29 };
    30 
    31 //Goto未知ラベル
    32 struct GOTOLABELSCHEDULE{
    33     char *pName;
    34     int line;
    35     DWORD pos;
    36     DWORD now_cp;
    3729};
    3830
Note: See TracChangeset for help on using the changeset viewer.