summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-03 08:00:04 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-03 08:00:04 +0800
commit55bc4a9e019b1b5e51fec58030a30ea9146de45c (patch)
treefa17e394ab154cdb7512edc0515449969cf2b5ce /src/hir
parent892b1029b5c9fa2bc12316dcf927d1aa36135538 (diff)
downloadmrust-55bc4a9e019b1b5e51fec58030a30ea9146de45c.tar.gz
HIR/MIR - VTable work
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/deserialise.cpp16
-rw-r--r--src/hir/expr.cpp1
-rw-r--r--src/hir/hir.hpp10
-rw-r--r--src/hir/path.cpp5
-rw-r--r--src/hir/path.hpp1
-rw-r--r--src/hir/serialise.cpp8
-rw-r--r--src/hir/visitor.cpp1
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);