Пример #1
0
SourceInfo::SourceInfo(BoxedModule* m, ScopingAnalysis* scoping, FutureFlags future_flags, AST* ast,
                       std::vector<AST_stmt*> body, BoxedString* fn)
    : parent_module(m),
      scoping(scoping),
      scope_info(NULL),
      future_flags(future_flags),
      ast(ast),
      cfg(NULL),
      body(std::move(body)) {
    assert(fn);

    // TODO: this is a very bad way of handling this:
    incref(fn);
    late_constants.push_back(fn);

    this->fn = fn;

    switch (ast->type) {
        case AST_TYPE::ClassDef:
        case AST_TYPE::Module:
        case AST_TYPE::Expression:
        case AST_TYPE::Suite:
            is_generator = false;
            break;
        case AST_TYPE::FunctionDef:
        case AST_TYPE::Lambda:
            is_generator = containsYield(ast);
            break;
        default:
            RELEASE_ASSERT(0, "Unknown type: %d", ast->type);
            break;
    }
}
Пример #2
0
SourceInfo::SourceInfo(BoxedModule* m, ScopingAnalysis* scoping, FutureFlags future_flags, AST* ast,
                       std::vector<AST_stmt*> body, std::string fn)
    : parent_module(m),
      scoping(scoping),
      future_flags(future_flags),
      ast(ast),
      cfg(NULL),
      fn(std::move(fn)),
      body(std::move(body)) {
    assert(this->fn.size());

    switch (ast->type) {
        case AST_TYPE::ClassDef:
        case AST_TYPE::Lambda:
        case AST_TYPE::Module:
        case AST_TYPE::Expression:
        case AST_TYPE::Suite:
            is_generator = false;
            break;
        case AST_TYPE::FunctionDef:
            is_generator = containsYield(ast);
            break;
        default:
            RELEASE_ASSERT(0, "Unknown type: %d", ast->type);
            break;
    }
}
Пример #3
0
bool containsYield(llvm::ArrayRef<AST_stmt*> body) {
    for (auto e : body)
        if (containsYield(e))
            return true;
    return false;
}