summaryrefslogtreecommitdiff
path: root/tools/standalone_miri/hir_sim.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-03-09 21:44:39 +0800
committerJohn Hodge <tpg@mutabah.net>2018-03-17 18:52:16 +0800
commit6f1317041b13c7d828f421cb861602cb1fc15971 (patch)
tree5ad0212f09a2f736cffe6930e3e0e6420fc2a7cc /tools/standalone_miri/hir_sim.cpp
parent4dca93d85c1cf0753183d7e4156ff925ac514b4d (diff)
downloadmrust-6f1317041b13c7d828f421cb861602cb1fc15971.tar.gz
Standalone MIRI - size_of_val and drop_in_place
Diffstat (limited to 'tools/standalone_miri/hir_sim.cpp')
-rw-r--r--tools/standalone_miri/hir_sim.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/standalone_miri/hir_sim.cpp b/tools/standalone_miri/hir_sim.cpp
index 85c05459..604f65a4 100644
--- a/tools/standalone_miri/hir_sim.cpp
+++ b/tools/standalone_miri/hir_sim.cpp
@@ -136,6 +136,36 @@ HIR::TypeRef HIR::TypeRef::wrap(TypeWrapper::Ty ty, size_t size) const
rv.wrappers.insert(rv.wrappers.begin(), { ty, size });
return rv;
}
+const HIR::TypeRef* HIR::TypeRef::get_usized_type(size_t& running_inner_size) const
+{
+ if( this->wrappers.empty() )
+ {
+ switch(this->inner_type)
+ {
+ case RawType::Composite:
+ if(!this->composite_type->variants.empty())
+ return nullptr;
+ if(this->composite_type->fields.empty())
+ return nullptr;
+ running_inner_size = this->composite_type->fields.back().first;
+ size_t tmp;
+ return this->composite_type->fields.back().second.get_usized_type(tmp);
+ case RawType::TraitObject:
+ case RawType::Str:
+ return this;
+ default:
+ return nullptr;
+ }
+ }
+ else if( this->wrappers[0].type == TypeWrapper::Ty::Slice )
+ {
+ return this;
+ }
+ else
+ {
+ return nullptr;
+ }
+}
const HIR::TypeRef* HIR::TypeRef::get_meta_type() const
{
static ::HIR::TypeRef static_usize = ::HIR::TypeRef(RawType::USize);