Changeset 299cfe9 in tol


Ignore:
Timestamp:
Apr 3, 2009, 2:41:06 PM (18 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
589249e
Parents:
a4edbdf
Message:

Fixes #673

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@875 be4846ae-f051-483a-831f-b64e7d08527f

Location:
tol/btol/bgrammar
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/bgrammar/class.cpp

    ra4edbdf r299cfe9  
    196196//--------------------------------------------------------------------
    197197{
    198   return(definition_.HasName());
     198  return(definition_.HasName()!=0);
    199199}
    200200
    … …  
    215215: isGood_      (true),
    216216  tree_        (NULL),   
    217   parentHash_  (new BClassByNameHash),
    218   ascentHash_  (new BClassByNameHash),
    219   mbrDecHash_  (new BMemberByNameHash),
    220   mbrDefHash_  (new BMemberByNameHash),
    221   memberHash_  (new BMbrNumByNameHash),
     217  parentHash_  (NULL),
     218  ascentHash_  (NULL),
     219  mbrDecHash_  (NULL),
     220  mbrDefHash_  (NULL),
     221  memberHash_  (NULL),
    222222  lastPosition_(0)
    223223{
    224   //Reset hash_map's
    225   SetEmptyKey  ((*parentHash_), NULL);
    226   SetEmptyKey  ((*ascentHash_), NULL);
    227   SetEmptyKey  ((*mbrDecHash_), NULL);
    228   SetEmptyKey  ((*mbrDefHash_), NULL);
    229   SetEmptyKey  ((*memberHash_), NULL);
    230   SetDeletedKey((*mbrDecHash_), name_del_key());
    231   SetDeletedKey((*mbrDefHash_), name_del_key());
    232   SetDeletedKey((*memberHash_), name_del_key());
    233224}
    234225
    … …  
    252243//--------------------------------------------------------------------
    253244{
     245  DestroyAll();
     246}
     247
     248//--------------------------------------------------------------------
     249void BMemberOwner::DestroyAll()
     250//--------------------------------------------------------------------
     251{
     252  DestroyMemberStore();
     253  DestroyParentHashes();
     254  DESTROY(tree_);
     255}
     256
     257//--------------------------------------------------------------------
     258void BMemberOwner::CreateMemberHashes()
     259//--------------------------------------------------------------------
     260{
     261  //Reset hash_map's
     262  mbrDecHash_  = new BMemberByNameHash;
     263  mbrDefHash_  = new BMemberByNameHash;
     264  memberHash_  = new BMbrNumByNameHash;
     265  SetEmptyKey  ((*mbrDecHash_), NULL);
     266  SetEmptyKey  ((*mbrDefHash_), NULL);
     267  SetEmptyKey  ((*memberHash_), NULL);
     268  SetDeletedKey((*mbrDecHash_), name_del_key());
     269  SetDeletedKey((*mbrDefHash_), name_del_key());
     270  SetDeletedKey((*memberHash_), name_del_key());
     271}
     272
     273//--------------------------------------------------------------------
     274void BMemberOwner::CreateParentHashes()
     275//--------------------------------------------------------------------
     276{
     277  //Reset hash_map's
     278  parentHash_  = new BClassByNameHash;
     279  ascentHash_  = new BClassByNameHash;
     280  SetEmptyKey  ((*parentHash_), NULL);
     281  SetEmptyKey  ((*ascentHash_), NULL);
     282}
     283
     284//--------------------------------------------------------------------
     285  void BMemberOwner::Copy(const BMemberOwner& mbrOwn)
     286//--------------------------------------------------------------------
     287{
    254288  int n=0;
    255   DestroyMemberStore();
    256 //Std(BText("\n")+Name()+"::~BClass()");
    257   //Frees parent classes
    258   BClassByNameHash::const_iterator iterC;
    259   if(parentHash_)
    260   {
    261     BClassByNameHash& par = *parentHash_;
     289  if(!mbrOwn.isGood_)
     290  {
     291    Error(I2("FATAL: Cannot copy corrupted BMemberOwner  ",
     292             "FATAL: No se puede copiar un BMemberOwner corrupto"));
     293    return;
     294  }
     295  DestroyAll();
     296
     297  tree_ = (mbrOwn.tree_)?mbrOwn.tree_->duplicate():NULL;
     298
     299  if(mbrOwn.parentHash_)
     300  {
     301    CreateParentHashes();
     302    BClassByNameHash::const_iterator iterC;
     303    BClassByNameHash& par = *(mbrOwn.parentHash_);
    262304    for(iterC=par.begin(); iterC!=par.end(); iterC++, n++)
    263305    {
    264       BClass* parent = iterC->second;
    265       parent->DecNRefs();
    266       DESTROY(parent);
    267     };
    268     delete parentHash_;
    269   }
    270   if(ascentHash_) { delete ascentHash_; }
    271 
    272   //Destroy parsed tree
    273   DESTROY(tree_);
     306      AddParent(iterC->second);
     307    }
     308  }
     309  if(mbrOwn.memberHash_)
     310  {
     311    BMbrNumByNameHash::const_iterator iterM;
     312    BMbrNumByNameHash& mbr = *(mbrOwn.memberHash_);
     313    for(iterM=mbr.begin(); iterM!=mbr.end(); iterM++, n++)
     314    {
     315      AddMember(iterM->second->member_);
     316    }
     317  }
     318  lastPosition_ = mbrOwn.lastPosition_;
    274319}
    275320
    … …  
    306351  mbrDefHash_ = NULL;
    307352  memberHash_ = NULL;
     353}
     354
     355//--------------------------------------------------------------------
     356  void BMemberOwner::DestroyParentHashes()
     357//--------------------------------------------------------------------
     358{
     359  if(parentHash_)
     360  {
     361    int n=0;
     362    BClassByNameHash::const_iterator iterC;
     363    BClassByNameHash& par = *parentHash_;
     364    for(iterC=par.begin(); iterC!=par.end(); iterC++, n++)
     365    {
     366      BClass* parent = iterC->second;
     367      parent->DecNRefs();
     368      DESTROY(parent);
     369    };
     370    delete parentHash_;
     371  }
     372  if(ascentHash_) { delete ascentHash_; }
     373}
     374
     375//--------------------------------------------------------------------
     376  void BMemberOwner::PutTree(List* tree)
     377//--------------------------------------------------------------------
     378{
     379  tree_ = tree;
    308380}
    309381
    … …  
    335407
    336408//--------------------------------------------------------------------
    337   void BMemberOwner::Copy(const BMemberOwner& mbrOwn)
    338 //--------------------------------------------------------------------
    339 {
    340   isGood_      = mbrOwn.isGood_;
    341   tree_        = (mbrOwn.tree_)?mbrOwn.tree_->duplicate():NULL;
    342   parentHash_  = new BClassByNameHash (*mbrOwn.parentHash_);
    343   ascentHash_  = new BClassByNameHash (*mbrOwn.ascentHash_);
    344   mbrDecHash_  = new BMemberByNameHash(*mbrOwn.mbrDecHash_);
    345   mbrDefHash_  = new BMemberByNameHash(*mbrOwn.mbrDefHash_);
    346   memberHash_  = new BMbrNumByNameHash(*mbrOwn.memberHash_);
    347   lastPosition_ = mbrOwn. lastPosition_;
    348 }
    349 
    350 //--------------------------------------------------------------------
    351   void BMemberOwner::PutTree(List* tree)
    352 //--------------------------------------------------------------------
    353 {
    354   tree_ = tree;
    355 }
    356 
    357 //--------------------------------------------------------------------
    358409  bool BMemberOwner::InheritesFrom(const BText& name) const
    359410//! True if inherites from a Class called as given name
    360411//--------------------------------------------------------------------
    361412{
    362   if(!isGood_) { return(false); }
     413  if(!isGood_ || !ascentHash_) { return(false); }
    363414  BClassByNameHash::const_iterator found = ascentHash_->find(name);
    364415  return(found!=ascentHash_->end());
    … …  
    377428//--------------------------------------------------------------------
    378429{
    379   if(!isGood_) { return(NULL); }
     430  if(!isGood_ || !memberHash_) { return(NULL); }
    380431  BMbrNumByNameHash::const_iterator found;
    381432  found = memberHash_->find(name);
    … …  
    398449//--------------------------------------------------------------------
    399450{
    400   if(!isGood_) { return(NULL); }
     451  if(!isGood_ || !memberHash_) { return(NULL); }
    401452  BMemberByNameHash::const_iterator found;
    402453  found = mbrDefHash_->find(declaration);
    … …  
    410461//--------------------------------------------------------------------
    411462{
    412   if(!isGood_) { return(NULL); }
     463  if(!isGood_ || !memberHash_) { return(NULL); }
    413464  BMemberByNameHash::const_iterator found;
    414465  found = mbrDecHash_->find(declaration);
    … …  
    423474{
    424475  if(!isGood_) { return(false); }
     476  if(!memberHash_) { CreateMemberHashes(); }
    425477  BMbrNum* newMbrNum = new BMbrNum;
    426478  newMbrNum->member_ = newMember;
    … …  
    521573  if(!isGood_) { return(false); }
    522574  if(!parent) { return(true); }
     575  if(!parentHash_) { CreateParentHashes(); }
    523576//Std(BText("\n")+Name()+"::AddParent("+parent->Name()+")");
    524577  bool ok = true;
    … …  
    568621{
    569622  if(!isGood_) { return(false); }
     623  if(!parentHash_) { CreateParentHashes(); }
    570624  int n;
    571625  bool ok = true;
    … …  
    583637//--------------------------------------------------------------------
    584638{
    585   if(!isGood_) { return(false); }
     639  if(!isGood_ ) { return(false); }
     640  if(!memberHash_) { CreateMemberHashes(); }
    586641  bool ok = true;
    587642  BMember* mbr = NULL;
    … …  
    595650      while(ok && lst)
    596651      {
    597         if(ok = lst->car()->IsListClass())
     652        if(ok = lst->car()->IsListClass()!=0)
    598653        {
    599654          mbr = new BMember(this, (List*)lst->car());
    … …  
    619674        while(ok && lst)
    620675        {
    621           if(ok = lst->car()->IsListClass())
     676          if(ok = lst->car()->IsListClass()!=0)
    622677          {
    623678            mbr = new BMember(this, (List*)lst->car());
    … …  
    658713  BMemberOwner()
    659714{
     715  CreateMemberHashes();
     716  CreateParentHashes();
    660717}
    661718
    … …  
    668725{
    669726  PutTree(tree_);
     727  CreateMemberHashes();
     728  CreateParentHashes();
    670729  //Adds object to language searchers
    671730  BGrammar::AddObject(this);
  • tol/btol/bgrammar/nameblock.cpp

    ra4edbdf r299cfe9  
    162162//--------------------------------------------------------------------
    163163{
    164   Copy(ns);
     164  BMemberOwner::Copy(ns);
    165165  PutName(ns.Name());
     166  localName_ = ns.LocalName();
    166167  owner_     = NULL;
    167   set_       = ns.Set();
    168168  father_    = ns.Father();
    169   public_    = ns.Public();
    170   private_   = ns.Private();
    171   localName_ = ns.LocalName();
    172   //VBR: La copia de NameBlock tiene un problema si los miembros
    173   //referenciados en ambos son los mismos, ¿cuál es su padre?
     169  Fill(ns.Set());
     170  Build();
    174171  return(*this);
    175172}
     173
    176174
    177175//--------------------------------------------------------------------
  • tol/btol/bgrammar/spfuninst.cpp

    ra4edbdf r299cfe9  
    867867                    BUserTimeSerieDo* s1 = (BUserTimeSerieDo*)result;
    868868                    BUserTimeSerieDo* s2 = (BUserTimeSerieDo*)val;
    869                     s1->PutContens(s2);
    870 #ifdef __USE_TC__
    871                 } else if(type==GraCSeries()) {
    872                     BUserCTimeSeriesDo* s1 = (BUserCTimeSeriesDo*)result;
    873                     BUserCTimeSeriesDo* s2 = (BUserCTimeSeriesDo*)val;
    874                     s1->PutContens(s2);
    875 #endif /* __USE_TC__ */
    876     } else if(type==GraNameBlock())  {
     869                    s1->PutContens(s2); }
     870    else if(type==GraNameBlock())  {
     871/*
    877872      Error(I2("Cannot apply PutValue (nor :=) to NameBlock variables",
    878873        "No se puede aplicar la función PutValue (ni :=) a variables NameBlock"));
    879874      result = NULL;
    880                 } else {
     875*/
     876                    ((BUserNameBlock*)(result))->PutContens(((BUserNameBlock*)(val))->Contens());
     877    }
     878#ifdef __USE_TC__
     879                else if(type==GraCSeries()) {
     880                    BUserCTimeSeriesDo* s1 = (BUserCTimeSeriesDo*)result;
     881                    BUserCTimeSeriesDo* s2 = (BUserCTimeSeriesDo*)val;
     882                    s1->PutContens(s2); }
     883#endif /* __USE_TC__ */
     884                else {
    881885                    TestResult(_name_,NIL,tre,NIL,BTRUE,
    882886                               I2("Incompatible types: ",
  • tol/btol/bgrammar/tol_bclass.h

    ra4edbdf r299cfe9  
    113113 ~BMemberOwner();
    114114
     115  void CreateMemberHashes();
     116  void CreateParentHashes();
    115117  void DestroyMemberStore();
     118  void DestroyParentHashes();
     119  void DestroyAll();
    116120  const BMemberOwner& operator = (const BMemberOwner& mbrOwn)
    117121  {
Note: See TracChangeset for help on using the changeset viewer.