Changeset 342 in dev for trunk/abdev/BasicCompiler_Common/src/Class.cpp
- Timestamp:
- Oct 9, 2007, 1:10:33 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r340 r342 166 166 bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const 167 167 { 168 BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){169 if( pInterfaceClass == &objInterface.Get InterfaceClass() ){168 BOOST_FOREACH( const ::Interface &objInterface, interfaces ){ 169 if( pInterfaceClass == &objInterface.GetClass() ){ 170 170 return true; 171 171 } … … 320 320 321 321 //メソッドをコピー 322 BOOST_FOREACH( const CMethod *pBaseMethod, inheritsClass.Get Methods() ){322 BOOST_FOREACH( const CMethod *pBaseMethod, inheritsClass.GetDynamicMethods() ){ 323 323 CMethod *pMethod = new DynamicMethod( *pBaseMethod ); 324 324 … … 340 340 } 341 341 342 methods.push_back( pMethod );342 GetDynamicMethods().push_back( pMethod ); 343 343 } 344 344 … … 368 368 369 369 //メソッドをコピー 370 BOOST_FOREACH( const CMethod *pBaseMethod, inheritsInterface.Get Methods() ){370 BOOST_FOREACH( const CMethod *pBaseMethod, inheritsInterface.GetDynamicMethods() ){ 371 371 CMethod *pMethod = new DynamicMethod( *pBaseMethod ); 372 372 … … 388 388 } 389 389 390 methods.push_back( pMethod );391 } 392 393 interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtblNum ) );390 GetDynamicMethods().push_back( pMethod ); 391 } 392 393 //interfaces.push_back( Interface( &inheritsInterface, vtblNum ) ); 394 394 395 395 //仮想関数の数 … … 399 399 } 400 400 401 bool CClass::Implements( const CClass &interfaceClass, int nowLine ) 402 { 403 if( !interfaceClass.IsInterface() ) 404 { 405 // インターフェイスではないとき 406 SetError(138,interfaceClass.GetName().c_str(),nowLine ); 407 return false; 408 } 409 410 if( !interfaceClass.IsReady() ){ 411 // インターフェイスが未解析のとき 412 pobj_LoopRefCheck->add(this->GetName().c_str()); 413 compiler.GetObjectModule().meta.GetClasses().GetClass_recur(interfaceClass.GetName().c_str()); 414 pobj_LoopRefCheck->del(this->GetName().c_str()); 415 } 416 417 interfaces.push_back( ::Interface( &interfaceClass ) ); 418 419 return true; 420 } 401 421 bool CClass::Implements( const char *interfaceNames, int nowLine ) 402 422 { 403 423 Jenga::Common::Strings paramStrs; 404 424 SplitParameter( interfaceNames, paramStrs ); 405 406 // TODO: 実装 425 426 BOOST_FOREACH( const std::string ¶mStr, paramStrs ) 427 { 428 //継承元クラスを取得 429 const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( paramStr.c_str() ); 430 if( !pInterfaceClass ){ 431 SetError(106,paramStr.c_str(),nowLine); 432 continue; 433 } 434 435 // インターフェイスを継承する 436 Implements( *pInterfaceClass, nowLine ); 437 } 438 407 439 return true; 408 440 } … … 489 521 490 522 if( fConstructor == 1 ) 491 pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->Get Methods().size() );523 pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() ); 492 524 else if( bDestructor ) 493 pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->Get Methods().size() );525 pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() ); 494 526 495 527 … … 505 537 506 538 //メソッド 507 BOOST_FOREACH( const CMethod *pMethod, pobj_c->Get Methods() ){539 BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ){ 508 540 //基底クラスと重複する場合はオーバーライドを行う 509 541 if( pMethod->GetInheritsClassPtr() ) continue; … … 524 556 525 557 //メソッドのオーバーライド 526 BOOST_FOREACH( CMethod *pMethod, pobj_c->Get Methods() ){558 BOOST_FOREACH( CMethod *pMethod, pobj_c->GetDynamicMethods() ){ 527 559 if( pMethod->GetUserProc().GetName() == temporary ){ 528 560 if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() ) … … 565 597 } 566 598 else{ 567 pobj_c->Get Methods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);599 pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual); 568 600 } 569 601 } … … 576 608 577 609 //メソッド 578 BOOST_FOREACH( const CMethod *pMethod, methods){610 BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){ 579 611 if( lstrcmp( name, pMethod->GetUserProc().GetName().c_str() ) == 0 ){ 580 612 return 1; … … 727 759 return alignment; 728 760 } 761 762 int CClass::GetVtblMasterListIndex( const UserProc *pUserProc ) const 763 { 764 int index = 0; 765 BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){ 766 if( &pMethod->GetUserProc() == pUserProc ) 767 { 768 return index; 769 } 770 } 771 772 BOOST_FOREACH( const ::Interface &objInterface, interfaces ) 773 { 774 index++; 775 776 BOOST_FOREACH( const CMethod *pMethod, objInterface.GetClass().GetDynamicMethods() ){ 777 if( &pMethod->GetUserProc() == pUserProc ) 778 { 779 return index; 780 } 781 } 782 } 783 784 SetError(); 785 return 0; 786 } 729 787 int CClass::GetFuncNumInVtbl( const UserProc *pUserProc ) const 730 788 { 731 789 int n = 0; 732 BOOST_FOREACH( const CMethod *pMethod, methods){790 BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){ 733 791 if( &pMethod->GetUserProc() == pUserProc ) break; 734 792 if( pMethod->IsVirtual() ) n++; … … 736 794 return n; 737 795 } 738 LONG_PTR CClass::GetVtblGlobalOffset(void) const 739 { 740 796 LONG_PTR CClass::GetVtblMasterListOffset() const 797 { 741 798 //既に存在する場合はそれを返す 742 if( vtbl_offset!=-1) return vtbl_offset;743 744 745 746 ////////////////////////////////////// 747 // 存在しないときは新たに生成する748 ////////////////////////////////////// 749 750 const UserProc **ppsi; 751 ppsi=(const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *));799 if( vtblMasterListOffset == -1 ) 800 { 801 SetError(); 802 } 803 804 return vtblMasterListOffset; 805 } 806 void CClass::GenerateVTablePart( LONG_PTR &vtableDataTableOffset ) const 807 { 808 const UserProc **ppsi = (const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *)); 752 809 753 810 //関数テーブルに値をセット 754 811 int i2 = 0; 755 BOOST_FOREACH( const CMethod *pMethod, methods ){ 756 if(pMethod->IsVirtual()){ 757 pMethod->GetUserProc().Using(); 758 759 if(pMethod->IsAbstract()){ 760 extern int cp; 761 SmoothieException::Throw(300,NULL,cp); 762 763 ppsi[i2]=0; 764 } 765 else{ 766 ppsi[i2]=&pMethod->GetUserProc(); 767 } 768 i2++; 769 } 770 } 771 772 vtbl_offset=compiler.GetObjectModule().dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR)); 773 774 for( int i=0; i < GetVtblNum(); i++ ){ 775 pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR)); 776 } 777 778 free(ppsi); 779 780 return vtbl_offset; 781 } 782 void CClass::GenerateVTables() 783 { 784 if( IsAbstract() ) 785 { 786 // 抽象クラスは無視 787 return; 788 } 789 if( !IsUsing() ) 790 { 791 // 使われていないクラスは無視 792 return; 793 } 794 795 const UserProc **ppsi; 796 ppsi=(const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *)); 797 798 //関数テーブルに値をセット 799 int i2 = 0; 800 BOOST_FOREACH( const CMethod *pMethod, methods ){ 812 BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){ 801 813 if(pMethod->IsVirtual()){ 802 814 if( !pMethod->GetUserProc().IsUsing() ) … … 819 831 } 820 832 821 vt bl_offset=compiler.GetObjectModule().dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR));833 vtableDataTableOffset = compiler.GetObjectModule().dataTable.AddBinary( (void *)ppsi, GetVtblNum()*sizeof(LONG_PTR) ); 822 834 823 835 for( int i=0; i < GetVtblNum(); i++ ){ 824 pobj_Reloc->AddSchedule_DataSection(vt bl_offset+i*sizeof(LONG_PTR));836 pobj_Reloc->AddSchedule_DataSection(vtableDataTableOffset+i*sizeof(LONG_PTR)); 825 837 } 826 838 827 839 free(ppsi); 828 840 } 829 void CClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){ 841 void CClass::GenerateVTableMasterList( const std::vector<LONG_PTR> &vtableMasterList, LONG_PTR &offset ) 842 { 843 offset = compiler.GetObjectModule().dataTable.AddBinary( 844 (void *)&vtableMasterList[0], 845 vtableMasterList.size()*sizeof(LONG_PTR) 846 ); 847 } 848 void CClass::GenerateFullVTables() 849 { 830 850 if( IsAbstract() ) 831 851 { … … 838 858 return; 839 859 } 860 861 // vtblマスターリストの元データに不要なデータが含まれていたらエラー 862 if( vtblMasterList.size() ) 863 { 864 SetError(); 865 } 866 867 // 自身のクラスのvtblを生成 868 GenerateVTablePart( this->vtbl_offset ); 869 vtblMasterList.push_back( this->vtbl_offset ); 870 871 // インターフェイスのvtblを生成 872 BOOST_FOREACH( const ::Interface &objInterface, interfaces ) 873 { 874 LONG_PTR tempVtblOffset; 875 objInterface.GetClass().GenerateVTablePart( tempVtblOffset ); 876 vtblMasterList.push_back( tempVtblOffset ); 877 878 objInterface.SetVtblOffset( tempVtblOffset ); 879 } 880 881 // vtblマスターリストを生成 882 GenerateVTableMasterList( vtblMasterList, this->vtblMasterListOffset ); 883 } 884 void CClass::ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection ) 885 { 886 if( IsAbstract() ) 887 { 888 // 抽象クラスは無視 889 return; 890 } 891 if( !IsUsing() ) 892 { 893 // 使われていないクラスは無視 894 return; 895 } 840 896 if(vtbl_offset==-1) return; 841 897 842 LONG_PTR *pVtbl; 843 pVtbl=(LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr()+vtbl_offset); 844 845 int i; 846 for(i=0;i<GetVtblNum();i++){ 847 UserProc *pUserProc; 848 pUserProc=(UserProc *)pVtbl[i]; 849 if(!pUserProc) continue; 850 851 if( pUserProc->GetBeginOpAddress() == 0 852 && pUserProc->GetEndOpAddress() == 0 ) 853 { 854 Jenga::Throw( "未解決の仮想関数が存在する" ); 855 } 856 857 pVtbl[i]=pUserProc->GetBeginOpAddress()+ImageBase+MemPos_CodeSection; 898 // 自身のクラスのvtbl 899 { 900 LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + vtbl_offset); 901 902 for( int i=0; i<GetVtblNum(); i++ ){ 903 const UserProc *pUserProc = (UserProc *)pVtbl[i]; 904 if(!pUserProc) continue; 905 906 if( pUserProc->GetBeginOpAddress() == 0 907 && pUserProc->GetEndOpAddress() == 0 ) 908 { 909 Jenga::Throw( "未解決の仮想関数が存在する" ); 910 } 911 912 pVtbl[i] = pUserProc->GetBeginOpAddress() + ImageBase + MemPos_CodeSection; 913 } 914 } 915 916 // インターフェイスのvtbl 917 BOOST_FOREACH( const ::Interface &objInterface, interfaces ) 918 { 919 LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + objInterface.GetClass().vtbl_offset); 920 921 for( int i=0; i<objInterface.GetClass().GetVtblNum(); i++ ){ 922 const UserProc *pUserProc = (UserProc *)pVtbl[i]; 923 if(!pUserProc) continue; 924 925 if( pUserProc->GetBeginOpAddress() == 0 926 && pUserProc->GetEndOpAddress() == 0 ) 927 { 928 Jenga::Throw( "未解決の仮想関数が存在する" ); 929 } 930 931 pVtbl[i] = pUserProc->GetBeginOpAddress() + ImageBase + MemPos_CodeSection; 932 } 933 } 934 935 // vtblマスターリスト 936 LONG_PTR *pVtblMasterList = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + vtblMasterListOffset ); 937 for( int i=0; i<static_cast<int>(vtblMasterList.size()); i++ ) 938 { 939 pVtblMasterList[i] = vtblMasterList[i] + ImageBase + MemPos_DataSection; 858 940 } 859 941 } … … 862 944 // 未実装(abstract)の仮想関数を持つ場合はtrueを返す 863 945 864 BOOST_FOREACH( const CMethod *pMethod, methods){946 BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){ 865 947 if(pMethod->IsVirtual()){ 866 948 if(pMethod->IsAbstract()){ … … 1051 1133 { 1052 1134 CClass *pClass = Iterator_GetNext(); 1053 pClass->Generate VTables();1054 } 1055 } 1056 1057 void Classes::ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){1135 pClass->GenerateFullVTables(); 1136 } 1137 } 1138 1139 void Classes::ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection ){ 1058 1140 Iterator_Reset(); 1059 1141 while( Iterator_HasNext() ) 1060 1142 { 1061 1143 CClass *pClass = Iterator_GetNext(); 1062 pClass->ActionVtblSchedule( ImageBase,MemPos_CodeSection);1144 pClass->ActionVtblSchedule( ImageBase, MemPos_CodeSection, MemPos_DataSection); 1063 1145 } 1064 1146 } … … 1826 1908 1827 1909 // 仮想関数になるメソッドに使用チェックをつける 1828 BOOST_FOREACH( const CMethod *pMethod, pParentClass->Get Methods() )1910 BOOST_FOREACH( const CMethod *pMethod, pParentClass->GetDynamicMethods() ) 1829 1911 { 1830 1912 if( pMethod->IsVirtual() ) … … 1834 1916 } 1835 1917 1836 pCompilingMethod = pParentClass->Get Methods().GetMethodPtr( pUserProc );1918 pCompilingMethod = pParentClass->GetDynamicMethods().GetMethodPtr( pUserProc ); 1837 1919 if( !pCompilingMethod ){ 1838 1920 pCompilingMethod = pParentClass->GetStaticMethods().GetMethodPtr( pUserProc );
Note:
See TracChangeset
for help on using the changeset viewer.