Changeset 246 in dev for trunk/abdev/BasicCompiler_Common


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

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r241 r246  
    3232DWORD *pExitSubSchedule;
    3333int ExitSubScheduleNum;
    34 
    35 //Goto未知ラベル スケジュール
    36 GOTOLABELSCHEDULE *pGotoLabelSchedule;
    37 int GotoLabelScheduleNum;
    3834
    3935//グローバル変数初期バッファ
     
    123119void ChangeOpcode(char *Command){
    124120    extern HANDLE hHeap;
    125     int i,i2;
    126121
    127122    if(Command[0]=='\0')
     
    141136
    142137        //書き込みスケジュール
    143         for(i=0;i<GotoLabelScheduleNum;i++){
    144             if(lstrcmp(pGotoLabelSchedule[i].pName,Command+1)==0){
    145                 *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
    146 
    147                 HeapDefaultFree(pGotoLabelSchedule[i].pName);
    148 
     138        std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
     139        while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
     140        {
     141            if( it->GetName() == Command+1 )
     142            {
     143                *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long));
     144               
    149145                //詰める
    150                 GotoLabelScheduleNum--;
    151                 for(i2=i;i2<GotoLabelScheduleNum;i2++){
    152                     pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
    153                     pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
    154                     pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
    155                 }
    156                 i--;
    157                 continue;
     146                it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
     147            }
     148            else
     149            {
     150                it++;
    158151            }
    159152        }
     
    552545
    553546                //書き込みスケジュール
    554                 for(i=0;i<GotoLabelScheduleNum;i++){
    555                     if(pGotoLabelSchedule[i].pName==0&&
    556                         pGotoLabelSchedule[i].line==i3){
    557                         *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
    558 
     547                std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
     548                while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
     549                {
     550                    if( it->GetName().size() == 0 && it->GetLineNum() == i3 )
     551                    {
     552                        *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long));
     553                       
    559554                        //詰める
    560                         GotoLabelScheduleNum--;
    561                         for(i2=i;i2<GotoLabelScheduleNum;i2++){
    562                             pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
    563                             pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
    564                             pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
    565                         }
    566                         i--;
     555                        it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
     556                    }
     557                    else
     558                    {
     559                        it++;
    567560                    }
    568561                }
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r245 r246  
    1212void ReallocNativeCodeBuffer();
    1313
     14//Goto未知ラベル
     15class GotoLabelSchedule
     16{
     17    std::string name;
     18    int line;
     19    int nativeCodePos;
     20    int sourceCodePos;
     21public:
     22    GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
     23        : name( name )
     24        , line( -1 )
     25        , nativeCodePos( nativeCodePos )
     26        , sourceCodePos( sourceCodePos )
     27    {
     28    }
     29    GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
     30        : line( line )
     31        , nativeCodePos( nativeCodePos )
     32        , sourceCodePos( sourceCodePos )
     33    {
     34    }
     35    const std::string &GetName() const
     36    {
     37        return name;
     38    }
     39    int GetLineNum() const
     40    {
     41        return line;
     42    }
     43    int GetNativeCodePos() const
     44    {
     45        return nativeCodePos;
     46    }
     47    int GetSourceCodePos() const
     48    {
     49        return sourceCodePos;
     50    }
     51};
     52
    1453class CodeGenerator
    1554{
     
    61100
    62101public:
     102
     103    // Gotoスケジュールの管理
     104    std::vector<GotoLabelSchedule> gotoLabelSchedules;
    63105
    64106    CodeGenerator()
     
    141183    const PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
    142184    void op_jmp_continue();
     185    void op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule );
    143186
    144187
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r245 r246  
    202202    op_jmp( GetContinueCodePosOld()-obp, sizeof(long), false, true );
    203203}
     204void CodeGenerator::op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule )
     205{
     206    // オペコード
     207    pNativeCode->Put( (char)0xE9 );
     208
     209    gotoLabelSchedules.push_back( gotoLabelSchedule );
     210
     211    pNativeCode->Put( (long)0 );
     212}
Note: See TracChangeset for help on using the changeset viewer.