Changeset 672 in dev


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
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/calculation.cpp

    r598 r672  
    492492                            return false;
    493493                        }
    494                         i64nums[pnum] = tempType.GetSize();
     494                        i64nums[pnum] = compiler.SizeOf( tempType );
    495495                        StrPtr[pnum]=0;
    496496                    }
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/Compiler.h

    r636 r672  
    190190    bool StringToType( const std::string &typeName, Type &type );
    191191    const std::string TypeToString( const Type &type );
     192
     193    // ジェネリック型の型パラメータ解決をサポートした上でSizeOf関数の戻り値を取得する
     194    int SizeOf( const Type &type );
    192195
    193196    void ClearCompilingUserProcAndClass();
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp

    r641 r672  
    351351}
    352352
     353int Compiler::SizeOf( const Type &type )
     354{
     355    Type tempType( type );
     356    if( this->IsCompilingClass() )
     357    {
     358        if( this->pCompilingClass->IsExpanded() && tempType.IsTypeParameter() )
     359        {
     360            // 現在コンパイル中のクラスがテンプレート展開済みのクラスで、
     361            // 尚且つターゲットとなる型が型パラメータだったとき
     362
     363            // テンプレート展開情報を用いて型解決を行う
     364            this->pCompilingClass->ResolveExpandedClassActualTypeParameter( tempType );
     365        }
     366    }
     367    return tempType.GetSize();
     368}
     369
    353370void Compiler::ClearCompilingUserProcAndClass()
    354371{
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp

    r668 r672  
    14401440        _class.GetClassType(),
    14411441        _class.GetFormalGenericTypes(),
    1442         actualTypes,
     1442        _class.GetSuperClassActualTypeParameters(),
    14431443        _class.GetConstructorMemberSubIndex(),
    14441444        _class.GetDestructorMemberSubIndex(),
    14451445        0,
    1446         _class.GetFixedAlignment()
     1446        _class.GetFixedAlignment(),
     1447        actualTypes
    14471448    );
    14481449
  • 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
  • trunk/ab5.0/abdev/compiler_x64/Compile_Func.cpp

    r667 r672  
    377377    }
    378378}
    379 void Opcode_Func_SizeOf( const std::string &typeName ){
     379void Opcode_Func_SizeOf( const std::string &typeName )
     380{
    380381    Type tempType;
    381     if( !compiler.StringToType( typeName, tempType ) ){
     382    if( !compiler.StringToType( typeName, tempType ) )
     383    {
    382384        compiler.errorMessenger.Output(3,typeName,cp);
    383385        return;
    384386    }
    385387
    386     int typeSize = tempType.GetSize();
    387 
    388388    //mov rax,size
    389     compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
     389    compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, compiler.SizeOf( tempType ) );
    390390}
    391391void Opcode_Func_ClassSizeOf( const std::string &typeName )
    392392{
    393393    Type tempType;
    394     if( !compiler.StringToType( typeName, tempType ) ){
     394    if( !compiler.StringToType( typeName, tempType ) )
     395    {
    395396        compiler.errorMessenger.Output(3,typeName,cp);
    396397        return;
    397398    }
    398399
    399     int typeSize = ( tempType.IsObject() ) ?
    400         tempType.GetClass().GetSize() : tempType.GetSize();
     400    if( !tempType.IsObject() )
     401    {
     402        compiler.errorMessenger.Output(1,typeName,cp);
     403        return;
     404    }
    401405
    402406    //mov rax,size
    403     compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
     407    compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, tempType.GetClass().GetSize() );
    404408}
    405409void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
  • trunk/ab5.0/abdev/compiler_x86/Compile_Func.cpp

    r666 r672  
    533533    }
    534534
    535     int typeSize = tempType.GetSize();
    536 
    537535    //mov eax,size
    538     compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
     536    compiler.codeGenerator.op_mov_RV( REG_EAX, compiler.SizeOf( tempType ) );
    539537}
    540538void Opcode_Func_ClassSizeOf( const std::string &typeName )
     
    546544    }
    547545
    548     int typeSize = ( tempType.IsObject() ) ?
    549         tempType.GetClass().GetSize() : tempType.GetSize();
     546    if( !tempType.IsObject() )
     547    {
     548        compiler.errorMessenger.Output(1,typeName,cp);
     549        return;
     550    }
    550551
    551552    //mov eax,size
    552     compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
     553    compiler.codeGenerator.op_mov_RV( REG_EAX, tempType.GetClass().GetSize() );
    553554}
    554555void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
Note: See TracChangeset for help on using the changeset viewer.