Changeset 449 in dev
- Timestamp:
- Mar 22, 2008, 1:56:31 AM (17 years ago)
- Location:
- trunk/ab5.0/abdev
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp
r431 r449 436 436 { 437 437 extern int cp; 438 439 const Parameters *pBaseParams = NULL; 440 const Type *pBaseReturnType = NULL; 441 if( baseType.IsProcPtr() ) 442 { 443 // 左辺で関数ポインタを要求されているとき 444 const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]; 445 pBaseParams = &pTempProcPointer->Params(); 446 pBaseReturnType = &pTempProcPointer->ReturnType(); 447 } 448 else if( baseType.IsDelegate() ) 449 { 450 // 左辺でデリゲートを要求されているとき 451 const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate(); 452 pBaseParams = &pTempDelegate->Params(); 453 pBaseReturnType = &pTempDelegate->ReturnType(); 454 } 455 438 456 const UserProc *pUserProc; 439 440 const Parameters *pBaseParams = NULL; 441 if( baseType.IsProcPtr() ) 442 { 443 // 左辺で関数ポインタを要求されているとき 444 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 445 } 446 else if( baseType.IsDelegate() ) 447 { 448 // 左辺でデリゲートを要求されているとき 449 pBaseParams = &baseType.GetClass().GetDelegate().Params(); 450 } 451 452 if( pBaseParams ) 457 if( pBaseParams && pBaseReturnType ) 453 458 { 454 459 //左辺の型にのっとり、オーバーロードを解決 … … 464 469 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() ); 465 470 466 if( isCallOn && baseType.IsDelegate())471 if( isCallOn ) 467 472 { 468 473 // コード生成を伴う場合はエラーチェックを行う 469 if( !pUserProc->Params().Equals( *pBaseParams ) 470 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType()) )474 475 if( baseType.IsDelegate() ) 471 476 { 472 if( baseType.IsDelegate() ) 477 // デリゲート 478 // 共変戻り値、反変引数をサポート 479 if( !( 480 pBaseParams->Equals( pUserProc->Params(), true ) 481 && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) ) 482 ) ) 473 483 { 474 484 SetError(67, name, cp ); 475 485 } 476 else 486 } 487 else 488 { 489 // 関数ポインタ 490 if( !( 491 pBaseParams->Equals( pUserProc->Params() ) 492 && pBaseReturnType->Equals( pUserProc->ReturnType() ) 493 ) ) 477 494 { 478 495 SetError(66, name, cp ); -
trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp
r432 r449 288 288 { 289 289 extern int cp; 290 291 const Parameters *pBaseParams = NULL; 292 const Type *pBaseReturnType = NULL; 293 if( baseType.IsProcPtr() ) 294 { 295 // 左辺で関数ポインタを要求されているとき 296 const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]; 297 pBaseParams = &pTempProcPointer->Params(); 298 pBaseReturnType = &pTempProcPointer->ReturnType(); 299 } 300 else if( baseType.IsDelegate() ) 301 { 302 // 左辺でデリゲートを要求されているとき 303 const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate(); 304 pBaseParams = &pTempDelegate->Params(); 305 pBaseReturnType = &pTempDelegate->ReturnType(); 306 } 307 290 308 const UserProc *pUserProc; 291 292 const Parameters *pBaseParams = NULL; 293 if( baseType.IsProcPtr() ) 294 { 295 // 左辺で関数ポインタを要求されているとき 296 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 297 } 298 else if( baseType.IsDelegate() ) 299 { 300 // 左辺でデリゲートを要求されているとき 301 pBaseParams = &baseType.GetClass().GetDelegate().Params(); 302 } 303 304 if( pBaseParams ) 309 if( pBaseParams && pBaseReturnType ) 305 310 { 306 311 //左辺の型にのっとり、オーバーロードを解決 … … 316 321 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() ); 317 322 318 if( isCallOn && baseType.IsDelegate())323 if( isCallOn ) 319 324 { 320 325 // コード生成を伴う場合はエラーチェックを行う 321 if( !pUserProc->Params().Equals( *pBaseParams ) 322 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType()) )326 327 if( baseType.IsDelegate() ) 323 328 { 324 if( baseType.IsDelegate() ) 329 // デリゲート 330 // 共変戻り値、反変引数をサポート 331 if( !( 332 pBaseParams->Equals( pUserProc->Params(), true ) 333 && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) ) 334 ) ) 325 335 { 326 336 SetError(67, name, cp ); 327 337 } 328 else 338 } 339 else 340 { 341 // 関数ポインタ 342 if( !( 343 pBaseParams->Equals( pUserProc->Params() ) 344 && pBaseReturnType->Equals( pUserProc->ReturnType() ) 345 ) ) 329 346 { 330 347 SetError(66, name, cp ); -
trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h
r448 r449 11 11 { 12 12 friend Delegates; 13 14 // importされている名前空間 15 NamespaceScopesCollection importedNamespaces; 13 16 14 17 std::string paramStr; … … 26 29 27 30 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure ); 31 ar & BOOST_SERIALIZATION_NVP( importedNamespaces ); 28 32 ar & BOOST_SERIALIZATION_NVP( dynamicParams ); 29 33 } 30 34 31 35 public: 32 Delegate( const NamespaceScopes &namespaceScopes, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )36 Delegate( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex ) 33 37 : Procedure( namespaceScopes, name, procKind, false ) 38 , importedNamespaces( importedNamespaces ) 34 39 , paramStr( paramStr ) 35 40 , returnTypeName( returnTypeName ) -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
r448 r449 5 5 void Delegate::RefleshParameterAndReturnType() 6 6 { 7 compiler.GetNamespaceSupporter().SetImportedNamespaces( this->importedNamespaces ); 8 compiler.GetNamespaceSupporter().SetLivingNamespaceScopes( this->GetNamespaceScopes() ); 9 7 10 // パラメータを解析 8 11 params.Analyze( paramStr.c_str(), sourceIndex ); … … 151 154 } 152 155 153 this->Put( new Delegate( namespaceScopes, name, procKind, paramStr, returnTypeName, nowLine ) );156 this->Put( new Delegate( namespaceScopes, importedNamespaces, name, procKind, paramStr, returnTypeName, nowLine ) ); 154 157 } 155 158 }
Note:
See TracChangeset
for help on using the changeset viewer.