Changeset 63 in dev for BasicCompiler_Common
- Timestamp:
- Feb 23, 2007, 2:12:26 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r62 r63 409 409 return methods[DestructorMemberSubIndex]; 410 410 } 411 412 //サイズを取得 413 int CClass::GetSize() const 414 { 415 return GetMemberOffset( NULL, NULL ); 416 } 417 418 //メンバのオフセットを取得 419 int 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 491 int 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 411 522 412 523 -
BasicCompiler_Common/Class.h
r59 r63 136 136 CMethod *GetDestructorMethod() const; 137 137 138 // メンバの総合サイズを取得 139 int GetSize() const; 140 141 // メンバのオフセットを取得 142 int GetMemberOffset( const char *memberName, int *pMemberNum ) const; 143 144 private: 145 // アラインメント値を取得 146 int GetAlignment() const; 147 138 148 139 149 //vtbl -
BasicCompiler_Common/Object.cpp
r50 r63 8 8 9 9 extern 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 114 10 115 11 void CallConstructor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){ -
BasicCompiler_Common/Variable.cpp
r62 r63 161 161 pobj_c=(CClass *)lpIndex; 162 162 if(!pobj_c) return 0; 163 return GetSizeOfClass(pobj_c);163 return pobj_c->GetSize(); 164 164 } 165 165 else{ -
BasicCompiler_Common/common.h
r60 r63 426 426 427 427 //Object.cpp 428 int GetSizeOfClassMember(CClass *pobj_c,char *pMemberName,int *pMemberNum);429 int GetSizeOfClass(CClass *pobj_c);430 428 void AddClassName(char *Parameter,int NowLine); 431 429 void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
Note:
See TracChangeset
for help on using the changeset viewer.