Changeset 346 in dev for trunk/abdev/BasicCompiler_Common/src/Class.cpp
- Timestamp:
- Oct 10, 2007, 4:01:07 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r345 r346 198 198 bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const 199 199 { 200 BOOST_FOREACH( const ::Interface &objInterface, interfaces ){201 if( pInterfaceClass == & objInterface.GetClass() ){200 BOOST_FOREACH( const ::Interface *pInterface, interfaces ){ 201 if( pInterfaceClass == &pInterface->GetClass() ){ 202 202 return true; 203 203 } … … 447 447 } 448 448 449 interfaces.push_back( ::Interface( &interfaceClass ) );449 interfaces.push_back( new ::Interface( &interfaceClass ) ); 450 450 451 451 return true; … … 587 587 if( isAbstract ) pUserProc->CompleteCompile(); 588 588 589 //メソッドのオーバーライド 590 BOOST_FOREACH( CMethod *pMethod, pobj_c->GetDynamicMethods() ){ 591 if( pMethod->GetUserProc().GetName() == temporary ){ 592 if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() ) 593 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) ) 589 // メソッドのオーバーライド 590 if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) ) 591 { 592 // オーバーライドが行われた場合 593 if( !isOverride ) 594 { 595 SetError(127,NULL,nowLine); 596 } 597 return; 598 } 599 else 600 { 601 // インターフェイス メソッドのオーバーライド 602 BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() ) 603 { 604 if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) ) 594 605 { 595 //メンバ関数を上書き 596 pMethod->SetUserProcPtr( pUserProc ); 597 pMethod->Override(); 598 599 if( !pMethod->IsVirtual() ) 600 { 601 // オーバーライドミス 602 SetError(136,NULL,cp); 603 } 606 // オーバーライドが行われた場合 604 607 if( !isOverride ) 605 608 { 606 609 SetError(127,NULL,nowLine); 607 610 } 608 if(pMethod->GetAccessibility() != accessibility )609 {610 SetError(128,NULL,nowLine);611 }612 613 pUserProc->SetMethod( pMethod );614 611 return; 615 612 } … … 802 799 } 803 800 804 BOOST_FOREACH( const ::Interface &objInterface, interfaces )801 BOOST_FOREACH( const ::Interface *pInterface, interfaces ) 805 802 { 806 803 index++; 807 804 808 BOOST_FOREACH( const CMethod *pMethod, objInterface.GetClass().GetDynamicMethods() ){805 BOOST_FOREACH( const CMethod *pMethod, pInterface->GetClass().GetDynamicMethods() ){ 809 806 if( &pMethod->GetUserProc() == pUserProc ) 810 807 { … … 902 899 903 900 // インターフェイスのvtblを生成 904 BOOST_FOREACH( const ::Interface &objInterface, interfaces )901 BOOST_FOREACH( const ::Interface *pInterface, interfaces ) 905 902 { 906 903 long tempVtblOffset; 907 objInterface.GetClass().GenerateVTablePart( tempVtblOffset );904 pInterface->GetClass().GenerateVTablePart( tempVtblOffset ); 908 905 vtblMasterList.push_back( tempVtblOffset ); 909 906 910 objInterface.SetVtblOffset( tempVtblOffset );907 pInterface->SetVtblOffset( tempVtblOffset ); 911 908 } 912 909 … … 947 944 948 945 // インターフェイスのvtbl 949 BOOST_FOREACH( const ::Interface &objInterface, interfaces )950 { 951 LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + objInterface.GetClass().vtbl_offset);952 953 for( int i=0; i< objInterface.GetClass().GetVtblNum(); i++ ){946 BOOST_FOREACH( const ::Interface *pInterface, interfaces ) 947 { 948 LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + pInterface->GetClass().vtbl_offset); 949 950 for( int i=0; i<pInterface->GetClass().GetVtblNum(); i++ ){ 954 951 const UserProc *pUserProc = (UserProc *)pVtbl[i]; 955 952 if(!pUserProc) continue;
Note:
See TracChangeset
for help on using the changeset viewer.