Ignore:
Timestamp:
Mar 7, 2008, 5:32:29 AM (16 years ago)
Author:
dai_9181
Message:

[416]のコミットによって発生した64bit版での不具合を修正。

File:
1 edited

Legend:

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

    r412 r417  
    12921292            // 未使用のクラスは無視する
    12931293            continue;
    1294         }   
    1295 
    1296         char referenceOffsetsBuffer[1024] = "";
     1294        }
     1295
     1296        std::string referenceOffsetsBuffer;
    12971297        int numOfReference = 0;
    1298         BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
    1299             if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() ){
    1300                 if( referenceOffsetsBuffer[0] ){
    1301                     lstrcat( referenceOffsetsBuffer, "," );
    1302                 }
    1303 
    1304                 sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
    1305                     "%d",
    1306                     objClass.GetMemberOffset( pMember->GetName().c_str() ) );
    1307 
    1308                 numOfReference++;
    1309             }
    1310         }
     1298        objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );
    13111299
    13121300        sprintf( temporary
     
    13171305            , objClass.GetName().c_str()                            // クラス名
    13181306            , objClass.GetFullName().c_str()                        // フルネーム
    1319             , referenceOffsetsBuffer                                // 参照メンバオフセット配列
     1307            , referenceOffsetsBuffer.c_str()                        // 参照メンバオフセット配列
    13201308            , numOfReference                                        // 参照メンバの個数
    13211309            );
     
    15771565    return result;
    15781566}
     1567
     1568void CClass::GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset ) const
     1569{
     1570    const CClass &thisClass = *this;
     1571    BOOST_FOREACH( const CMember *pMember, thisClass.GetDynamicMembers() )
     1572    {
     1573        if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() )
     1574        {
     1575            if( referenceOffsetsBuffer.size() )
     1576            {
     1577                referenceOffsetsBuffer += ",";
     1578            }
     1579
     1580            char temp[255];
     1581            sprintf( temp, "%d", baseOffset + thisClass.GetMemberOffset( pMember->GetName().c_str() ) );
     1582            referenceOffsetsBuffer += temp;
     1583
     1584            numOfReference++;
     1585        }
     1586        if( pMember->GetType().IsStruct() && !pMember->GetType().IsPointer() )
     1587        {
     1588            // 構造体の実体をメンバに持つとき
     1589            int baseOffset = thisClass.GetMemberOffset( pMember->GetName().c_str() );
     1590
     1591            // 構造体メンバでGCによるチェックが必要な参照位置を追加
     1592            pMember->GetType().GetClass().GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference, baseOffset );
     1593        }
     1594    }
     1595}
Note: See TracChangeset for help on using the changeset viewer.