Changeset 672 in dev for trunk/ab5.0/abdev/ab_common


Ignore:
Timestamp:
Jun 29, 2008, 2:08:44 AM (16 years ago)
Author:
dai_9181
Message:

#171への対応。テンプレート展開後のクラスメソッドの実装で、SizeOf(T)が正常値を返さない不具合を修正(特にTが4バイト未満の型場合)。

Location:
trunk/ab5.0/abdev/ab_common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Class.h

    r640 r672  
    8383public:
    8484    ActiveBasic::Common::Lexical::ExpandedTemplateClasses expandedTemplateClasses;
     85    Types expandedClassActualTypeParameters;
    8586
    8687    // XMLシリアライズ用
     
    117118        ar & BOOST_SERIALIZATION_NVP( fixedAlignment );
    118119        ar & BOOST_SERIALIZATION_NVP( expandedTemplateClasses );
     120        ar & BOOST_SERIALIZATION_NVP( expandedClassActualTypeParameters );
    119121    }
    120122
     
    131133        int DestructorMemberSubIndex,
    132134        int vtblNum,
    133         int fixedAlignment );
     135        int fixedAlignment,
     136        const Types &expandedClassActualTypeParameters );
    134137    CClass();
    135138    ~CClass();
     
    399402    }
    400403
     404    // 展開時の型パラメータ情報
     405    bool IsExpanded() const
     406    {
     407        return !expandedClassActualTypeParameters.empty();
     408    }
     409    void ResolveExpandedClassActualTypeParameter( Type &type ) const;
     410
    401411    // メンバの総合サイズを取得
    402412private:
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp

    r640 r672  
    3030    int DestructorMemberSubIndex,
    3131    int vtblNum,
    32     int fixedAlignment )
     32    int fixedAlignment,
     33    const Types &expandedClassActualTypeParameters )
    3334    : ClassPrototype( symbol )
    3435    , importedNamespaces( importedNamespaces )
     
    4344    , vtblNum( vtblNum )
    4445    , fixedAlignment( fixedAlignment )
     46    , expandedClassActualTypeParameters( expandedClassActualTypeParameters )
    4547    , vtbl_offset( -1 )
    4648    , comVtblOffset( 0 )
     
    379381}
    380382
     383void CClass::ResolveExpandedClassActualTypeParameter( Type &type ) const
     384{
     385    if( !this->IsExpanded() )
     386    {
     387        _ASSERTE( false );
     388    }
     389
     390    if( !type.IsTypeParameter() )
     391    {
     392        // 型パラメータではない場合
     393        return;
     394    }
     395
     396    type = expandedClassActualTypeParameters[type.GetFormalTypeIndex()];
     397}
     398
    381399//サイズを取得
    382400int CClass::GetSize() const
Note: See TracChangeset for help on using the changeset viewer.