Здравствуйте, so5team, Вы писали:
Вот вам ещё кусок кода.
db_ngine::statement db_engine::evaluate_statement(const db_context &ctx)
{
while (_node != nstore().end_nodes() &&
(_node->node()->type().stage() <= ctx.stage() || skip_run(*_node->node(), ctx))){
db_statement * const first_ok = eval_node(*_node, ctx) ;
if (first_ok){
const unsigned ndx = first_ok->_ndx ;
PCHECK(ndx < nstore().section_count) ;
PCHECK(first_ok < _first_ok || code().section_count > 1 || !*(nstore().begin_done() + ndx)) ;
const ASTB &ast = first_ok->parser_s() ;
if (ast.attributes() & ASTB::STAGE){
PCHECK(ast.converter().type().need_request()) ;
if (first_ok < _first_rstage)
_first_rstage = first_ok ;
}
if (!(ast.attributes() & ASTB::NEXT)){
*(nstore().begin_done() + ndx) = &ast ;
if(nstore().section_count>1)
for(db_statement *s=first_ok; s<nstore().end_statements(); ++s)
if(s && s->root()->is_evaluated() && s->root()->value())
if(s->_ndx!=ndx){
const ASTB **ptr=nstore().begin_done()+s->_ndx;
if(!*ptr || *ptr>&s->parser_s())
*ptr=&s->parser_s();
*ptr=&s->parser_s();
}
db_section *cursection = nstore().begin_sections() + ndx ;
db_statement *secbegin = nstore().begin_statements() + cursection[0].start ;
db_statement *secend = nstore().begin_statements() + cursection[1].start ;
PCHECK(db::xinrange(first_ok, secbegin, secend)) ;
for (db_statement *reduced = first_ok < _first_ok || first_ok == secbegin
? first_ok + 1
: secbegin ;
reduced != secend ; ++reduced)
if (!reduced->root()->is_done())
{
mark_done(*reduced->root()) ;
reduce_tree(*reduced->root()) ;
}
if (first_ok < _first_ok)
_first_ok = first_ok ;
}
}
do if (++_start_node == nstore().end_nodes())
{
*std::remove(nstore().begin_done(), nstore().end_done(), nullptr) = nullptr ;
break ;
}
while (_start_done->is_idle()) ;
}
......