Changeset 63 in dev for BasicCompiler_Common


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

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

Location:
BasicCompiler_Common
Files:
5 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
  • BasicCompiler_Common/Class.h

    r59 r63  
    136136    CMethod *GetDestructorMethod() const;
    137137
     138    // メンバの総合サイズを取得
     139    int GetSize() const;
     140
     141    // メンバのオフセットを取得
     142    int GetMemberOffset( const char *memberName, int *pMemberNum ) const;
     143
     144private:
     145    // アラインメント値を取得
     146    int GetAlignment() const;
     147
    138148
    139149    //vtbl
  • BasicCompiler_Common/Object.cpp

    r50 r63  
    88
    99extern HANDLE hHeap;
    10 
    11 int GetAlignment(CClass *pobj_c){
    12     int i;
    13     int alignment,member_size;
    14 
    15     if(pobj_c->vtbl_num) alignment=PTR_SIZE;
    16     else alignment=0;
    17 
    18     for(i=0;i<pobj_c->iMemberNum;i++){
    19         CMember *pMember = pobj_c->ppobj_Member[i];
    20 
    21         if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    22             //メンバクラスのアラインメントを取得
    23             member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class);
    24         }
    25         else{
    26             //メンバサイズを取得
    27             member_size = pMember->GetSize();
    28         }
    29 
    30         //アラインメントをセット
    31         if(alignment<member_size) alignment=member_size;
    32     }
    33 
    34     if(alignment==0) return 0;
    35 
    36     if(pobj_c->iAlign) alignment=pobj_c->iAlign;
    37 
    38     return alignment;
    39 }
    40 int GetSizeOfClassMember(CClass *pobj_c,char *pMemberName,int *pMemberNum){
    41     int i,i2,offset;
    42 
    43     //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
    44     if(pobj_c->vtbl_num) offset=PTR_SIZE;
    45     else offset=0;
    46 
    47     int alignment;
    48     if(pobj_c->iAlign) alignment=pobj_c->iAlign;
    49     else alignment=1;
    50 
    51     int iMaxAlign=0;
    52     for(i=0;i<pobj_c->iMemberNum;i++){
    53         CMember *pMember = pobj_c->ppobj_Member[i];
    54 
    55         i2 = pMember->GetSize();
    56 
    57         //アラインメントを算出
    58         int member_size;
    59         if(pMember->TypeInfo.type==DEF_OBJECT){
    60             //メンバクラスのアラインメントを取得
    61             member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class);
    62         }
    63         else{
    64             //メンバサイズを取得
    65             member_size=i2;
    66         }
    67         if(iMaxAlign<member_size) iMaxAlign=member_size;
    68 
    69         //アラインメントを考慮
    70         if(pobj_c->iAlign&&pobj_c->iAlign<member_size){
    71             if(offset%alignment) offset+=alignment-(offset%alignment);
    72         }
    73         else{
    74             if(alignment<member_size) alignment=member_size;
    75 
    76             if(member_size==0){
    77                 //メンバを持たないクラス
    78                 //※何もしない(オフセットの計算をしない)
    79             }
    80             else{
    81                 if(offset%member_size) offset+=member_size-(offset%member_size);
    82             }
    83         }
    84 
    85         if(pMemberName){
    86             //メンバ指定がある場合は、オフセットを返す
    87             if(lstrcmp(pMember->name,pMemberName)==0){
    88                 if(pMemberNum) *pMemberNum=i;
    89                 return offset;
    90             }
    91         }
    92 
    93         //配列を考慮したメンバサイズを取得
    94         member_size=i2 * JumpSubScripts(pMember->SubScripts);
    95 
    96         //メンバサイズを加算
    97         offset+= member_size;
    98     }
    99 
    100     if(iMaxAlign<alignment) alignment=iMaxAlign;
    101 
    102     //アラインメントを考慮
    103     if(alignment){
    104         if(offset%alignment) offset+=alignment-(offset%alignment);
    105     }
    106 
    107     if(pMemberNum) *pMemberNum=i;
    108     return offset;
    109 }
    110 int GetSizeOfClass(CClass *pobj_c){
    111     return GetSizeOfClassMember(pobj_c,0,0);
    112 }
    113 
    11410
    11511void CallConstructor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){
  • BasicCompiler_Common/Variable.cpp

    r62 r63  
    161161        pobj_c=(CClass *)lpIndex;
    162162        if(!pobj_c) return 0;
    163         return GetSizeOfClass(pobj_c);
     163        return pobj_c->GetSize();
    164164    }
    165165    else{
  • BasicCompiler_Common/common.h

    r60 r63  
    426426
    427427//Object.cpp
    428 int GetSizeOfClassMember(CClass *pobj_c,char *pMemberName,int *pMemberNum);
    429 int GetSizeOfClass(CClass *pobj_c);
    430428void AddClassName(char *Parameter,int NowLine);
    431429void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
Note: See TracChangeset for help on using the changeset viewer.