Changeset 141 in dev
- Timestamp:
- Jun 15, 2007, 1:12:14 PM (17 years ago)
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_ProcOp.cpp
r140 r141 515 515 516 516 //仮想関数テーブルを初期化 517 if( pobj_CompilingClass->vtbl_num&&518 pobj_CompilingClass->IsAbstract()==false){517 if( pobj_CompilingClass->IsExistVirtualFunctions() 518 && !pobj_CompilingClass->IsAbstract() ){ 519 519 //関数テーブルに値をセット 520 520 int offset = (int)pobj_CompilingClass->GetVtblGlobalOffset(); -
BasicCompiler64/Compile_ProcOp.cpp
r140 r141 567 567 568 568 //仮想関数テーブルを初期化 569 if( pobj_CompilingClass->vtbl_num&&570 pobj_CompilingClass->IsAbstract()==false){569 if( pobj_CompilingClass->IsExistVirtualFunctions() 570 && !pobj_CompilingClass->IsAbstract() ){ 571 571 //関数テーブルに値をセット 572 572 int offset = (int)pobj_CompilingClass->GetVtblGlobalOffset(); -
BasicCompiler_Common/Class.cpp
r140 r141 22 22 , classType( Class ) 23 23 , pobj_InheritsClass( NULL ) 24 , vtbl _num( 0 )24 , vtblNum( 0 ) 25 25 , iAlign( 0 ) 26 26 , vtbl_offset( -1 ) … … 90 90 const CClass *pInheritsClass = pobj_DBClass->Find(temporary); 91 91 if( !pInheritsClass ){ 92 SetError(106,temporary, i);92 SetError(106,temporary,nowLine); 93 93 return false; 94 94 } 95 95 96 96 if( pInheritsClass->IsInterface() ){ 97 // インターフェイスを継承する 98 if( !InheritsInterface( *pInheritsClass, nowLine ) ){ 99 return false; 100 } 97 // インターフェイスはあとで継承する 101 98 } 102 99 else if( pInheritsClass->IsClass() ){ … … 127 124 } 128 125 129 if( !InheritsClass( *pObjectClass, i) ){126 if( !InheritsClass( *pObjectClass, nowLine ) ){ 130 127 return false; 131 128 } 129 } 130 131 i=0; 132 while( true ){ 133 134 char temporary[VN_SIZE]; 135 for( int i2=0;; i++, i2++ ){ 136 if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){ 137 temporary[i2] = 0; 138 break; 139 } 140 temporary[i2] = inheritNames[i]; 141 } 142 143 //継承元クラスを取得 144 const CClass *pInheritsClass = pobj_DBClass->Find(temporary); 145 if( !pInheritsClass ){ 146 SetError(106,temporary,nowLine); 147 return false; 148 } 149 150 if( pInheritsClass->IsInterface() ){ 151 // インターフェイスを継承する 152 if( !InheritsInterface( *pInheritsClass, nowLine ) ){ 153 return false; 154 } 155 } 156 else if( pInheritsClass->IsClass() ){ 157 // クラスはさっき継承した 158 } 159 else{ 160 SetError(135,NULL,nowLine); 161 return false; 162 } 163 164 if( inheritNames[i] == '\0' ){ 165 break; 166 } 167 i++; 132 168 } 133 169 … … 189 225 190 226 //仮想関数の数 191 vtbl_num += inheritsClass.vtbl_num;227 AddVtblNum( inheritsClass.GetVtblNum() ); 192 228 193 229 //継承先のクラスをメンバとして保持する … … 235 271 } 236 272 237 interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl _num ) );273 interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtblNum ) ); 238 274 239 275 //仮想関数の数 240 vtbl_num += inheritsInterface.vtbl_num;276 AddVtblNum( inheritsInterface.GetVtblNum() ); 241 277 242 278 return true; … … 308 344 int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const 309 345 { 310 int i2 ,offset;346 int i2; 311 347 312 348 //仮想関数が存在する場合は関数リストへのポインタのサイズを追加 313 if(vtbl_num) offset=PTR_SIZE; 314 else offset=0; 349 int offset = IsExistVirtualFunctions() ? PTR_SIZE : 0; 315 350 316 351 int alignment; … … 381 416 int CClass::GetAlignment() const 382 417 { 383 int alignment,member_size; 384 385 if(vtbl_num) alignment=PTR_SIZE; 386 else alignment=0; 418 //仮想関数が存在する場合は関数リストへのポインタのサイズを追加 419 int alignment = IsExistVirtualFunctions() ? PTR_SIZE : 0; 387 420 388 421 BOOST_FOREACH( CMember *pMember, dynamicMembers ){ 422 int member_size; 389 423 if(pMember->GetType().IsStruct()){ 390 424 //メンバクラスのアラインメントを取得 … … 431 465 432 466 UserProc **ppsi; 433 ppsi=(UserProc **)HeapAlloc(hHeap,0, vtbl_num*sizeof(GlobalProc *));467 ppsi=(UserProc **)HeapAlloc(hHeap,0,GetVtblNum()*sizeof(GlobalProc *)); 434 468 435 469 //関数テーブルに値をセット … … 452 486 } 453 487 454 vtbl_offset=dataTable.AddBinary((void *)ppsi, vtbl_num*sizeof(LONG_PTR));455 456 for( int i=0; i < vtbl_num; i++ ){488 vtbl_offset=dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR)); 489 490 for( int i=0; i < GetVtblNum(); i++ ){ 457 491 pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR)); 458 492 } … … 469 503 470 504 int i; 471 for(i=0;i< vtbl_num;i++){505 for(i=0;i<GetVtblNum();i++){ 472 506 GlobalProc *pUserProc; 473 507 pUserProc=(GlobalProc *)pVtbl[i]; … … 938 972 939 973 if( isVirtual ){ 940 pobj_c-> vtbl_num++;974 pobj_c->AddVtblNum( 1 ); 941 975 } 942 976 … … 1081 1115 1082 1116 //仮想関数の数を初期化 1083 pobj_c-> vtbl_num=0;1117 pobj_c->SetVtblNum( 0 ); 1084 1118 } 1085 1119 Interface_InheritsError: … … 1214 1248 1215 1249 // 仮想関数の数を初期化 1216 pobj_c-> vtbl_num = 0;1250 pobj_c->SetVtblNum( 0 ); 1217 1251 } 1218 1252 else{ -
BasicCompiler_Common/Class.h
r140 r141 65 65 int ConstructorMemberSubIndex; 66 66 int DestructorMemberSubIndex; 67 int vtblNum; // 仮想関数の数 67 68 68 69 // 静的メソッド … … 84 85 const CClass *pobj_InheritsClass; 85 86 86 //仮想関数の数87 int vtbl_num;88 89 87 //アラインメント値 90 88 int iAlign; … … 156 154 //デストラクタ メソッドを取得 157 155 const CMethod *GetDestructorMethod() const; 156 157 // vtblに存在する仮想関数の数 158 int GetVtblNum() const 159 { 160 return vtblNum; 161 } 162 void SetVtblNum( int vtblNum ) 163 { 164 this->vtblNum = vtblNum; 165 } 166 void AddVtblNum( int vtblNum ) 167 { 168 this->vtblNum += vtblNum; 169 } 170 bool IsExistVirtualFunctions() const 171 { 172 return ( vtblNum > 0 ); 173 } 158 174 159 175 // メンバの総合サイズを取得 -
BasicCompiler_Common/DebugMiddleFile.cpp
r140 r141 316 316 317 317 //仮想関数の数 318 *(long *)(buffer+i2)=pobj_c-> vtbl_num;318 *(long *)(buffer+i2)=pobj_c->GetVtblNum(); 319 319 i2+=sizeof(long); 320 320 … … 698 698 699 699 //仮想関数の数 700 pobj_c-> vtbl_num=*(long *)(buffer+i2);700 pobj_c->SetVtblNum( *(long *)(buffer+i2) ); 701 701 i2+=sizeof(long); 702 702 -
BasicCompiler_Common/common.h
r140 r141 47 47 48 48 #ifdef _AMD64_ 49 #define VER_INFO "(x64) (rev.2 75)"49 #define VER_INFO "(x64) (rev.280)" 50 50 #else 51 #define VER_INFO "(rev.2 75)"51 #define VER_INFO "(rev.280)" 52 52 #endif 53 53
Note:
See TracChangeset
for help on using the changeset viewer.