Changeset 448 in dev
- Timestamp:
- Mar 21, 2008, 7:34:57 PM (17 years ago)
- Location:
- trunk/ab5.0/abdev
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler32/OperatorProc.cpp
r435 r448 82 82 *pUserProc->Params()[i], 83 83 *params[i], 84 "",84 NULL, 85 85 i); 86 86 } -
trunk/ab5.0/abdev/BasicCompiler64/OperatorProc.cpp
r436 r448 88 88 *pUserProc->Params()[i], 89 89 *params[i], 90 "",90 NULL, 91 91 i); 92 92 } -
trunk/ab5.0/abdev/BasicCompiler_Common/error.cpp
r424 r448 470 470 } 471 471 472 if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ) 473 { 474 //等しくなく、派生クラスでもないとき 475 DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); 476 return false; 472 if( varType.IsDelegate() && calcType.IsDelegate() ) 473 { 474 // デリゲート同士の比較の場合 475 // ※共変戻り値及び反辺引数をサポートすること 476 if( !varType.GetClass().GetDelegate().IsSimilar( calcType.GetClass().GetDelegate() ) ) 477 { 478 // 等しいと見なされないとき 479 DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); 480 return false; 481 } 482 } 483 else 484 { 485 // 一般的なクラスの比較の場合 486 487 if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ) 488 { 489 //等しくなく、派生クラスでもないとき 490 DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); 491 return false; 492 } 477 493 } 478 494 } -
trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h
r422 r448 52 52 return dynamicParams; 53 53 } 54 55 /*! 56 @brief オーバーライド用にデリゲート同士が等しいかどうかをチェックする 57 @param dgt 照らし合わせるデリゲート 58 */ 59 bool IsSimilar( const Delegate &dgt ) const; 54 60 }; 55 61 -
trunk/ab5.0/abdev/BasicCompiler_Common/include/Parameter.h
r402 r448 84 84 } 85 85 86 bool Equals( const Parameter ¶m ) const;87 bool Equals( const Types &actualTypeParametersForThisProc, const Parameter ¶m ) const;86 bool Equals( const Parameter ¶m, bool isContravariant ) const; 87 bool Equals( const Types &actualTypeParametersForThisProc, const Parameter ¶m, bool isContravariant ) const; 88 88 }; 89 89 … … 102 102 public: 103 103 104 bool Equals( const Parameters ¶ms ) const;105 bool Equals( const Types &actualTypeParametersForThisProc, const Parameters ¶ms ) const;104 bool Equals( const Parameters ¶ms, bool isContravariant = false ) const; 105 bool Equals( const Types &actualTypeParametersForThisProc, const Parameters ¶ms, bool isContravariant = false ) const; 106 106 107 107 int GetMemorySize() const -
trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h
r447 r448 154 154 bool Equals( const Type &type ) const; 155 155 bool IsCovariant( const Type &type ) const; 156 bool IsContravariant( const Type &type ) const; 156 157 157 158 int GetBasicSize() const; -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
r422 r448 20 20 } 21 21 } 22 } 23 24 bool Delegate::IsSimilar( const Delegate &dgt ) const 25 { 26 if( this->Params().Equals( dgt.Params(), true ) ) // パラメータが等しい、もしくは反変 27 { 28 if( this->returnType.Equals( dgt.returnType ) ) 29 { 30 // 戻り値が等しい 31 return true; 32 } 33 else if( this->returnType.IsCovariant( dgt.returnType ) ) 34 { 35 // 戻り値が共変 36 return true; 37 } 38 } 39 return false; 22 40 } 23 41 … … 149 167 const Delegate &dg = *this->Iterator_GetNext(); 150 168 169 if( !dg.isTargetObjectModule ) 170 { 171 // 静的リンクライブラリの場合は飛ばす(既にインスタンスが定義済みであるため) 172 continue; 173 } 174 151 175 std::map<std::string,std::string> values; 152 176 -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp
r392 r448 152 152 } 153 153 meta.procPointers.PullOutAll(); 154 155 // デリゲート 156 meta.GetDelegates().Iterator_Reset(); 157 while( meta.GetDelegates().Iterator_HasNext() ) 158 { 159 Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext(); 160 pDelegate->isTargetObjectModule = false; 161 this->GetDelegates().Put( pDelegate ); 162 } 163 meta.GetDelegates().PullOutAll(); 154 164 } -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp
r422 r448 2 2 3 3 4 bool Parameter::Equals( const Parameter ¶m ) const4 bool Parameter::Equals( const Parameter ¶m, bool isContravariant ) const 5 5 { 6 6 if( Type::Equals( param ) ) … … 25 25 } 26 26 27 if( isContravariant ) 28 { 29 // 反変引数を許可する 30 if( this->IsContravariant( param ) ) 31 { 32 // 反変引数だったとき 33 return true; 34 } 35 } 36 27 37 return false; 28 38 } 29 bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter ¶m ) const30 { 31 if( Equals( param ) )39 bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter ¶m, bool isContravariant ) const 40 { 41 if( Equals( param, isContravariant ) ) 32 42 { 33 43 return true; … … 47 57 } 48 58 49 bool Parameters::Equals( const Parameters ¶ms ) const59 bool Parameters::Equals( const Parameters ¶ms, bool isContravariant ) const 50 60 { 51 61 if( this->size() != params.size() ){ … … 55 65 int max = (int)this->size(); 56 66 for( int i=0; i<max; i++ ){ 57 if( !(*this)[i]->Equals( *params[i] ) ){67 if( !(*this)[i]->Equals( *params[i], isContravariant ) ){ 58 68 return false; 59 69 } … … 62 72 return true; 63 73 } 64 bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters ¶ms ) const74 bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters ¶ms, bool isContravariant ) const 65 75 { 66 76 if( this->size() != params.size() ){ … … 70 80 int max = (int)this->size(); 71 81 for( int i=0; i<max; i++ ){ 72 if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i] ) ){82 if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i], isContravariant ) ){ 73 83 return false; 74 84 } -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp
r447 r448 161 161 162 162 return this->GetClass().IsSubClass( &type.GetClass() ); 163 } 164 bool Type::IsContravariant( const Type &type ) const 165 { 166 if( !this->IsObject() || !type.IsObject() ) 167 { 168 // 反変性の判別はクラス型のみ 169 return false; 170 } 171 172 return type.GetClass().IsSubClass( &this->GetClass() ); 163 173 } 164 174
Note:
See TracChangeset
for help on using the changeset viewer.