Exemple #1
0
z3::check_result Z3StackSolverImpl::check(const Query &query) {
    errs() << "====> Query size: " << query.constraints.size() << '\n';

    ConditionNodeList *cur_constraints = new ConditionNodeList();

    for (ConditionNodeRef node = query.constraints.head(),
            root = query.constraints.root();
            node != root; node = node->parent()) {
        // TODO: Handle special case of fast-forward
        cur_constraints->push_front(node);
    }

    ConditionNodeList::iterator cur_it, last_it;
    cur_it = cur_constraints->begin();
    last_it = last_constraints_->begin();

    while (cur_it != cur_constraints->end() &&
            last_it != last_constraints_->end() &&
            *cur_it == *last_it) {
        cur_it++;
        last_it++;
    }

    if (last_it != last_constraints_->end()) {
        unsigned amount = 1 + last_constraints_->back()->depth()
                - (*last_it)->depth();
        errs() << "====> POP x" << amount << '\n';
        pop(amount);
    }

    if (cur_it != cur_constraints->end()) {
        errs() << "====> PUSH x"
                << (cur_constraints->back()->depth() - (*cur_it)->depth() + 1)
                << '\n';

        while (cur_it != cur_constraints->end()) {
            push();
            solver_.add(builder_->construct((*cur_it)->expr()));
            cur_it++;
        }
    }

    last_constraints_.reset(cur_constraints);

    push();

    // Note the negation, since we're checking for validity
    // (i.e., a counterexample)
    solver_.add(!builder_->construct(query.expr));

    return solver_.check();
}
 virtual bool Consume(RegExpInput* input_string,
                      bool anchor_at_start,
                      string* matched_string1,
                      string* matched_string2,
                      string* matched_string3) const {
   DCHECK(input_string);
   if (!utf8_regexp_.get()) {
     return false;
   }
   IcuRegExpInput* const input = static_cast<IcuRegExpInput*>(input_string);
   UErrorCode status = U_ZERO_ERROR;
   const scoped_ptr<RegexMatcher> matcher(
       utf8_regexp_->matcher(*input->Data(), status));
   bool match_succeeded = anchor_at_start
       ? matcher->lookingAt(input->position(), status)
       : matcher->find(input->position(), status);
   if (!match_succeeded || U_FAILURE(status)) {
     return false;
   }
   string* const matched_strings[] = {
     matched_string1, matched_string2, matched_string3
   };
   // If less matches than expected - fail.
   for (size_t i = 0; i < arraysize(matched_strings); ++i) {
     if (matched_strings[i]) {
       // Groups are counted from 1 rather than 0.
       const int group_index = i + 1;
       if (group_index > matcher->groupCount()) {
         return false;
       }
       *matched_strings[i] =
           UnicodeStringToUtf8String(matcher->group(group_index, status));
     }
   }
   input->set_position(matcher->end(status));
   return !U_FAILURE(status);
 }