示例#1
0
Call *Parser::parse_call(Mode mode) {
    do {
        Call *call;
        int c = read_byte();
        switch (c) {
        case trace::EVENT_ENTER:
            parse_enter(mode);
            break;
        case trace::EVENT_LEAVE:
            call = parse_leave(mode);
            adjust_call_flags(call);
            return call;
        default:
            std::cerr << "error: unknown event " << c << "\n";
            exit(1);
        case -1:
            if (!calls.empty()) {
                call = calls.front();
                call->flags |= CALL_FLAG_INCOMPLETE;
                calls.pop_front();
                adjust_call_flags(call);
                return call;
            }
            return NULL;
        }
    } while(true);
}
Call *Parser::parse_call(Mode mode) {
    do {
        Call *call;
        int c = read_byte();
        switch (c) {
        case trace::EVENT_ENTER:
#if TRACE_VERBOSE
            std::cerr << "\tENTER\n";
#endif
            parse_enter(mode);
            break;
        case trace::EVENT_LEAVE:
#if TRACE_VERBOSE
            std::cerr << "\tLEAVE\n";
#endif
            call = parse_leave(mode);
            if (call) {
                adjust_call_flags(call);
                return call;
            }
            break;
        case trace::EVENT_RESET:
#if TRACE_VERBOSE
            std::cerr << "\tRESET\n";
#endif
            resetSignatures();
            next_call_no = 0;
            break;
        default:
            std::cerr << "error: unknown event " << c << "\n";
            exit(1);
        case -1:
            if (!calls.empty()) {
                call = calls.front();
                call->flags |= CALL_FLAG_INCOMPLETE;
                calls.pop_front();
                adjust_call_flags(call);
                return call;
            }
            return NULL;
        }
    } while(true);
}