Changeset 63 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Feb 23, 2007, 2:12:26 AM (17 years ago)
Author:
dai_9181
Message:

CClass::GetSize、CClass::GetMemberOffsetを追加

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r62 r63  
    409409    return methods[DestructorMemberSubIndex];
    410410}
     411
     412//サイズを取得
     413int CClass::GetSize() const
     414{
     415    return GetMemberOffset( NULL, NULL );
     416}
     417
     418//メンバのオフセットを取得
     419int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const
     420{
     421    int i,i2,offset;
     422
     423    //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
     424    if(vtbl_num) offset=PTR_SIZE;
     425    else offset=0;
     426
     427    int alignment;
     428    if(iAlign) alignment=iAlign;
     429    else alignment=1;
     430
     431    int iMaxAlign=0;
     432    for(i=0;i<iMemberNum;i++){
     433        CMember *pMember = ppobj_Member[i];
     434
     435        i2 = pMember->GetSize();
     436
     437        //アラインメントを算出
     438        int member_size;
     439        if(pMember->TypeInfo.type==DEF_OBJECT){
     440            //メンバクラスのアラインメントを取得
     441            member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     442        }
     443        else{
     444            //メンバサイズを取得
     445            member_size=i2;
     446        }
     447        if(iMaxAlign<member_size) iMaxAlign=member_size;
     448
     449        //アラインメントを考慮
     450        if(iAlign&&iAlign<member_size){
     451            if(offset%alignment) offset+=alignment-(offset%alignment);
     452        }
     453        else{
     454            if(alignment<member_size) alignment=member_size;
     455
     456            if(member_size==0){
     457                //メンバを持たないクラス
     458                //※何もしない(オフセットの計算をしない)
     459            }
     460            else{
     461                if(offset%member_size) offset+=member_size-(offset%member_size);
     462            }
     463        }
     464
     465        if(memberName){
     466            //メンバ指定がある場合は、オフセットを返す
     467            if(lstrcmp(pMember->name,memberName)==0){
     468                if(pMemberNum) *pMemberNum=i;
     469                return offset;
     470            }
     471        }
     472
     473        //配列を考慮したメンバサイズを取得
     474        member_size=i2 * JumpSubScripts(pMember->SubScripts);
     475
     476        //メンバサイズを加算
     477        offset+= member_size;
     478    }
     479
     480    if(iMaxAlign<alignment) alignment=iMaxAlign;
     481
     482    //アラインメントを考慮
     483    if(alignment){
     484        if(offset%alignment) offset+=alignment-(offset%alignment);
     485    }
     486
     487    if(pMemberNum) *pMemberNum=i;
     488    return offset;
     489}
     490
     491int CClass::GetAlignment() const
     492{
     493    int i;
     494    int alignment,member_size;
     495
     496    if(vtbl_num) alignment=PTR_SIZE;
     497    else alignment=0;
     498
     499    for(i=0;i<iMemberNum;i++){
     500        CMember *pMember = ppobj_Member[i];
     501
     502        if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     503            //メンバクラスのアラインメントを取得
     504            member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     505        }
     506        else{
     507            //メンバサイズを取得
     508            member_size = pMember->GetSize();
     509        }
     510
     511        //アラインメントをセット
     512        if(alignment<member_size) alignment=member_size;
     513    }
     514
     515    if(alignment==0) return 0;
     516
     517    if(iAlign) alignment=iAlign;
     518
     519    return alignment;
     520}
     521
    411522
    412523
Note: See TracChangeset for help on using the changeset viewer.