示例#1
0
void printMatchError(llvm::raw_ostream &os, const MatchResultPtr& result)
{
    switch (result->matchCode) {
    case MATCH_SUCCESS :
        os << "matched";
        break;
    case MATCH_CALLABLE_ERROR : {
        MatchCallableError *e = (MatchCallableError*)result.ptr();
        os << "callable pattern \"" << shortString(e->patternExpr->asString());
        os << "\" did not match \"";
        printStaticName(os, e->callable);
        os << "\"";
        break;
    }
    case MATCH_ARITY_ERROR : {
        MatchArityError *e = (MatchArityError*)result.ptr();
        os << "incorrect number of arguments: expected ";
        if (e->variadic)
            os << "at least ";
        os << e->expectedArgs << " arguments, got " << e->gotArgs << " arguments";
        break;
    }
    case MATCH_ARGUMENT_ERROR : {
        MatchArgumentError *e = (MatchArgumentError *)result.ptr();
        os << "pattern \"" << shortString(e->arg->type->asString());
        os << "\" did not match type \"";
        printStaticName(os, e->type.ptr());
        os << "\" of argument " << e->argIndex + 1;
        break;
    }
    case MATCH_MULTI_ARGUMENT_ERROR : {
        MatchMultiArgumentError *e = (MatchMultiArgumentError *)result.ptr();
        os << "variadic argument type pattern did not match types of arguments ";
        os << "starting at " << e->argIndex + 1;
        break;
    }
    case MATCH_PREDICATE_ERROR : {
        MatchPredicateError *e = (MatchPredicateError *)result.ptr();
        os << "predicate \"" << shortString(e->predicateExpr->asString()) << "\" failed";
        break;
    }
    case MATCH_BINDING_ERROR : {
        MatchBindingError *e = (MatchBindingError *)result.ptr();
        os << "pattern \"" << shortString(e->arg->type->asString());
        os << "\" did not match type \"";
        printStaticName(os, e->type.ptr());
        os << "\" of binding " << e->argIndex + 1;
        break;
    }
    case MATCH_MULTI_BINDING_ERROR : {
        MatchMultiBindingError *e = (MatchMultiBindingError *)result.ptr();
        os << "variadic binding type pattern did not match types of values ";
        os << "starting at " << e->argIndex + 1;
        break;
    }
    default :
        assert(false);
        break;
    }
}
示例#2
0
static SourcePtr evalToSource(Location const &location, ExprListPtr args, EnvPtr env)
{
    llvm::SmallString<128> sourceTextBuf;
    llvm::raw_svector_ostream sourceTextOut(sourceTextBuf);
    MultiStaticPtr values = evaluateMultiStatic(args, env);
    for (size_t i = 0; i < values->size(); ++i) {
        printStaticName(sourceTextOut, values->values[i]);
    }

    llvm::SmallString<128> sourceNameBuf;
    llvm::raw_svector_ostream sourceNameOut(sourceNameBuf);
    sourceNameOut << "<eval ";
    printFileLineCol(sourceNameOut, location);
    sourceNameOut << ">";

    sourceTextOut.flush();
    return new Source(sourceNameOut.str(),
        llvm::MemoryBuffer::getMemBufferCopy(sourceTextBuf));
}
示例#3
0
static bool shouldLogCallable(ObjectPtr callable)
{
    if (logMatchSymbols.empty())
        return false;

    ModulePtr m = staticModule(callable);
    if (!m)
        return false;

    string name;
    llvm::raw_string_ostream sout(name);
    printStaticName(sout, callable);
    sout.flush();

    pair<string,string> specificKey = make_pair(m->moduleName, name);
    pair<string,string> moduleGlobKey = make_pair(m->moduleName, string("*"));
    pair<string,string> anyModuleKey = make_pair(string("*"), name);
    return logMatchSymbols.find(specificKey) != logMatchSymbols.end()
        || logMatchSymbols.find(moduleGlobKey) != logMatchSymbols.end()
        || logMatchSymbols.find(anyModuleKey) != logMatchSymbols.end();
}