Skip to content

Commit 4d9706b

Browse files
committed
Refactor: Define and use get_calls_to_global_init_and_stmts()
1 parent d4f8ff8 commit 4d9706b

File tree

1 file changed

+35
-56
lines changed

1 file changed

+35
-56
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 35 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,39 @@ ASR::symbol_t* import_from_module(Allocator &al, ASR::Module_t *m, SymbolTable *
547547
return nullptr;
548548
}
549549

550+
// Here, we call the global_initializer & global_statements to
551+
// initialize and execute the global symbols
552+
void get_calls_to_global_init_and_stmts(Allocator &al, const Location &loc, SymbolTable* scope,
553+
ASR::Module_t* mod, std::vector<ASR::asr_t *> &tmp_vec) {
554+
555+
std::string mod_name = mod->m_name;
556+
std::string g_func_name = mod_name + "@global_initializer";
557+
ASR::symbol_t *g_func = mod->m_symtab->get_symbol("global_initializer");
558+
if (g_func && !scope->get_symbol(g_func_name)) {
559+
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
560+
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
561+
scope, s2c(al, g_func_name), g_func,
562+
s2c(al, mod_name), nullptr, 0, s2c(al, "global_initializer"),
563+
ASR::accessType::Public));
564+
scope->add_symbol(g_func_name, es);
565+
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, loc,
566+
es, g_func, nullptr, 0, nullptr, nullptr, false));
567+
}
568+
569+
g_func_name = mod_name + "@global_statements";
570+
g_func = mod->m_symtab->get_symbol("global_statements");
571+
if (g_func && !scope->get_symbol(g_func_name)) {
572+
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
573+
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
574+
scope, s2c(al, g_func_name), g_func,
575+
s2c(al, mod_name), nullptr, 0, s2c(al, "global_statements"),
576+
ASR::accessType::Public));
577+
scope->add_symbol(g_func_name, es);
578+
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, loc,
579+
es, g_func, nullptr, 0, nullptr, nullptr, false));
580+
}
581+
}
582+
550583
template <class Struct>
551584
class CommonVisitor : public AST::BaseVisitor<Struct> {
552585
public:
@@ -4867,80 +4900,26 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
48674900

48684901
void visit_Import(const AST::Import_t &x) {
48694902
// All the modules are imported in the SymbolTable visitor
4870-
// Here, we call the global_initializer & global_statements to
4871-
// initialize and execute the global symbols
48724903
for (size_t i = 0; i < x.n_names; i++) {
48734904
std::string mod_name = x.m_names[i].m_name;
48744905
ASR::symbol_t *mod_sym = current_scope->resolve_symbol(mod_name);
48754906
if (mod_sym) {
48764907
ASR::Module_t *mod = ASR::down_cast<ASR::Module_t>(mod_sym);
4877-
4878-
std::string g_func_name = mod_name + "@global_initializer";
4879-
ASR::symbol_t *g_func = mod->m_symtab->get_symbol("global_initializer");
4880-
if (g_func && !current_scope->get_symbol(g_func_name)) {
4881-
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
4882-
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
4883-
current_scope, s2c(al, g_func_name), g_func,
4884-
s2c(al, mod_name), nullptr, 0, s2c(al, "global_initializer"),
4885-
ASR::accessType::Public));
4886-
current_scope->add_symbol(g_func_name, es);
4887-
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, x.base.base.loc,
4888-
es, g_func, nullptr, 0, nullptr, nullptr, false));
4889-
}
4890-
4891-
g_func_name = mod_name + "@global_statements";
4892-
g_func = mod->m_symtab->get_symbol("global_statements");
4893-
if (g_func && !current_scope->get_symbol(g_func_name)) {
4894-
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
4895-
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
4896-
current_scope, s2c(al, g_func_name), g_func,
4897-
s2c(al, mod_name), nullptr, 0, s2c(al, "global_statements"),
4898-
ASR::accessType::Public));
4899-
current_scope->add_symbol(g_func_name, es);
4900-
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, x.base.base.loc,
4901-
es, g_func, nullptr, 0, nullptr, nullptr, false));
4902-
}
4908+
get_calls_to_global_init_and_stmts(al, x.base.base.loc, current_scope, mod, tmp_vec);
49034909
}
49044910
}
49054911
}
49064912

49074913
void visit_ImportFrom(const AST::ImportFrom_t &x) {
49084914
// Handled by SymbolTableVisitor already
4909-
// Here, we call the global_initializer & global_statements to
4910-
// initialize and execute the global symbols
49114915
std::string mod_name = x.m_module;
49124916
for (size_t i = 0; i < x.n_names; i++) {
49134917
imported_functions[x.m_names[i].m_name] = mod_name;
49144918
}
49154919
ASR::symbol_t *mod_sym = current_scope->resolve_symbol(mod_name);
49164920
if (mod_sym) {
49174921
ASR::Module_t *mod = ASR::down_cast<ASR::Module_t>(mod_sym);
4918-
4919-
std::string g_func_name = mod_name + "@global_initializer";
4920-
ASR::symbol_t *g_func = mod->m_symtab->get_symbol("global_initializer");
4921-
if (g_func && !current_scope->get_symbol(g_func_name)) {
4922-
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
4923-
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
4924-
current_scope, s2c(al, g_func_name), g_func,
4925-
s2c(al, mod_name), nullptr, 0, s2c(al, "global_initializer"),
4926-
ASR::accessType::Public));
4927-
current_scope->add_symbol(g_func_name, es);
4928-
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, x.base.base.loc,
4929-
es, g_func, nullptr, 0, nullptr, nullptr, false));
4930-
}
4931-
4932-
g_func_name = mod_name + "@global_statements";
4933-
g_func = mod->m_symtab->get_symbol("global_statements");
4934-
if (g_func && !current_scope->get_symbol(g_func_name)) {
4935-
ASR::symbol_t *es = ASR::down_cast<ASR::symbol_t>(
4936-
ASR::make_ExternalSymbol_t(al, mod->base.base.loc,
4937-
current_scope, s2c(al, g_func_name), g_func,
4938-
s2c(al, mod_name), nullptr, 0, s2c(al, "global_statements"),
4939-
ASR::accessType::Public));
4940-
current_scope->add_symbol(g_func_name, es);
4941-
tmp_vec.push_back(ASRUtils::make_SubroutineCall_t_util(al, x.base.base.loc,
4942-
es, g_func, nullptr, 0, nullptr, nullptr, false));
4943-
}
4922+
get_calls_to_global_init_and_stmts(al, x.base.base.loc, current_scope, mod, tmp_vec);
49444923
}
49454924
tmp = nullptr;
49464925
}

0 commit comments

Comments
 (0)