Ignore:
Timestamp:
Nov 2, 2007, 2:53:56 AM (17 years ago)
Author:
dai_9181
Message:

静的領域に初期オブジェクトを配置可能にした

Location:
trunk/abdev/BasicCompiler_Common/include
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r353 r355  
    422422        return staticMembers;
    423423    }
     424   
     425    const CMember *FindDynamicMember( const char *memberName ) const
     426    {
     427        BOOST_FOREACH( CMember *pMember, GetDynamicMembers() )
     428        {
     429            if( pMember->GetName() == memberName )
     430            {
     431                return pMember;
     432            }
     433        }
     434        return NULL;
     435    }
    424436
    425437    void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
     
    516528
    517529
     530    // TypeInfo用
     531    mutable int typeInfoDataTableOffset;
     532    void SetTypeInfoDataTableOffset( int typeInfoDataTableOffset ) const
     533    {
     534        this->typeInfoDataTableOffset = typeInfoDataTableOffset;
     535    }
     536    int GetTypeInfoDataTableOffset() const
     537    {
     538        return typeInfoDataTableOffset;
     539    }
     540
     541
    518542    //線形リスト用
    519543    CClass *pobj_NextClass;
     
    554578    virtual void GetAllClassInfo();
    555579    virtual void Compile_System_InitializeUserTypes();
     580    virtual void Compile_System_InitializeUserTypesForBaseType();
    556581
    557582    const CClass *Find( const NamespaceScopes &namespaceScopes, const string &name ) const;
  • trunk/abdev/BasicCompiler_Common/include/DataTable.h

    r279 r355  
    44
    55//DataTable.cpp
    6 class DataTable{
     6class DataTable
     7{
    78    char *buffer;
    89    int size;
    910
    10     void Realloc( int size )
    11     {
    12         this->buffer = (char *)realloc( this->buffer, size + 100 );
    13         this->size = size;
    14     }
     11public:
     12    // リンカで解決しなければならないスケジュール
     13    Schedules schedules;
    1514
    1615    // XMLシリアライズ用
     
    2322        ar & BOOST_SERIALIZATION_NVP( _buffer );
    2423        ar & BOOST_SERIALIZATION_NVP( size );
     24        ar & BOOST_SERIALIZATION_NVP( schedules );
    2525
    2626        // 読み込み後の処理
     
    5252        ar & BOOST_SERIALIZATION_NVP( _buffer );
    5353        ar & BOOST_SERIALIZATION_NVP( size );
     54        ar & BOOST_SERIALIZATION_NVP( schedules );
     55    }
     56
     57
     58    void Realloc( int size )
     59    {
     60        this->buffer = (char *)realloc( this->buffer, size + 100 );
     61        this->size = size;
    5462    }
    5563
     
    92100    void Add( const DataTable &dataTable )
    93101    {
     102        long baseOffset = GetSize();
     103
    94104        AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
     105
     106        // スケジュールを追加
     107        BOOST_FOREACH( const Schedule &schedule, dataTable.schedules )
     108        {
     109            this->schedules.push_back(
     110                Schedule(
     111                    schedule.GetType(),
     112                    baseOffset + schedule.GetOffset(),
     113                    schedule.GetLongPtrValue()
     114                )
     115            );
     116        }
    95117    }
    96118
    97     const void *GetPtr() const;
    98     int GetSize() const;
     119    const void *GetPtr() const
     120    {
     121        return buffer;
     122    }
     123    int GetSize() const
     124    {
     125        return size;
     126    }
     127
     128    long GetLong( int pos ) const
     129    {
     130        return *(long *)( buffer + pos );
     131    }
     132    _int64 GetInt64( int pos ) const
     133    {
     134        return *(_int64 *)( buffer + pos );
     135    }
     136    void Overwrite( int pos, long newLongValue )
     137    {
     138        *(long *)( buffer + pos ) = newLongValue;
     139    }
     140    void OverwriteInt64( int pos, _int64 new64Value )
     141    {
     142        *(_int64 *)( buffer + pos ) = new64Value;
     143    }
     144
     145    bool MakeConstObjectToProcessStaticBuffer( const CClass &objClass, const Jenga::Common::Strings &initMemberValues, int &dataTableOffset );
     146    bool MakeConstObjectToProcessStaticBuffer( const char *expression, Type &resultType, int &dataTableOffset );
     147    int MakeConstStringObjectToProcessStaticBuffer( const char *str );
     148    bool MakeLiteralArrayBuffer( const char *expression, const Type &baseType, int &dataTableOffset );
     149
     150private:
     151    int lastMadeConstObjectDataTableOffset;
     152public:
     153    int GetLastMadeConstObjectDataTableOffset()
     154    {
     155        return lastMadeConstObjectDataTableOffset;
     156    }
     157
     158    void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
    99159};
  • trunk/abdev/BasicCompiler_Common/include/Linker.h

    r282 r355  
    44{
    55    NativeCode nativeCode;
     6    DataTable dataTable;
    67    DWORD imageBase;
    78
     
    1516    {
    1617        return nativeCode;
     18    }
     19
     20    const DataTable &GetDataTable() const
     21    {
     22        return dataTable;
    1723    }
    1824
     
    3743    void ResolveVtblSchedule( long dataSectionBaseOffset );
    3844
     45    // TypeInfoスケジュール
     46    void ResolveTypeInfoSchedule( long dataSectionBaseOffset );
     47
    3948    // リンク
    4049    void Link( ObjectModule &masterObjectModule );
     50
     51    // データテーブルをセット
     52    void SetDataTable( DataTable &dataTable );
    4153};
  • trunk/abdev/BasicCompiler_Common/include/NamespaceSupporter.h

    r215 r355  
    5353
    5454        while( tempLivingNamespaceScopes.size() ){
    55             NamespaceScopes tempNamespaceScopes = tempLivingNamespaceScopes;
    56 
    57             string tempStr = tempNamespaceScopes.ToString() + "." + entryName;
     55            string tempStr = tempLivingNamespaceScopes.ToString() + "." + entryName;
    5856            if( thisStr == tempStr ){
    5957                return true;
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r287 r355  
    2424        DllProc,        // DLL関数位置スケジュール
    2525        Vtbl,           // vtblスケジュール
     26        TypeInfo,       // TypeInfoスケジュール
    2627    };
    2728
     
    5758            break;
    5859        case Vtbl:
     60        case TypeInfo:
    5961            ar & boost::serialization::make_nvp("pClass", const_cast<::CClass *&>(pClass));
    6062            break;
     
    9395    {
    9496    }
     97    Schedule( Type type, const ::CClass *pClass, long offset )
     98        : type( type )
     99        , pClass( pClass )
     100        , offset( offset )
     101    {
     102    }
    95103    ~Schedule()
    96104    {
     
    127135    const ::CClass &GetClass() const
    128136    {
    129         if( type != Schedule::Vtbl )
     137        if( !( type == Schedule::Vtbl || type == Schedule::TypeInfo ) )
    130138        {
    131139            SetError();
  • trunk/abdev/BasicCompiler_Common/include/ver.h

    r354 r355  
    66// バージョン付加文字列
    77#ifdef _AMD64_
    8 #define VER_INFO        "(x64) (rev.361)"
     8#define VER_INFO        "(x64) (rev.367)"
    99#else
    10 #define VER_INFO        "(rev.361)"
     10#define VER_INFO        "(rev.367)"
    1111#endif
Note: See TracChangeset for help on using the changeset viewer.