- Timestamp:
- Oct 17, 2007, 3:31:20 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/error.cpp
r342 r351 216 216 if(num==300) lstrcpy(msg,"内部エラー"); 217 217 218 // ベースライブラリ不整合 219 if( num == 400 ) sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord ); 220 218 221 #else 219 222 //////////////////// -
trunk/abdev/BasicCompiler_Common/include/Method.h
r347 r351 51 51 } 52 52 53 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0; 54 53 55 virtual bool IsAbstract() const = 0; 54 virtual void Override() = 0;56 virtual void SetAbstractMark( bool isAbstractMark ) = 0; 55 57 virtual bool IsVirtual() const = 0; 56 58 virtual bool IsConst() const = 0; … … 103 105 } 104 106 107 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ); 108 105 109 virtual bool IsAbstract() const 106 110 { 107 111 return isAbstract; 108 112 } 109 virtual void Override()110 { 111 isAbstract = false;113 virtual void SetAbstractMark( bool isAbstract ) 114 { 115 this->isAbstract = isAbstract; 112 116 } 113 117 virtual bool IsVirtual() const … … 150 154 151 155 public: 156 157 // コンストラクタ 152 158 StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility ) 153 159 : CMethod( pUserProc, accessibility ) 154 160 { 155 161 } 162 163 // コピーコンストラクタ 164 StaticMethod( const StaticMethod &staticMethod ); 165 166 // デストラクタ 156 167 StaticMethod() 157 168 { 158 169 } 159 170 171 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ){SetError();return false;} 172 160 173 virtual bool IsAbstract() const{SetError();return false;} 161 virtual void Override(){SetError();}174 virtual void SetAbstractMark( bool isAbstract ){SetError();} 162 175 virtual bool IsVirtual() const{ 163 176 return false; … … 190 203 191 204 public: 205 // コンストラクタ 192 206 Methods(); 207 208 // コピーコンストラクタ 209 Methods( const Methods &methods ); 210 211 // デストラクタ 193 212 ~Methods(); 194 213 … … 197 216 void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility); 198 217 199 // オーバーライド 200 bool Override( UserProc *pUserProc, Prototype::Accessibility accessibility);218 // オーバーライドのための検索 219 CMethod *FindForOverride( const UserProc *pUserProc ); 201 220 202 221 const CMethod *GetMethodPtr( const UserProc *pUserProc ) const; -
trunk/abdev/BasicCompiler_Common/include/Procedure.h
r350 r351 220 220 } 221 221 222 // オーバーライド用に関数同士が等しいかどうかをチェックする 223 bool IsEqualForOverride( const UserProc *pUserProc ) const 224 { 225 if( this->GetName() == pUserProc->GetName() // 名前空間及び名前が等しい 226 && this->Params().Equals( pUserProc->Params() ) // パラメータが等しい 227 && this->returnType.Equals( pUserProc->returnType ) ) // 戻り値が等しい 228 { 229 return true; 230 } 231 return false; 232 } 233 222 234 bool IsMacro() const 223 235 { -
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r350 r351 382 382 SetSuperClassActualTypeParameters( actualTypeParameters ); 383 383 384 // インターフェイスを引き継ぐ 385 BOOST_FOREACH( ::Interface *pInterface, inheritsClass.GetInterfaces() ) 386 { 387 interfaces.push_back( new ::Interface( *pInterface ) ); 388 } 389 384 390 return true; 385 391 } … … 447 453 } 448 454 449 interfaces.push_back( new ::Interface( &interfaceClass ) ); 450 455 ::Interface *pDestInterface = new ::Interface( &interfaceClass ); 456 457 interfaces.push_back( pDestInterface ); 458 459 460 ///////////////////////////////////////////////////////////////// 461 // 基底クラスのメソッドからインターフェイスメソッドを再実する 462 ///////////////////////////////////////////////////////////////// 463 BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() ) 464 { 465 CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() ); 466 if( pMethodForOverride ) 467 { 468 pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false ); 469 } 470 } 471 472 473 ///////////////////////////////////////////////////////////////// 451 474 // キャストメソッドを追加(内部コードは自動生成すること) 475 ///////////////////////////////////////////////////////////////// 452 476 { 453 477 // Function Operator() As ITest … … 474 498 } 475 499 500 476 501 return true; 477 502 } … … 600 625 601 626 //メソッド 602 BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ){ 627 BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ) 628 { 603 629 //基底クラスと重複する場合はオーバーライドを行う 604 630 if( pMethod->GetInheritsClassPtr() ) continue; 605 631 606 if( pMethod->GetUserProc().GetName() == temporary ){ 607 if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() ) 608 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) ) 609 { 610 //関数名、パラメータ、戻り値が合致したとき 611 SetError(15,pUserProc->GetName().c_str(),nowLine); 612 return; 613 } 632 if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) ) 633 { 634 //関数名、パラメータ、戻り値が合致したとき 635 SetError(15,pUserProc->GetName().c_str(),nowLine); 636 return; 614 637 } 615 638 } … … 619 642 620 643 // メソッドのオーバーライド 621 if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) ) 622 { 623 // オーバーライドが行われた場合 624 if( !isOverride ) 625 { 626 SetError(127,NULL,nowLine); 627 } 644 CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc ); 645 if( pMethodForOverride ) 646 { 647 pMethodForOverride->Override( pUserProc, accessibility, isOverride ); 648 pUserProc->SetMethod( pMethodForOverride ); 628 649 return; 629 650 } … … 633 654 BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() ) 634 655 { 635 if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) ) 656 CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc ); 657 if( pMethodForOverride ) 636 658 { 637 // オーバーライドが行われた場合 638 if( !isOverride ) 639 { 640 SetError(127,NULL,nowLine); 641 } 659 pMethodForOverride->Override( pUserProc, accessibility, isOverride ); 660 pUserProc->SetMethod( pMethodForOverride ); 642 661 return; 643 662 } … … 1026 1045 if(pMethod->IsAbstract()){ 1027 1046 return true; 1047 } 1048 } 1049 } 1050 1051 // インターフェイスのvtbl 1052 BOOST_FOREACH( const ::Interface *pInterface, interfaces ) 1053 { 1054 BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){ 1055 if(pMethod->IsVirtual()){ 1056 if(pMethod->IsAbstract()){ 1057 return true; 1058 } 1028 1059 } 1029 1060 } … … 2021 2052 if( !pStringClass ) 2022 2053 { 2023 SmoothieException::Throw(); 2054 SetError(400, "System.String", cp); 2055 static CClass dummy; 2056 return &dummy; 2024 2057 } 2025 2058 return pStringClass; … … 2035 2068 if( !pObjectClass ) 2036 2069 { 2037 SmoothieException::Throw(); 2070 SetError(400, "System.Object", cp); 2071 static CClass dummy; 2072 return &dummy; 2038 2073 } 2039 2074 return pObjectClass; … … 2049 2084 if( !pInterfaceInfo ) 2050 2085 { 2051 SmoothieException::Throw(); 2086 SetError(400, "ActiveBasic.Core.InterfaceInfo", cp); 2087 static CClass dummy; 2088 return &dummy; 2052 2089 } 2053 2090 return pInterfaceInfo; -
trunk/abdev/BasicCompiler_Common/src/Method.cpp
r347 r351 4 4 5 5 6 bool DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) 7 { 8 if( this->IsVirtual() 9 && !this->IsAbstract() 10 && isOverrideModifier == false ) 11 { 12 // Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした 13 SetError(127,NULL,cp); 14 } 15 16 //メンバ関数を上書き 17 this->SetUserProcPtr( pUserProc ); 18 this->SetAbstractMark( false ); 19 20 if( !this->IsVirtual() ) 21 { 22 // オーバーライドミス 23 SetError(136,NULL,cp); 24 } 25 if(this->GetAccessibility() != accessibility ) 26 { 27 SetError(128,NULL,cp); 28 } 29 30 return true; 31 } 32 33 34 StaticMethod::StaticMethod( const StaticMethod &staticMethod ) 35 { 36 // 静的メソッドがコピーコンストラトされることは想定しない 37 SetError(); 38 } 39 6 40 Methods::Methods() 7 41 { 8 42 } 43 44 // コピーコンストラクタ 45 Methods::Methods( const Methods &methods ) 46 { 47 BOOST_FOREACH( CMethod *pMethod, methods ) 48 { 49 this->push_back( new DynamicMethod( dynamic_cast<DynamicMethod &>(*pMethod) ) ); 50 } 51 } 52 9 53 Methods::~Methods() 10 54 { 11 55 Methods &methods = *this; 12 BOOST_FOREACH( CMethod *pMethod, methods ){ 56 BOOST_FOREACH( CMethod *pMethod, methods ) 57 { 13 58 delete pMethod; 14 59 } … … 26 71 } 27 72 28 bool Methods::Override( UserProc *pUserProc, Prototype::Accessibility accessibility)73 CMethod *Methods::FindForOverride( const UserProc *pUserProc ) 29 74 { 30 75 //メソッドのオーバーライド … … 32 77 BOOST_FOREACH( CMethod *pMethod, methods ) 33 78 { 34 if( pMethod->GetUserProc(). GetName() == pUserProc->GetName() )79 if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) ) 35 80 { 36 if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() ) 37 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) ) 38 { 39 //メンバ関数を上書き 40 pMethod->SetUserProcPtr( pUserProc ); 41 pMethod->Override(); 42 43 if( !pMethod->IsVirtual() ) 44 { 45 // オーバーライドミス 46 SetError(136,NULL,cp); 47 } 48 if(pMethod->GetAccessibility() != accessibility ) 49 { 50 SetError(128,NULL,cp); 51 } 52 53 pUserProc->SetMethod( pMethod ); 54 return true; 55 } 81 return pMethod; 56 82 } 57 83 } 58 return false;84 return NULL; 59 85 } 60 86
Note:
See TracChangeset
for help on using the changeset viewer.