Ignore:
Timestamp:
Jul 30, 2007, 2:00:45 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r250 r251  
    2727}
    2828
    29 
    30 // 分岐関連
    31 void CodeGenerator::opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule )
     29void CodeGenerator::opfix( const PertialSchedule *pPertialSchedule, long newValue )
    3230{
    3331    bool isSuccessful = false;
     
    3836        if( (*it) == pPertialSchedule )
    3937        {
    40             long newValue = pNativeCode->GetSize() - (pPertialSchedule->GetCodePos()+pPertialSchedule->GetTypeSize());
    41 
    42             extern int obp;
    43             long newValueOld = obp - (pPertialSchedule->GetObpOld()+pPertialSchedule->GetTypeSize());
    44 
    4538            if( pPertialSchedule->GetTypeSize() == sizeof(char) )
    4639            {
     
    5447
    5548                // TODO: 未完成(用が無くなったら消す)
     49                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), (char)newValue );
     50            }
     51            else if( pPertialSchedule->GetTypeSize() == sizeof(long) )
     52            {
     53                pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), newValue );
     54
     55                // TODO: 未完成(用が無くなったら消す)
     56                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), newValue );
     57            }
     58            else
     59            {
     60                SetError();
     61            }
     62
     63            it = pertialSchedules.erase( it );
     64            delete pPertialSchedule;
     65
     66            isSuccessful = true;
     67        }
     68        else
     69        {
     70            it++;
     71        }
     72    }
     73
     74    if( isSuccessful == false )
     75    {
     76        SetError();
     77    }
     78}
     79
     80
     81// 分岐関連
     82void CodeGenerator::opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule )
     83{
     84    bool isSuccessful = false;
     85
     86    PertialSchedules::iterator it = pertialSchedules.begin();
     87    while( it != pertialSchedules.end() )
     88    {
     89        if( (*it) == pPertialSchedule )
     90        {
     91            long newValue = pNativeCode->GetSize() - (pPertialSchedule->GetCodePos()+pPertialSchedule->GetTypeSize());
     92
     93            extern int obp;
     94            long newValueOld = obp - (pPertialSchedule->GetObpOld()+pPertialSchedule->GetTypeSize());
     95
     96            if( pPertialSchedule->GetTypeSize() == sizeof(char) )
     97            {
     98                if( newValue < -128 || 127 < newValue )
     99                {
     100                    // 範囲外
     101                    SetError();
     102                }
     103
     104                pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)newValue );
     105
     106                // TODO: 未完成(用が無くなったら消す)
    56107                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), (char)newValueOld );
    57108            }
     
    130181    {
    131182        pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), op_size ) );
    132         pPertialSchedule = pertialSchedules[pertialSchedules.size()-1];
     183        pPertialSchedule = pertialSchedules.back();
    133184    }
    134185
Note: See TracChangeset for help on using the changeset viewer.