Changeset 751


Ignore:
Timestamp:
10/21/15 13:40:58 (9 years ago)
Author:
rlacroix
Message:

Improve the handling of circular references.

  • Make circular references a critical error.
  • Detect circular dependency earlier.
  • Fix and improve the error message.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/declare_ref_func.hpp

    r750 r751  
    3434void C##type::solveRefInheritance(bool apply)                          \ 
    3535{                                                                      \ 
    36   std::set<C##type*> sset;                                             \ 
     36  std::set<C##type*> refObjects;                                       \ 
    3737  C##type* refer_ptr = this;                                           \ 
    3838                                                                       \ 
    3939  while (refer_ptr->hasDirect##type##Reference())                      \ 
    4040  {                                                                    \ 
     41    refObjects.insert(refer_ptr);                                      \ 
     42                                                                       \ 
    4143    refer_ptr = refer_ptr->getDirect##type##Reference();               \ 
    4244                                                                       \ 
    43     if (sset.end() != sset.find(refer_ptr))                            \ 
     45    if (refObjects.end() != refObjects.find(refer_ptr))                \ 
    4446    {                                                                  \ 
    45       DEBUG(<< "Circular dependency stopped for #name object on "      \ 
    46             << "\"" + refer_ptr->getId() + "\" !");                    \ 
    47       break;                                                           \ 
     47      ERROR("void C" #type "::solveRefInheritance(bool apply)",        \ 
     48            << "Circular dependency stopped for " #name " object "     \ 
     49            << "with id = \"" << refer_ptr->getId() << "\".");         \ 
    4850    }                                                                  \ 
    4951                                                                       \ 
    5052    SuperClassAttribute::setAttributes(refer_ptr, apply);              \ 
    51     sset.insert(refer_ptr);                                            \ 
    5253  }                                                                    \ 
    5354}                                                                      \ 
     
    6162void C##type::solveBaseReference(void)                                 \ 
    6263{                                                                      \ 
    63   std::set<C##type*> sset;                                             \ 
     64  std::set<C##type*> refObjects;                                       \ 
    6465  baseRefObject = C##type::get(this);                                  \ 
    6566                                                                       \ 
    6667  while (baseRefObject->hasDirect##type##Reference())                  \ 
    6768  {                                                                    \ 
     69    refObjects.insert(baseRefObject);                                  \ 
     70                                                                       \ 
    6871    baseRefObject = baseRefObject->getDirect##type##Reference();       \ 
    6972                                                                       \ 
    70     if (sset.end() != sset.find(baseRefObject))                        \ 
     73    if (refObjects.end() != refObjects.find(baseRefObject))            \ 
    7174    {                                                                  \ 
    72       DEBUG(<< "Circular dependency stopped for #name object on "      \ 
    73             << "\"" + baseRefObject->getId() + "\" !");                \ 
    74       break;                                                           \ 
     75      ERROR("void C" #type "::solveBaseReference(void)",               \ 
     76            << "Circular dependency stopped for " #name " object "     \ 
     77            << "with id = \"" << baseRefObject->getId() << "\".");     \ 
    7578    }                                                                  \ 
    76                                                                        \ 
    77     sset.insert(baseRefObject);                                        \ 
    7879  }                                                                    \ 
    7980                                                                       \ 
Note: See TracChangeset for help on using the changeset viewer.