diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-03 08:00:04 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-03 08:00:04 +0800 |
commit | 55bc4a9e019b1b5e51fec58030a30ea9146de45c (patch) | |
tree | fa17e394ab154cdb7512edc0515449969cf2b5ce /src/hir | |
parent | 892b1029b5c9fa2bc12316dcf927d1aa36135538 (diff) | |
download | mrust-55bc4a9e019b1b5e51fec58030a30ea9146de45c.tar.gz |
HIR/MIR - VTable work
Diffstat (limited to 'src/hir')
-rw-r--r-- | src/hir/deserialise.cpp | 16 | ||||
-rw-r--r-- | src/hir/expr.cpp | 1 | ||||
-rw-r--r-- | src/hir/hir.hpp | 10 | ||||
-rw-r--r-- | src/hir/path.cpp | 5 | ||||
-rw-r--r-- | src/hir/path.hpp | 1 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 8 | ||||
-rw-r--r-- | src/hir/visitor.cpp | 1 |
7 files changed, 31 insertions, 11 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp index 649d97fd..3d84c9d6 100644 --- a/src/hir/deserialise.cpp +++ b/src/hir/deserialise.cpp @@ -31,6 +31,7 @@ namespace { {} ::std::string read_string() { return m_in.read_string(); } + size_t deserialise_count() { return m_in.read_count(); } template<typename V> ::std::map< ::std::string,V> deserialise_strmap() @@ -359,6 +360,9 @@ namespace { _(DstMeta, { deserialise_mir_lvalue() }) + _(DstPtr, { + deserialise_mir_lvalue() + }) _(MakeDst, { deserialise_mir_lvalue(), deserialise_mir_lvalue() @@ -535,9 +539,12 @@ namespace { ::HIR::TraitValueItem deserialise_traitvalueitem() { - switch( m_in.read_tag() ) + auto tag = m_in.read_tag(); + auto idx = m_in.read_count(); + ::HIR::TraitValueItem rv; + switch( tag ) { - #define _(x, ...) case ::HIR::TraitValueItem::TAG_##x: DEBUG("- " #x); return ::HIR::TraitValueItem::make_##x( __VA_ARGS__ ); + #define _(x, ...) case ::HIR::TraitValueItem::TAG_##x: DEBUG("- " #x); rv = ::HIR::TraitValueItem::make_##x( __VA_ARGS__ ); break; _(Constant, deserialise_constant() ) _(Static, deserialise_static() ) _(Function, deserialise_function() ) @@ -546,6 +553,8 @@ namespace { DEBUG("Invalid TraitValueItem tag"); throw ""; } + rv.vtable_ofs = idx; + return rv; } ::HIR::AssociatedType deserialise_associatedtype() { @@ -602,6 +611,7 @@ namespace { template<> DEF_D( ::HIR::TypeImpl, return d.deserialise_typeimpl(); ) template<> DEF_D( ::MacroRulesPtr, return d.deserialise_macrorulesptr(); ) + template<> DEF_D( unsigned int, return static_cast<unsigned int>(d.deserialise_count()); ) ::HIR::TypeRef HirDeserialiser::deserialise_type() { @@ -722,7 +732,6 @@ namespace { box$( deserialise_type() ), deserialise_genericpath(), m_in.read_string(), - deserialise_pathparams(), deserialise_pathparams() } ); default: @@ -857,6 +866,7 @@ namespace { rv.m_is_marker = m_in.read_bool(); rv.m_types = deserialise_strumap< ::HIR::AssociatedType>(); rv.m_values = deserialise_strumap< ::HIR::TraitValueItem>(); + rv.m_type_indexes = deserialise_strumap< unsigned int>(); return rv; } diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index e974f2cc..51f0661f 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -320,7 +320,6 @@ void ::HIR::ExprVisitorDef::visit_path(::HIR::Visitor::PathContext pc, ::HIR::Pa visit_type(*e.type); visit_generic_path(pc, e.trait); visit_path_params(e.params); - visit_path_params(e.impl_params); ), (UfcsUnknown, visit_type(*e.type); diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp index 6843e93d..1a933993 100644 --- a/src/hir/hir.hpp +++ b/src/hir/hir.hpp @@ -231,10 +231,15 @@ struct AssociatedType ::std::vector< ::HIR::TraitPath> m_trait_bounds; ::HIR::TypeRef m_default; }; -TAGGED_UNION(TraitValueItem, Constant, +TAGGED_UNION_EX(TraitValueItem, (), Constant, ( (Constant, Constant), (Static, Static), (Function, Function) + ), + (),(), + ( + unsigned int vtable_ofs = ~0u; + ) ); struct Trait { @@ -247,6 +252,9 @@ struct Trait ::std::unordered_map< ::std::string, AssociatedType > m_types; ::std::unordered_map< ::std::string, TraitValueItem > m_values; + // Indexes in the parameter list for each associated type + ::std::unordered_map< ::std::string, unsigned int > m_type_indexes; + Trait( GenericParams gps, ::std::string lifetime, ::std::vector< ::HIR::TraitPath> parents): m_params( mv$(gps) ), m_lifetime( mv$(lifetime) ), diff --git a/src/hir/path.cpp b/src/hir/path.cpp index 1f80204d..73d1b92f 100644 --- a/src/hir/path.cpp +++ b/src/hir/path.cpp @@ -90,7 +90,7 @@ namespace HIR { return os << "<" << *e.type << " /*- " << e.impl_params << "*/>::" << e.item << e.params; ), (UfcsKnown, - return os << "<" << *e.type << " as " << e.trait << " /*- " << e.impl_params << "*/>::" << e.item << e.params; + return os << "<" << *e.type << " as " << e.trait << ">::" << e.item << e.params; ), (UfcsUnknown, return os << "<" << *e.type << " as _>::" << e.item << e.params; @@ -220,8 +220,7 @@ bool ::HIR::TraitPath::operator==(const ::HIR::TraitPath& x) const box$( e.type->clone() ), e.trait.clone(), e.item, - e.params.clone(), - e.impl_params.clone() + e.params.clone() })); ), (UfcsUnknown, diff --git a/src/hir/path.hpp b/src/hir/path.hpp index 4e8eaef3..e6b4e381 100644 --- a/src/hir/path.hpp +++ b/src/hir/path.hpp @@ -191,7 +191,6 @@ public: GenericPath trait; ::std::string item; PathParams params; - PathParams impl_params; }), (UfcsUnknown, struct { ::std::unique_ptr<TypeRef> type; diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp index d372585c..c58780a0 100644 --- a/src/hir/serialise.cpp +++ b/src/hir/serialise.cpp @@ -177,7 +177,6 @@ namespace { serialise_genericpath(e.trait); m_out.write_string(e.item); serialise_pathparams(e.params); - serialise_pathparams(e.impl_params); ), (UfcsUnknown, DEBUG("-- UfcsUnknown - " << path); @@ -565,6 +564,9 @@ namespace { (DstMeta, serialise(e.val); ), + (DstPtr, + serialise(e.val); + ), (MakeDst, serialise(e.ptr_val); serialise(e.meta_val); @@ -685,6 +687,8 @@ namespace { ) } + void serialise(unsigned int v) { m_out.write_count(v); }; + // - Value items void serialise(const ::HIR::Function& fcn) { @@ -813,10 +817,12 @@ namespace { m_out.write_bool( item.m_is_marker ); serialise_strmap( item.m_types ); serialise_strmap( item.m_values ); + serialise_strmap( item.m_type_indexes ); } void serialise(const ::HIR::TraitValueItem& tvi) { m_out.write_tag( tvi.tag() ); + m_out.write_count( tvi.vtable_ofs ); TU_MATCHA( (tvi), (e), (Constant, DEBUG("Constant"); diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp index d852423a..faa75e0a 100644 --- a/src/hir/visitor.cpp +++ b/src/hir/visitor.cpp @@ -450,7 +450,6 @@ void ::HIR::Visitor::visit_path(::HIR::Path& p, ::HIR::Visitor::PathContext pc) this->visit_type(*e.type); this->visit_generic_path(e.trait, ::HIR::Visitor::PathContext::TYPE); this->visit_path_params(e.params); - this->visit_path_params(e.impl_params); ), (UfcsUnknown, this->visit_type(*e.type); |