Changeset 287 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Aug 16, 2007, 7:55:02 PM (17 years ago)
Author:
dai_9181
Message:

Binaryクラスを追加

Location:
trunk/abdev/BasicCompiler_Common
Files:
1 added
12 edited

Legend:

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

    r279 r287  
    11#include "stdafx.h"
     2
     3#include <jenga/include/common/Path.h>
    24
    35#include <jenga/include/smoothie/Smoothie.h>
     
    255257
    256258                compiler.staticLibraries.push_back( new ObjectModule() );
     259
     260                Jenga::Common::Path path( temporary );
     261                CompileMessage( ((string)"\"" + path.GetFileName() + path.GetExt() + "\" を読み込みました。").c_str() );
    257262                compiler.staticLibraries.back()->Read( temporary );
    258263
  • trunk/abdev/BasicCompiler_Common/common.h

    r279 r287  
    366366void SetError(int ErrorNum,const string &keyWord,int pos);
    367367void SetError();
    368 void CompileMessage(char *buffer);
     368void CompileMessage(const char *buffer);
    369369bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
    370370bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum);
  • trunk/abdev/BasicCompiler_Common/error.cpp

    r280 r287  
    383383    SetError(300,NULL,cp);
    384384}
    385 void CompileMessage(char *buffer){
     385void CompileMessage(const char *buffer){
    386386    SetError(-2,buffer,-1);
    387387}
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r282 r287  
    455455    void PutOld( long l, Schedule::Type scheduleType )
    456456    {
    457         pNativeCode->Put( l, scheduleType );
     457        pNativeCode->PutEx( l, scheduleType );
    458458    }
    459459    const PertialSchedule *PutOld( long l, bool isPertialSchedule )
     
    465465            pPertialSchedule = pertialSchedules.back();
    466466        }
    467         pNativeCode->Put( l, Schedule::None );
     467        pNativeCode->PutEx( l, Schedule::None );
    468468        return pPertialSchedule;
    469469    }
    470470    void PutOld( const NativeCode &nativeCode )
    471471    {
    472         pNativeCode->Put( nativeCode );
     472        pNativeCode->PutEx( nativeCode );
    473473    }
    474474    void PutOld( char c )
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r282 r287  
    66
    77#include <BoostSerializationSupport.h>
     8
     9#include <Binary.h>
    810
    911class UserProc;
     
    219221typedef std::vector<SourceLine> SourceLines;
    220222
    221 class NativeCode
     223class NativeCode : public Binary
    222224{
    223     int allocateSize;
    224     char *codeBuffer;
    225     int size;
    226 
    227225    // リンカで解決しなければならないスケジュール
    228226    Schedules schedules;
     
    234232private:
    235233    friend class boost::serialization::access;
    236     BOOST_SERIALIZATION_SPLIT_MEMBER();
    237     template<class Archive> void load(Archive& ar, const unsigned int version)
     234    template<class Archive> void serialize(Archive& ar, const unsigned int version)
    238235    {
    239236        trace_for_serialize( "serializing(load) - NativeCode" );
    240237
    241         std::string code;
    242         ar & BOOST_SERIALIZATION_NVP( code );
    243         ar & BOOST_SERIALIZATION_NVP( size );
     238        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Binary );
    244239        ar & BOOST_SERIALIZATION_NVP( schedules );
    245240        ar & BOOST_SERIALIZATION_NVP( sourceLines );
    246 
    247         // 読み込み後の処理
    248         Realloc( size );
    249         for( int i=0; i<size; i++ )
    250         {
    251             ULONG_PTR l1 = ( ( code[i*3] >= 'a' ) ? ( code[i*3] - 'a' + 0x0a ) : ( code[i*3] - '0' ) ) * 0x10;
    252             ULONG_PTR l2 = ( code[i*3+1] >= 'a' ) ? ( code[i*3+1] - 'a' + 0x0a ) : ( code[i*3+1] - '0' );
    253             ULONG_PTR l = l1 + l2;
    254             codeBuffer[i] = static_cast<char>(l);
    255         }
    256     }
    257     template<class Archive> void save(Archive& ar, const unsigned int version) const
    258     {
    259         trace_for_serialize( "serializing(save) - NativeCode" );
    260 
    261         // 保存準備
    262         char *tempCode = (char *)calloc( (size+1) * 3, 1 );
    263         for( int i=0; i<size; i++ )
    264         {
    265             char temp[32];
    266             sprintf( temp, "%02x,", (unsigned char)codeBuffer[i] );
    267             tempCode[i*3] = temp[0];
    268             tempCode[i*3+1] = temp[1];
    269             tempCode[i*3+2] = temp[2];
    270         }
    271 
    272         std::string code = tempCode;
    273         free( tempCode );
    274 
    275         ar & BOOST_SERIALIZATION_NVP( code );
    276         ar & BOOST_SERIALIZATION_NVP( size );
    277         ar & BOOST_SERIALIZATION_NVP( schedules );
    278         ar & BOOST_SERIALIZATION_NVP( sourceLines );
    279     }
    280 
    281 
    282     void Realloc( int newSize )
    283     {
    284         if( allocateSize < newSize + 8192 )
    285         {
    286             while( allocateSize < newSize + 8192 )
    287             {
    288                 allocateSize += 8192;
    289             }
    290             codeBuffer = (char *)realloc( codeBuffer, allocateSize );
    291         }
    292241    }
    293242
    294243public:
    295244    NativeCode()
    296         : allocateSize( 8192 )
    297         , codeBuffer( (char *)malloc( allocateSize ) )
    298         , size( 0 )
     245        : Binary()
    299246    {
    300247    }
    301248    NativeCode( const NativeCode &nativeCode )
    302         : allocateSize( 8192 )
    303         , codeBuffer( (char *)malloc( allocateSize ) )
    304         , size( 0 )
    305     {
    306         Put( nativeCode );
     249        : Binary()
     250    {
     251        PutEx( nativeCode );
    307252    }
    308253    NativeCode( const char *codeBuffer, int size )
    309         : allocateSize( 8192 )
    310         , codeBuffer( (char *)malloc( allocateSize ) )
    311         , size( 0 )
    312     {
    313         Put( codeBuffer, size );
     254        : Binary( codeBuffer, size )
     255    {
    314256    }
    315257    ~NativeCode()
    316258    {
    317         free( codeBuffer );
    318     }
    319     void Clear()
    320     {
    321         size = 0;
    322259    }
    323260
     
    325262    {
    326263        Clear();
    327         Put( nativeCode );
    328     }
    329 
    330     const char *GetCodeBuffer() const
    331     {
    332         return codeBuffer;
    333     }
    334     int GetSize() const
    335     {
    336         return size;
    337     }
     264        PutEx( nativeCode );
     265    }
     266
    338267    const Schedules &GetSchedules() const
    339268    {
     
    341270    }
    342271
    343     long GetLong( int codePos ) const
    344     {
    345         return *(long *)(this->codeBuffer+codePos);
    346     }
    347 
    348     void Overwrite( int codePos, char c )
    349     {
    350         codeBuffer[codePos] = c;
    351     }
    352     void Overwrite( int codePos, long newLongValue )
    353     {
    354         *(long *)(this->codeBuffer+codePos) = newLongValue;
    355     }
    356 
    357     void Put( const char *codeBuffer, int size )
    358     {
    359         Realloc( this->size + size );
    360 
    361         memcpy( this->codeBuffer + this->size, codeBuffer, size );
    362         this->size += size;
    363     }
    364     void Put( const NativeCode &nativeCode );
    365     void Put( _int64 i64data )
    366     {
    367         Put( (const char *)(&i64data), sizeof(_int64) );
    368     }
    369     void Put( long l, Schedule::Type scheduleType = Schedule::None )
     272    void PutEx( const NativeCode &nativeCode );
     273    void PutEx( long l, Schedule::Type scheduleType )
    370274    {
    371275        if( scheduleType != Schedule::None )
    372276        {
    373             schedules.push_back( Schedule( scheduleType, size ) );
    374         }
    375 
    376         *((long *)(codeBuffer+size))=l;
    377         size += sizeof(long);
     277            schedules.push_back( Schedule( scheduleType, GetSize() ) );
     278        }
     279
     280        Put( l );
    378281    }
    379282    void PutUserProcSchedule( const UserProc *pUserProc, bool isCall );
    380283    void PutDllProcSchedule( const DllProc *pDllProc );
    381284    void PutVtblSchedule( const CClass *pClass );
    382     void Put( short s )
    383     {
    384         Put( (const char *)(&s), sizeof(short) );
    385     }
    386     void Put( char c )
    387     {
    388         Realloc( size + 1 );
    389         codeBuffer[size++] = c;
    390     }
    391285
    392286    const SourceLines &GetSourceLines() const
  • trunk/abdev/BasicCompiler_Common/include/Variable.h

    r275 r287  
    254254    const Variable *Find( const Symbol &symbol )const;
    255255
    256     void Add( Variable *pVar );
     256    void Add( Variable *pVar, bool isResetOffsetAddress = true );
    257257
    258258    int GetAllSize() const
     
    276276    }
    277277};
     278
     279class GlobalVar : public Variable
     280{
     281    BYTE *initBuffer;
     282public:
     283    GlobalVar()
     284    {
     285        initBuffer = (BYTE *)malloc( 1 );
     286    }
     287    ~GlobalVar()
     288    {
     289        free( initBuffer );
     290    }
     291};
  • trunk/abdev/BasicCompiler_Common/src/Linker.cpp

    r282 r287  
    126126    }
    127127
    128     nativeCode.Put( masterObjectModule.globalNativeCode );
     128    nativeCode.PutEx( masterObjectModule.globalNativeCode );
    129129
    130130    masterObjectModule.meta.GetUserProcs().Iterator_Reset();
     
    137137            pUserProc->SetBeginOpAddress( nativeCode.GetSize() );
    138138
    139             nativeCode.Put( pUserProc->GetNativeCode() );
     139            nativeCode.PutEx( pUserProc->GetNativeCode() );
    140140
    141141            pUserProc->SetEndOpAddress( nativeCode.GetSize() );
  • trunk/abdev/BasicCompiler_Common/src/Meta.cpp

    r283 r287  
    9090        }
    9191
     92        bool isResetOffsetAddress = true;
     93        if( pVar->HasInitData() )
     94        {
     95            // 初期バッファがあるときはデータテーブルオフセットを適用する
     96            pVar->SetOffsetAddress( pVar->GetOffsetAddress() + dataSectionBaseOffset );
     97
     98            isResetOffsetAddress = false;
     99        }
     100
    92101        pVar->isTargetObjectModule = false;
    93         this->globalVars.Add( pVar );
     102        this->globalVars.Add( pVar, isResetOffsetAddress );
    94103    }
    95104    meta.globalVars.PullOutAll();
  • trunk/abdev/BasicCompiler_Common/src/NativeCode.cpp

    r282 r287  
    55#define BREAK_EIP(checkEip)  (obp+0x00401000>=checkEip)
    66
    7 void NativeCode::Put( const NativeCode &nativeCode )
     7void NativeCode::PutEx( const NativeCode &nativeCode )
    88{
    9     long baseOffset = size;
     9    long baseOffset = GetSize();
    1010
    1111    // コードバッファを追加
    12     Put( nativeCode.codeBuffer, nativeCode.size );
     12    Put( nativeCode.GetBuffer(), nativeCode.GetSize() );
    1313
    1414    // スケジュールを追加
     
    4343    pUserProc->Using();
    4444
    45     Schedule schedule( pUserProc, size );
     45    Schedule schedule( pUserProc, GetSize() );
    4646    if( isCall == false )
    4747    {
     
    5050    schedules.push_back( schedule );
    5151
    52     *((long *)(codeBuffer+size))=0;
    53     size += sizeof(long);
     52    Put( (long)0 );
    5453}
    5554
     
    5857    pDllProc->Using();
    5958
    60     schedules.push_back( Schedule( pDllProc, size ) );
     59    schedules.push_back( Schedule( pDllProc, GetSize() ) );
    6160
    62     *((long *)(codeBuffer+size))=0;
    63     size += sizeof(long);
     61    Put( (long)0 );
    6462}
    6563
    6664void NativeCode::PutVtblSchedule( const CClass *pClass )
    6765{
    68     schedules.push_back( Schedule( pClass, size ) );
     66    schedules.push_back( Schedule( pClass, GetSize() ) );
    6967
    70     *((long *)(codeBuffer+size))=0;
    71     size += sizeof(long);
     68    Put( (long)0 );
    7269}
    7370
     
    7673    if( sourceLines.size() )
    7774    {
    78         if( sourceLines.back().GetNativeCodePos() == size )
     75        if( sourceLines.back().GetNativeCodePos() == GetSize() )
    7976        {
    8077            sourceLines.back().SetSourceCodePos( cp );
     
    9794        SourceLine(
    9895            (long)sourceLines.size(),
    99             size,
     96            GetSize(),
    10097            compiler.GetObjectModule().GetCurrentSourceIndex(),
    10198            cp,
  • trunk/abdev/BasicCompiler_Common/src/ObjectModule.cpp

    r282 r287  
    2323    objectModule.globalNativeCode.ResetDataSectionBaseOffset( dataSectionBaseOffset );
    2424    objectModule.globalNativeCode.ResetSourceIndexes( sourceIndexBase );
    25     globalNativeCode.Put( objectModule.globalNativeCode );
     25    globalNativeCode.PutEx( objectModule.globalNativeCode );
    2626
    2727    // データテーブルを結合
  • trunk/abdev/BasicCompiler_Common/src/Source.cpp

    r285 r287  
    815815
    816816    // basic.sbpをインクルード
    817     const char *headCode = "#include <basic.sbp>\n";
    818     //const char *headCode = "\n";
     817    //const char *headCode = "#include <basic.sbp>\n";
     818    const char *headCode = "\n";
    819819    Realloc( length + lstrlen(headCode) );
    820820    Text::SlideString( buffer, lstrlen(headCode) );
  • trunk/abdev/BasicCompiler_Common/src/Variable.cpp

    r275 r287  
    7474}
    7575
    76 void Variables::Add( Variable *pVar )
     76void Variables::Add( Variable *pVar, bool isResetOffsetAddress )
    7777{
    7878    int alignment = 0;
     
    9090        }
    9191
    92         pVar->SetOffsetAddress( allInitSize );
     92        if( isResetOffsetAddress )
     93        {
     94            pVar->SetOffsetAddress( allInitSize );
     95        }
    9396        allInitSize += pVar->GetMemorySize();
    9497    }
     
    102105        }
    103106
     107        if( !isResetOffsetAddress )
     108        {
     109            Jenga::Throw( "[Variables::Add] 初期バッファがない変数に対してisResetOffsetAddressをfalseにできない" );
     110        }
     111
    104112        pVar->SetOffsetAddress( allSize | 0x80000000 );
    105113        allSize += pVar->GetMemorySize();
Note: See TracChangeset for help on using the changeset viewer.