@@ -695,6 +695,56 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
695
695
}
696
696
}
697
697
698
+ void visit_SubroutineCall (const ASR::SubroutineCall_t &x) {
699
+ SymbolTable* module_scope = current_scope->parent ;
700
+ Vec<ASR::call_arg_t > call_args;
701
+ call_args.reserve (al, 1 );
702
+
703
+ for (size_t i=0 ; i<x.n_args ; i++) {
704
+ ASR::expr_t * val = x.m_args [i].m_value ;
705
+ if (ASR::is_a<ASR::IntrinsicScalarFunction_t>(*val) && ASR::is_a<ASR::SymbolicExpression_t>(*ASRUtils::expr_type (val))) {
706
+ ASR::IntrinsicScalarFunction_t* intrinsic_func = ASR::down_cast<ASR::IntrinsicScalarFunction_t>(val);
707
+ ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_SymbolicExpression_t (al, x.base .base .loc ));
708
+ std::string symengine_var = symengine_stack.push ();
709
+ ASR::symbol_t *arg = ASR::down_cast<ASR::symbol_t >(ASR::make_Variable_t (
710
+ al, x.base .base .loc , current_scope, s2c (al, symengine_var), nullptr , 0 , ASR::intentType::Local,
711
+ nullptr , nullptr , ASR::storage_typeType::Default, type, nullptr ,
712
+ ASR::abiType::BindC, ASR::Public, ASR::presenceType::Required, false ));
713
+ current_scope->add_symbol (s2c (al, symengine_var), arg);
714
+ for (auto &item : current_scope->get_scope ()) {
715
+ if (ASR::is_a<ASR::Variable_t>(*item.second )) {
716
+ ASR::Variable_t *s = ASR::down_cast<ASR::Variable_t>(item.second );
717
+ this ->visit_Variable (*s);
718
+ }
719
+ }
720
+
721
+ ASR::expr_t * target = ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , arg));
722
+ process_intrinsic_function (al, x.base .base .loc , intrinsic_func, module_scope, target);
723
+
724
+ ASR::call_arg_t call_arg;
725
+ call_arg.loc = x.base .base .loc ;
726
+ call_arg.m_value = target;
727
+ call_args.push_back (al, call_arg);
728
+ } else if (ASR::is_a<ASR::Cast_t>(*val)) {
729
+ ASR::Cast_t* cast_t = ASR::down_cast<ASR::Cast_t>(val);
730
+ if (cast_t ->m_kind != ASR::cast_kindType::IntegerToSymbolicExpression) return ;
731
+ this ->visit_Cast (*cast_t );
732
+ ASR::symbol_t *var_sym = current_scope->get_symbol (symengine_stack.pop ());
733
+ ASR::expr_t * target = ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , var_sym));
734
+
735
+ ASR::call_arg_t call_arg;
736
+ call_arg.loc = x.base .base .loc ;
737
+ call_arg.m_value = target;
738
+ call_args.push_back (al, call_arg);
739
+ } else {
740
+ call_args.push_back (al, x.m_args [i]);
741
+ }
742
+ }
743
+ ASR::stmt_t * stmt = ASRUtils::STMT (ASR::make_SubroutineCall_t (al, x.base .base .loc , x.m_name ,
744
+ x.m_name , call_args.p , call_args.n , nullptr ));
745
+ pass_result.push_back (al, stmt);
746
+ }
747
+
698
748
void visit_Print (const ASR::Print_t &x) {
699
749
std::vector<ASR::expr_t *> print_tmp;
700
750
SymbolTable* module_scope = current_scope->parent ;
@@ -739,6 +789,25 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
739
789
ASR::expr_t * target = ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , arg));
740
790
process_intrinsic_function (al, x.base .base .loc , intrinsic_func, module_scope, target);
741
791
792
+ // Now create the FunctionCall node for basic_str
793
+ ASR::symbol_t * basic_str_sym = declare_basic_str_function (al, x.base .base .loc , module_scope);
794
+ Vec<ASR::call_arg_t > call_args;
795
+ call_args.reserve (al, 1 );
796
+ ASR::call_arg_t call_arg;
797
+ call_arg.loc = x.base .base .loc ;
798
+ call_arg.m_value = target;
799
+ call_args.push_back (al, call_arg);
800
+ ASR::expr_t * function_call = ASRUtils::EXPR (ASRUtils::make_FunctionCall_t_util (al, x.base .base .loc ,
801
+ basic_str_sym, basic_str_sym, call_args.p , call_args.n ,
802
+ ASRUtils::TYPE (ASR::make_Character_t (al, x.base .base .loc , 1 , -2 , nullptr )), nullptr , nullptr ));
803
+ print_tmp.push_back (function_call);
804
+ } else if (ASR::is_a<ASR::Cast_t>(*val)) {
805
+ ASR::Cast_t* cast_t = ASR::down_cast<ASR::Cast_t>(val);
806
+ if (cast_t ->m_kind != ASR::cast_kindType::IntegerToSymbolicExpression) return ;
807
+ this ->visit_Cast (*cast_t );
808
+ ASR::symbol_t *var_sym = current_scope->get_symbol (symengine_stack.pop ());
809
+ ASR::expr_t * target = ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , var_sym));
810
+
742
811
// Now create the FunctionCall node for basic_str
743
812
ASR::symbol_t * basic_str_sym = declare_basic_str_function (al, x.base .base .loc , module_scope);
744
813
Vec<ASR::call_arg_t > call_args;
0 commit comments