Skip to content

Commit 286f0d5

Browse files
committed
Store initializer exprs in ASR
1 parent f33c68d commit 286f0d5

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,13 +1323,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
13231323
args.p[i].m_value = arg_new_i;
13241324
}
13251325
for (size_t i = args.size(); i < StructType->n_members; i++) {
1326-
std::string member_name = StructType->m_members[i];
1327-
ASR::Variable_t* member_var = ASR::down_cast<ASR::Variable_t>(
1328-
StructType->m_symtab->resolve_symbol(member_name));
1329-
ASR::call_arg_t arg;
1330-
arg.loc = loc;
1331-
arg.m_value = member_var->m_value;
1332-
args.push_back(al, arg);
1326+
args.push_back(al, StructType->m_initializers[i]);
13331327
}
13341328
ASR::ttype_t* der_type = ASRUtils::TYPE(ASR::make_Struct_t(al, loc, stemp));
13351329
return ASR::make_StructTypeConstructor_t(al, loc, stemp, args.p, args.size(), der_type, nullptr);
@@ -2775,8 +2769,10 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
27752769
}
27762770

27772771
void visit_AnnAssignUtil(const AST::AnnAssign_t& x, std::string& var_name,
2772+
ASR::expr_t* &init_expr,
27782773
bool wrap_derived_type_in_pointer=false,
2779-
ASR::expr_t* init_expr=nullptr, ASR::abiType abi=ASR::abiType::Source) {
2774+
ASR::abiType abi=ASR::abiType::Source,
2775+
bool inside_struct=false) {
27802776
bool is_allocatable = false;
27812777
ASR::ttype_t *type = ast_expr_to_asr_type(x.base.base.loc, *x.m_annotation, is_allocatable);
27822778
ASR::ttype_t* ann_assign_target_type_copy = ann_assign_target_type;
@@ -2846,8 +2842,13 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28462842
}
28472843

28482844
if( !is_c_p_pointer_call ) {
2849-
create_add_variable_to_scope(var_name, init_expr, type,
2850-
x.base.base.loc, abi, storage_type);
2845+
if (inside_struct && !ASR::is_a<ASR::Const_t>(*type)) {
2846+
create_add_variable_to_scope(var_name, nullptr, type,
2847+
x.base.base.loc, abi, storage_type);
2848+
} else {
2849+
create_add_variable_to_scope(var_name, init_expr, type,
2850+
x.base.base.loc, abi, storage_type);
2851+
}
28512852
}
28522853

28532854
if (is_allocatable && x.m_value && AST::is_a<AST::Call_t>(*x.m_value)) {
@@ -2866,6 +2867,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28662867

28672868
void visit_ClassMembers(const AST::ClassDef_t& x,
28682869
Vec<char*>& member_names, SetChar& struct_dependencies,
2870+
Vec<ASR::call_arg_t> &member_init,
28692871
bool is_enum_scope=false, ASR::abiType abi=ASR::abiType::Source) {
28702872
int64_t prev_value = 1;
28712873
for( size_t i = 0; i < x.n_body; i++ ) {
@@ -2899,8 +2901,12 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28992901
ASR::ttype_t* i64_type = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, 8));
29002902
init_expr = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, x.base.base.loc, -1, i64_type));
29012903
}
2902-
visit_AnnAssignUtil(*ann_assign, var_name, false, init_expr, abi);
2904+
visit_AnnAssignUtil(*ann_assign, var_name, init_expr, false, abi, true);
29032905
ASR::symbol_t* var_sym = current_scope->resolve_symbol(var_name);
2906+
ASR::call_arg_t c_arg;
2907+
c_arg.loc = var_sym->base.loc;
2908+
c_arg.m_value = init_expr;
2909+
member_init.push_back(al, c_arg);
29042910
if( is_enum_scope ) {
29052911
if( AST::is_a<AST::Call_t>(*ann_assign->m_value) ) {
29062912
AST::Call_t* auto_call_cand = AST::down_cast<AST::Call_t>(ann_assign->m_value);
@@ -2966,20 +2972,19 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
29662972

29672973
void visit_ClassDef(const AST::ClassDef_t& x) {
29682974
std::string x_m_name = x.m_name;
2969-
if( current_scope->resolve_symbol(x_m_name) ) {
2970-
return ;
2971-
}
29722975
if( is_enum(x.m_bases, x.n_bases) ) {
29732976
ASR::abiType enum_abi = get_abi_from_decorators(x.m_decorator_list, x.n_decorator_list);
29742977
SymbolTable *parent_scope = current_scope;
29752978
current_scope = al.make_new<SymbolTable>(parent_scope);
29762979
Vec<char*> member_names;
2980+
Vec<ASR::call_arg_t> member_init;
29772981
member_names.reserve(al, x.n_body);
2982+
member_init.reserve(al, 1);
29782983
Vec<ASR::stmt_t*>* current_body_copy = current_body;
29792984
current_body = nullptr;
29802985
SetChar struct_dependencies;
29812986
struct_dependencies.reserve(al, 1);
2982-
visit_ClassMembers(x, member_names, struct_dependencies, true, enum_abi);
2987+
visit_ClassMembers(x, member_names, struct_dependencies, member_init, true, enum_abi);
29832988
current_body = current_body_copy;
29842989
ASR::ttype_t* common_type = nullptr;
29852990
for( auto sym: current_scope->get_scope() ) {
@@ -3052,24 +3057,27 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30523057
enum_abi, ASR::accessType::Public, enum_value_type,
30533058
common_type, nullptr));
30543059
current_scope = parent_scope;
3055-
current_scope->add_symbol(std::string(x.m_name), enum_type);
3060+
current_scope->add_or_overwrite_symbol(std::string(x.m_name), enum_type);
30563061
return ;
30573062
} else if( is_union(x.m_bases, x.n_bases) ) {
30583063
SymbolTable *parent_scope = current_scope;
30593064
current_scope = al.make_new<SymbolTable>(parent_scope);
30603065
Vec<char*> member_names;
3066+
Vec<ASR::call_arg_t> member_init;
30613067
member_names.reserve(al, x.n_body);
3068+
member_init.reserve(al, x.n_body);
30623069
SetChar struct_dependencies;
30633070
struct_dependencies.reserve(al, 1);
3064-
visit_ClassMembers(x, member_names, struct_dependencies);
3071+
visit_ClassMembers(x, member_names, struct_dependencies, member_init);
3072+
LCOMPILERS_ASSERT(member_init.size() == member_names.size());
30653073
ASR::symbol_t* union_type = ASR::down_cast<ASR::symbol_t>(ASR::make_UnionType_t(al,
30663074
x.base.base.loc, current_scope, x.m_name,
30673075
struct_dependencies.p, struct_dependencies.size(),
30683076
member_names.p, member_names.size(),
30693077
ASR::abiType::Source, ASR::accessType::Public,
3070-
nullptr));
3078+
member_init.p, member_init.size(), nullptr));
30713079
current_scope = parent_scope;
3072-
current_scope->add_symbol(std::string(x.m_name), union_type);
3080+
current_scope->add_or_overwrite_symbol(std::string(x.m_name), union_type);
30733081
return ;
30743082
}
30753083
ASR::expr_t* algined_expr = nullptr;
@@ -3088,23 +3096,26 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30883096
SymbolTable *parent_scope = current_scope;
30893097
current_scope = al.make_new<SymbolTable>(parent_scope);
30903098
Vec<char*> member_names;
3099+
Vec<ASR::call_arg_t> member_init;
30913100
member_names.reserve(al, x.n_body);
3101+
member_init.reserve(al, x.n_body);
30923102
SetChar struct_dependencies;
30933103
struct_dependencies.reserve(al, 1);
30943104
ASR::abiType class_abi = ASR::abiType::Source;
30953105
if( is_bindc_class(x.m_decorator_list, x.n_decorator_list) ) {
30963106
class_abi = ASR::abiType::BindC;
30973107
}
3098-
visit_ClassMembers(x, member_names, struct_dependencies, false, class_abi);
3108+
visit_ClassMembers(x, member_names, struct_dependencies, member_init, false, class_abi);
3109+
LCOMPILERS_ASSERT(member_init.size() == member_names.size());
30993110
ASR::symbol_t* class_type = ASR::down_cast<ASR::symbol_t>(ASR::make_StructType_t(al,
31003111
x.base.base.loc, current_scope, x.m_name,
31013112
struct_dependencies.p, struct_dependencies.size(),
31023113
member_names.p, member_names.size(),
31033114
class_abi, ASR::accessType::Public,
3104-
is_packed, false, algined_expr,
3115+
is_packed, false, member_init.p, member_init.size(), algined_expr,
31053116
nullptr));
31063117
current_scope = parent_scope;
3107-
current_scope->add_symbol(std::string(x.m_name), class_type);
3118+
current_scope->add_or_overwrite_symbol(std::string(x.m_name), class_type);
31083119
}
31093120

31103121
void add_name(const Location &loc) {
@@ -4851,8 +4862,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
48514862
}));
48524863
}
48534864
}
4854-
4855-
visit_AnnAssignUtil(x, var_name);
4865+
ASR::expr_t *init_expr = nullptr;
4866+
visit_AnnAssignUtil(x, var_name, init_expr);
48564867
assign_ast_target = assign_ast_target_copy;
48574868
}
48584869

0 commit comments

Comments
 (0)