Alien-SmokeQt

 view release on metacpan or  search on metacpan

generator/parser/rpp/pp-environment.cpp  view on Meta::CPAN

    }
  }

  bool wasReplaying = m_replaying;
  m_replaying = true;

  int macroIndex = 0;
  int childIndex = 0;
  while (macroIndex < block->macros.count() || childIndex < block->childBlocks.count()) {
    MacroBlock* child = childIndex < block->childBlocks.count() ? block->childBlocks.at(childIndex) : 0;
    pp_macro* macro = macroIndex < block->macros.count() ? block->macros.at(macroIndex) : 0;

    Q_ASSERT(child || macro);

    bool visitMacro = macro && (!child || (child->sourceLine < macro->sourceLine));

    if (!visitMacro) {
      Q_ASSERT(child);
      visitBlock(child, depth);
      ++childIndex;

    } else {
      Q_ASSERT(macro);
      if (macro->defined)
        setMacro(macro);
      else
        clearMacro(macro->name);
      ++macroIndex;
    }
  }

  // No need to visit else block, it will be skipped (already a matched block)

  m_replaying = wasReplaying;
}

MacroBlock* Environment::enterBlock(int sourceLine, const QVector<uint>& condition)
{
  MacroBlock* ret = new MacroBlock(sourceLine);
  ret->condition = condition;

  enterBlock(ret);

  return ret;
}

MacroBlock* Environment::elseBlock(int sourceLine, const QVector<uint>& condition)
{
  MacroBlock* ret = new MacroBlock(sourceLine);
  ret->condition = condition;

  Q_ASSERT(!m_blocks.isEmpty());
  m_blocks.top()->elseBlock = ret;

  m_blocks.pop();
  m_blocks.push(ret);

  return ret;
}

void Environment::swapMacros( Environment* parentEnvironment ) {
  EnvironmentMap oldEnvironment = m_environment;
  m_environment = parentEnvironment->m_environment;
  parentEnvironment->m_environment = oldEnvironment;
  
  if(!parentEnvironment->currentBlock()) {
    
    if(currentBlock()) {
      foreach(pp_macro* macro, m_environment)
        currentBlock()->macros.append(macro);
    }
  }else{
    //If both sides have a macro-block, it should be the same one, else the macros can not be safely swapped
    Q_ASSERT(parentEnvironment->firstBlock() == firstBlock());
  }
}

void Environment::leaveBlock()
{
  m_blocks.pop();
}

void Environment::clear()
{
  m_environment.clear();
  m_blocks.clear();
}

void Environment::clearMacro(const IndexedString& name)
{
//   pp_macro* undef = new pp_macro();
//   undef->name = name;
//   undef->defined = false;
//   if(!m_replaying)
//     m_blocks.top()->macros.append(undef);
// 
//   setMacro(undef); //Before, m_environment.remove(..) was called

 if(!m_replaying) {
    pp_macro* undef = new pp_macro;
    undef->name = name;
    undef->defined = false;
    m_blocks.top()->macros.append(undef);
  }

  ///@todo Think about how this plays together with environment-management
  ///We need undef-macros to be put into the definedMacros etc. lists
  m_environment.remove(name);
}

void Environment::setMacro(pp_macro* macro)
{
  if (!m_replaying && !m_blocks.isEmpty())
    m_blocks.top()->macros.append(macro);

/*  if( !macro->defined )
    clearMacro(macro->name);
  else*/
    m_environment.insert(macro->name, macro);
}

const Environment::EnvironmentMap& Environment::environment() const {
  return m_environment;
}

pp_macro* Environment::retrieveStoredMacro(const IndexedString& name) const
{
  EnvironmentMap::const_iterator it = m_environment.find(name);
  if (it != m_environment.end())
    return *it;

  return 0;
}



( run in 0.477 second using v1.01-cache-2.11-cpan-140bd7fdf52 )