@@ -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+
550583template <class Struct >
551584class CommonVisitor : public AST ::BaseVisitor<Struct> {
552585public:
@@ -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