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; } }
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; } }
bool containsYield(llvm::ArrayRef<AST_stmt*> body) { for (auto e : body) if (containsYield(e)) return true; return false; }