Skip to content

Commit eabd39a

Browse files
committed
Store initializer exprs in ASR
1 parent bf2667b commit eabd39a

File tree

1 file changed

+51
-23
lines changed

1 file changed

+51
-23
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,13 +1315,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
13151315
args.p[i].m_value = arg_new_i;
13161316
}
13171317
for (size_t i = args.size(); i < StructType->n_members; i++) {
1318-
std::string member_name = StructType->m_members[i];
1319-
ASR::Variable_t* member_var = ASR::down_cast<ASR::Variable_t>(
1320-
StructType->m_symtab->resolve_symbol(member_name));
1321-
ASR::call_arg_t arg;
1322-
arg.loc = loc;
1323-
arg.m_value = member_var->m_value;
1324-
args.push_back(al, arg);
1318+
args.push_back(al, StructType->m_initializers[i]);
13251319
}
13261320
ASR::ttype_t* der_type = ASRUtils::TYPE(ASR::make_Struct_t(al, loc, stemp));
13271321
return ASR::make_StructTypeConstructor_t(al, loc, stemp, args.p, args.size(), der_type, nullptr);
@@ -2767,8 +2761,10 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
27672761
}
27682762

27692763
void visit_AnnAssignUtil(const AST::AnnAssign_t& x, std::string& var_name,
2764+
ASR::expr_t* &init_expr,
27702765
bool wrap_derived_type_in_pointer=false,
2771-
ASR::expr_t* init_expr=nullptr, ASR::abiType abi=ASR::abiType::Source) {
2766+
ASR::abiType abi=ASR::abiType::Source,
2767+
bool inside_struct=false) {
27722768
bool is_allocatable = false;
27732769
ASR::ttype_t *type = ast_expr_to_asr_type(x.base.base.loc, *x.m_annotation, is_allocatable);
27742770
ASR::ttype_t* ann_assign_target_type_copy = ann_assign_target_type;
@@ -2838,8 +2834,13 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28382834
}
28392835

28402836
if( !is_c_p_pointer_call ) {
2841-
create_add_variable_to_scope(var_name, init_expr, type,
2842-
x.base.base.loc, abi, storage_type);
2837+
if (inside_struct && !ASR::is_a<ASR::Const_t>(*type)) {
2838+
create_add_variable_to_scope(var_name, nullptr, type,
2839+
x.base.base.loc, abi, storage_type);
2840+
} else {
2841+
create_add_variable_to_scope(var_name, init_expr, type,
2842+
x.base.base.loc, abi, storage_type);
2843+
}
28432844
}
28442845

28452846
if (is_allocatable && x.m_value && AST::is_a<AST::Call_t>(*x.m_value)) {
@@ -2858,6 +2859,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28582859

28592860
void visit_ClassMembers(const AST::ClassDef_t& x,
28602861
Vec<char*>& member_names, SetChar& struct_dependencies,
2862+
Vec<ASR::call_arg_t> &member_init,
28612863
bool is_enum_scope=false, ASR::abiType abi=ASR::abiType::Source) {
28622864
int64_t prev_value = 1;
28632865
for( size_t i = 0; i < x.n_body; i++ ) {
@@ -2891,8 +2893,12 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28912893
ASR::ttype_t* i64_type = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, 8));
28922894
init_expr = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, x.base.base.loc, -1, i64_type));
28932895
}
2894-
visit_AnnAssignUtil(*ann_assign, var_name, false, init_expr, abi);
2896+
visit_AnnAssignUtil(*ann_assign, var_name, init_expr, false, abi, true);
28952897
ASR::symbol_t* var_sym = current_scope->resolve_symbol(var_name);
2898+
ASR::call_arg_t c_arg;
2899+
c_arg.loc = var_sym->base.loc;
2900+
c_arg.m_value = init_expr;
2901+
member_init.push_back(al, c_arg);
28962902
if( is_enum_scope ) {
28972903
if( AST::is_a<AST::Call_t>(*ann_assign->m_value) ) {
28982904
AST::Call_t* auto_call_cand = AST::down_cast<AST::Call_t>(ann_assign->m_value);
@@ -2958,20 +2964,22 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
29582964

29592965
void visit_ClassDef(const AST::ClassDef_t& x) {
29602966
std::string x_m_name = x.m_name;
2961-
if( current_scope->resolve_symbol(x_m_name) ) {
2962-
return ;
2963-
}
29642967
if( is_enum(x.m_bases, x.n_bases) ) {
2968+
if( current_scope->resolve_symbol(x_m_name) ) {
2969+
return ;
2970+
}
29652971
ASR::abiType enum_abi = get_abi_from_decorators(x.m_decorator_list, x.n_decorator_list);
29662972
SymbolTable *parent_scope = current_scope;
29672973
current_scope = al.make_new<SymbolTable>(parent_scope);
29682974
Vec<char*> member_names;
2975+
Vec<ASR::call_arg_t> member_init;
29692976
member_names.reserve(al, x.n_body);
2977+
member_init.reserve(al, 1);
29702978
Vec<ASR::stmt_t*>* current_body_copy = current_body;
29712979
current_body = nullptr;
29722980
SetChar struct_dependencies;
29732981
struct_dependencies.reserve(al, 1);
2974-
visit_ClassMembers(x, member_names, struct_dependencies, true, enum_abi);
2982+
visit_ClassMembers(x, member_names, struct_dependencies, member_init, true, enum_abi);
29752983
current_body = current_body_copy;
29762984
ASR::ttype_t* common_type = nullptr;
29772985
for( auto sym: current_scope->get_scope() ) {
@@ -3050,18 +3058,28 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30503058
SymbolTable *parent_scope = current_scope;
30513059
current_scope = al.make_new<SymbolTable>(parent_scope);
30523060
Vec<char*> member_names;
3061+
Vec<ASR::call_arg_t> member_init;
30533062
member_names.reserve(al, x.n_body);
3063+
member_init.reserve(al, x.n_body);
30543064
SetChar struct_dependencies;
30553065
struct_dependencies.reserve(al, 1);
3056-
visit_ClassMembers(x, member_names, struct_dependencies);
3066+
visit_ClassMembers(x, member_names, struct_dependencies, member_init);
3067+
LCOMPILERS_ASSERT(member_init.size() == member_names.size());
30573068
ASR::symbol_t* union_type = ASR::down_cast<ASR::symbol_t>(ASR::make_UnionType_t(al,
30583069
x.base.base.loc, current_scope, x.m_name,
30593070
struct_dependencies.p, struct_dependencies.size(),
30603071
member_names.p, member_names.size(),
30613072
ASR::abiType::Source, ASR::accessType::Public,
3062-
nullptr));
3073+
member_init.p, member_init.size(), nullptr));
30633074
current_scope = parent_scope;
3064-
current_scope->add_symbol(std::string(x.m_name), union_type);
3075+
if (current_scope->resolve_symbol(x_m_name)) {
3076+
ASR::symbol_t* sym = current_scope->resolve_symbol(x_m_name);
3077+
ASR::UnionType_t *ut = ASR::down_cast<ASR::UnionType_t>(sym);
3078+
ut->m_initializers = member_init.p;
3079+
ut->n_initializers = member_init.size();
3080+
} else {
3081+
current_scope->add_symbol(x_m_name, union_type);
3082+
}
30653083
return ;
30663084
}
30673085
ASR::expr_t* algined_expr = nullptr;
@@ -3080,23 +3098,33 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30803098
SymbolTable *parent_scope = current_scope;
30813099
current_scope = al.make_new<SymbolTable>(parent_scope);
30823100
Vec<char*> member_names;
3101+
Vec<ASR::call_arg_t> member_init;
30833102
member_names.reserve(al, x.n_body);
3103+
member_init.reserve(al, x.n_body);
30843104
SetChar struct_dependencies;
30853105
struct_dependencies.reserve(al, 1);
30863106
ASR::abiType class_abi = ASR::abiType::Source;
30873107
if( is_bindc_class(x.m_decorator_list, x.n_decorator_list) ) {
30883108
class_abi = ASR::abiType::BindC;
30893109
}
3090-
visit_ClassMembers(x, member_names, struct_dependencies, false, class_abi);
3110+
visit_ClassMembers(x, member_names, struct_dependencies, member_init, false, class_abi);
3111+
LCOMPILERS_ASSERT(member_init.size() == member_names.size());
30913112
ASR::symbol_t* class_type = ASR::down_cast<ASR::symbol_t>(ASR::make_StructType_t(al,
30923113
x.base.base.loc, current_scope, x.m_name,
30933114
struct_dependencies.p, struct_dependencies.size(),
30943115
member_names.p, member_names.size(),
30953116
class_abi, ASR::accessType::Public,
3096-
is_packed, false, algined_expr,
3117+
is_packed, false, member_init.p, member_init.size(), algined_expr,
30973118
nullptr));
30983119
current_scope = parent_scope;
3099-
current_scope->add_symbol(std::string(x.m_name), class_type);
3120+
if (current_scope->resolve_symbol(x_m_name)) {
3121+
ASR::symbol_t* sym = current_scope->resolve_symbol(x_m_name);
3122+
ASR::StructType_t *st = ASR::down_cast<ASR::StructType_t>(sym);
3123+
st->m_initializers = member_init.p;
3124+
st->n_initializers = member_init.size();
3125+
} else {
3126+
current_scope->add_symbol(x_m_name, class_type);
3127+
}
31003128
}
31013129

31023130
void add_name(const Location &loc) {
@@ -4845,8 +4873,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
48454873
}));
48464874
}
48474875
}
4848-
4849-
visit_AnnAssignUtil(x, var_name);
4876+
ASR::expr_t *init_expr = nullptr;
4877+
visit_AnnAssignUtil(x, var_name, init_expr);
48504878
assign_ast_target = assign_ast_target_copy;
48514879
}
48524880

0 commit comments

Comments
 (0)