summaryrefslogtreecommitdiff
path: root/tools/standalone_miri/hir_sim.cpp
diff options
context:
space:
mode:
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);