Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5a27552

Browse files
committed
done
1 parent 0f2cd9a commit 5a27552

File tree

7 files changed

+186
-40
lines changed

7 files changed

+186
-40
lines changed

integration_tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ RUN(NAME structs_13 LABELS llvm c
354354
RUN(NAME structs_14 LABELS cpython llvm c)
355355
RUN(NAME structs_15 LABELS cpython llvm c)
356356
RUN(NAME structs_16 LABELS cpython llvm c)
357+
RUN(NAME structs_17 LABELS cpython llvm c)
357358
RUN(NAME sizeof_01 LABELS llvm c
358359
EXTRAFILES sizeof_01b.c)
359360
RUN(NAME enum_01 LABELS cpython llvm c)

integration_tests/structs_17.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from ltypes import i32, f32, f64, dataclass
2+
3+
@dataclass
4+
class B:
5+
z: i32
6+
@dataclass
7+
class C:
8+
cz: f32
9+
bc: C
10+
11+
@dataclass
12+
class A:
13+
y: f32
14+
x: i32
15+
b: B
16+
17+
18+
def f(a: A):
19+
print(a.x)
20+
print(a.y)
21+
print(a.b.z)
22+
23+
def g():
24+
x: A = A(f32(3.25), 3, B(71, B.C(f32(4.0))))
25+
f(x)
26+
assert x.x == 3
27+
assert f64(x.y) == 3.25
28+
assert x.b.z == 71
29+
assert f64(x.b.bc.cz) == 4.0
30+
31+
g()

src/libasr/asr_utils.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ ASR::TranslationUnit_t* find_and_load_module(Allocator &al, const std::string &m
306306
ASR::asr_t* getStructInstanceMember_t(Allocator& al, const Location& loc,
307307
ASR::asr_t* v_var, ASR::symbol_t* member,
308308
SymbolTable* current_scope) {
309-
ASR::Variable_t* member_variable = ((ASR::Variable_t*)(&(member->base)));
309+
ASR::Variable_t* member_variable = ASR::down_cast<ASR::Variable_t>(member);
310310
ASR::ttype_t* member_type = member_variable->m_type;
311311
switch( member_type->type ) {
312312
case ASR::ttypeType::Struct: {
@@ -317,23 +317,27 @@ ASR::asr_t* getStructInstanceMember_t(Allocator& al, const Location& loc,
317317
ASR::symbol_t* der_ext;
318318
char* module_name = (char*)"~nullptr";
319319
ASR::symbol_t* m_external = der->m_derived_type;
320-
if( m_external->type == ASR::symbolType::ExternalSymbol ) {
321-
ASR::ExternalSymbol_t* m_ext = (ASR::ExternalSymbol_t*)(&(m_external->base));
320+
if( ASR::is_a<ASR::ExternalSymbol_t>(*m_external) ) {
321+
ASR::ExternalSymbol_t* m_ext = ASR::down_cast<ASR::ExternalSymbol_t>(m_external);
322322
m_external = m_ext->m_external;
323323
module_name = m_ext->m_module_name;
324+
} else if( ASR::is_a<ASR::StructType_t>(*m_external) ) {
325+
ASR::symbol_t* asr_owner = ASRUtils::get_asr_owner(m_external);
326+
if( ASR::is_a<ASR::StructType_t>(*asr_owner) ) {
327+
module_name = ASRUtils::symbol_name(asr_owner);
328+
}
324329
}
325-
Str mangled_name;
326-
mangled_name.from_str(al, "1_" +
330+
std::string mangled_name = current_scope->get_unique_name(
327331
std::string(module_name) + "_" +
328332
std::string(der_type_name));
329-
char* mangled_name_char = mangled_name.c_str(al);
330-
if( current_scope->get_symbol(mangled_name.str()) == nullptr ) {
333+
char* mangled_name_char = s2c(al, mangled_name);
334+
if( current_scope->get_symbol(mangled_name) == nullptr ) {
331335
bool make_new_ext_sym = true;
332336
ASR::symbol_t* der_tmp = nullptr;
333337
if( current_scope->get_symbol(std::string(der_type_name)) != nullptr ) {
334338
der_tmp = current_scope->get_symbol(std::string(der_type_name));
335-
if( der_tmp->type == ASR::symbolType::ExternalSymbol ) {
336-
ASR::ExternalSymbol_t* der_ext_tmp = (ASR::ExternalSymbol_t*)(&(der_tmp->base));
339+
if( ASR::is_a<ASR::ExternalSymbol_t>(*der_tmp) ) {
340+
ASR::ExternalSymbol_t* der_ext_tmp = ASR::down_cast<ASR::ExternalSymbol_t>(der_tmp);
337341
if( der_ext_tmp->m_external == m_external ) {
338342
make_new_ext_sym = false;
339343
}
@@ -342,15 +346,17 @@ ASR::asr_t* getStructInstanceMember_t(Allocator& al, const Location& loc,
342346
}
343347
}
344348
if( make_new_ext_sym ) {
345-
der_ext = (ASR::symbol_t*)ASR::make_ExternalSymbol_t(al, loc, current_scope, mangled_name_char, m_external,
346-
module_name, nullptr, 0, s2c(al, der_type_name), ASR::accessType::Public);
347-
current_scope->add_symbol(mangled_name.str(), der_ext);
349+
der_ext = ASR::down_cast<ASR::symbol_t>(ASR::make_ExternalSymbol_t(
350+
al, loc, current_scope, mangled_name_char, m_external,
351+
module_name, nullptr, 0, s2c(al, der_type_name),
352+
ASR::accessType::Public));
353+
current_scope->add_symbol(mangled_name, der_ext);
348354
} else {
349355
LFORTRAN_ASSERT(der_tmp != nullptr);
350356
der_ext = der_tmp;
351357
}
352358
} else {
353-
der_ext = current_scope->get_symbol(mangled_name.str());
359+
der_ext = current_scope->get_symbol(mangled_name);
354360
}
355361
ASR::asr_t* der_new = ASR::make_Struct_t(al, loc, der_ext, der->m_dims, der->n_dims);
356362
member_type = ASRUtils::TYPE(der_new);

src/libasr/asr_utils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,9 @@ static inline ASR::Module_t *get_sym_module(const ASR::symbol_t *sym) {
454454
// Returns the ASR owner of the symbol
455455
static inline ASR::symbol_t *get_asr_owner(const ASR::symbol_t *sym) {
456456
const SymbolTable *s = symbol_parent_symtab(sym);
457+
if( !ASR::is_a<ASR::symbol_t>(*s->asr_owner) ) {
458+
return nullptr;
459+
}
457460
return ASR::down_cast<ASR::symbol_t>(s->asr_owner);
458461
}
459462

src/libasr/codegen/asr_to_c.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
139139
void allocate_array_members_of_struct(ASR::StructType_t* der_type_t, std::string& sub,
140140
std::string indent, std::string name) {
141141
for( auto itr: der_type_t->m_symtab->get_scope() ) {
142-
if( ASR::is_a<ASR::UnionType_t>(*itr.second) ) {
142+
if( ASR::is_a<ASR::UnionType_t>(*itr.second) ||
143+
ASR::is_a<ASR::StructType_t>(*itr.second) ) {
143144
continue ;
144145
}
145146
ASR::ttype_t* mem_type = ASRUtils::symbol_type(itr.second);
@@ -715,9 +716,14 @@ R"(
715716
std::string body = "";
716717
int indendation_level_copy = indentation_level;
717718
for( auto itr: x.m_symtab->get_scope() ) {
718-
if(ASR::is_a<ASR::UnionType_t>(*itr.second)) {
719+
if( ASR::is_a<ASR::UnionType_t>(*itr.second) ) {
719720
visit_AggregateTypeUtil(*ASR::down_cast<ASR::UnionType_t>(itr.second),
720721
"union", src_dest);
722+
} else if( ASR::is_a<ASR::StructType_t>(*itr.second) ) {
723+
std::string struct_c_type_name = get_StructCTypeName(
724+
*ASR::down_cast<ASR::StructType_t>(itr.second));
725+
visit_AggregateTypeUtil(*ASR::down_cast<ASR::StructType_t>(itr.second),
726+
struct_c_type_name, src_dest);
721727
}
722728
}
723729
indentation_level = indendation_level_copy;
@@ -741,8 +747,7 @@ R"(
741747
src_dest += open_struct + body + end_struct;
742748
}
743749

744-
void visit_StructType(const ASR::StructType_t& x) {
745-
src = "";
750+
std::string get_StructCTypeName(const ASR::StructType_t& x) {
746751
std::string c_type_name = "struct";
747752
if( x.m_is_packed ) {
748753
std::string attr_args = "(packed";
@@ -758,6 +763,12 @@ R"(
758763
attr_args += ")";
759764
c_type_name += " __attribute__(" + attr_args + ")";
760765
}
766+
return c_type_name;
767+
}
768+
769+
void visit_StructType(const ASR::StructType_t& x) {
770+
src = "";
771+
std::string c_type_name = get_StructCTypeName(x);
761772
visit_AggregateTypeUtil(x, c_type_name, array_types_decls);
762773
src = "";
763774
}

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
732732
}
733733
const std::map<std::string, ASR::symbol_t*>& scope = der_type->m_symtab->get_scope();
734734
for( auto itr = scope.begin(); itr != scope.end(); itr++ ) {
735-
if( ASR::is_a<ASR::UnionType_t>(*itr->second) ) {
735+
if( ASR::is_a<ASR::UnionType_t>(*itr->second) ||
736+
ASR::is_a<ASR::StructType_t>(*itr->second) ) {
736737
continue ;
737738
}
738739
ASR::Variable_t* member = ASR::down_cast<ASR::Variable_t>(itr->second);
@@ -2669,7 +2670,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
26692670
for( auto item: struct_type_t->m_symtab->get_scope() ) {
26702671
if( ASR::is_a<ASR::ClassProcedure_t>(*item.second) ||
26712672
ASR::is_a<ASR::GenericProcedure_t>(*item.second) ||
2672-
ASR::is_a<ASR::UnionType_t>(*item.second) ) {
2673+
ASR::is_a<ASR::UnionType_t>(*item.second) ||
2674+
ASR::is_a<ASR::StructType_t>(*item.second) ) {
26732675
continue ;
26742676
}
26752677
ASR::ttype_t* symbol_type = ASRUtils::symbol_type(item.second);

0 commit comments

Comments
 (0)