diff options
author | John Hodge <tpg@mutabah.net> | 2018-05-13 08:25:04 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2018-05-13 08:25:04 +0800 |
commit | 9aae4d5af2da15c8ff40966bed6faeef7126f7a4 (patch) | |
tree | fe8d1a92c992d9f9697ba644fef7cbd744cc70b2 | |
parent | 561d2ddc8e67277dbe12216f9a365d65ec3f5c2c (diff) | |
download | mrust-9aae4d5af2da15c8ff40966bed6faeef7126f7a4.tar.gz |
Codegen MMIR - Struct constructors
-rw-r--r-- | src/trans/codegen_mmir.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/trans/codegen_mmir.cpp b/src/trans/codegen_mmir.cpp index 19574814..dd6f1468 100644 --- a/src/trans/codegen_mmir.cpp +++ b/src/trans/codegen_mmir.cpp @@ -433,6 +433,43 @@ namespace } m_mir_res = nullptr; } + void emit_constructor_struct(const Span& sp, const ::HIR::GenericPath& p, const ::HIR::Struct& item) override + { + TRACE_FUNCTION_F(p); + ::HIR::TypeRef tmp; + auto monomorph = [&](const auto& x)->const auto& { + if( monomorphise_type_needed(x) ) { + tmp = monomorphise_type(sp, item.m_params, p.m_params, x); + m_resolve.expand_associated_types(sp, tmp); + return tmp; + } + else { + return x; + } + }; + // Crate constructor function + const auto& e = item.m_data.as_Tuple(); + m_of << "fn " << p << "("; + for(unsigned int i = 0; i < e.size(); i ++) + { + if(i != 0) + m_of << ", "; + m_of << monomorph(e[i].ent); + } + m_of << "): " << p << " {\n"; + m_of << "\t0: {\n"; + m_of << "\t\tASSIGN RETURN = { "; + for(unsigned int i = 0; i < e.size(); i ++) + { + if(i != 0) + m_of << ", "; + m_of << "arg" << i; + } + m_of << " }: " << p << ";\n"; + m_of << "\t\tRETURN\n"; + m_of << "\t}\n"; + m_of << "}\n"; + } void emit_union(const Span& sp, const ::HIR::GenericPath& p, const ::HIR::Union& item) override { ::MIR::Function empty_fcn; @@ -452,7 +489,7 @@ namespace } for(const auto& e : repr->fields) { - m_of << "\t" << "#" << (&e - repr->fields.data()) << ";\n"; + m_of << "\t" << "#" << (&e - repr->fields.data()) << " =" << (&e - repr->fields.data()) << ";\n"; } m_of << "}\n"; |