}
else if (region.is_static ())
{
- free_regions.push_back (0);
+ free_regions.push_back (STATIC_FREE_REGION);
}
else if (region.is_anonymous ())
{
{
auto mutability = ty->as<const TyTy::ReferenceType> ()->mutability ();
auto loan = ctx.place_db.add_loan ({mutability, place_id, location});
- push_tmp_assignment (new BorrowExpr (place_id, loan,
- ctx.place_db.get_next_free_region ()),
- ty, location);
+ push_tmp_assignment (
+ new BorrowExpr (place_id, loan,
+ ctx.place_db.get_next_free_region ().value),
+ ty, location);
return translated;
}
{ty->as<const TyTy::ReferenceType> ()->mutability (), place_id,
location});
return_expr (new BorrowExpr (place_id, loan,
- ctx.place_db.get_next_free_region ()),
+ ctx.place_db.get_next_free_region ().value),
ty, location);
return translated;
}
ctx.fn_free_regions[bound.second.get_index ()]);
auto last_bound = universal_region_bounds.back ();
- rust_debug ("\t\t %lu: %lu", (unsigned long) last_bound.first,
- (unsigned long) last_bound.second);
+ rust_debug ("\t\t %lu: %lu", (unsigned long) last_bound.first.value,
+ (unsigned long) last_bound.second.value);
}
// TODO: handle type_region constraints
if (generic_param->get_kind ()
== HIR::GenericParam::GenericKind::LIFETIME)
{
- result[regions[region_index++]]
+ result[regions[region_index++].value]
= static_cast<HIR::LifetimeParam *> (generic_param.get ());
}
}
print_comma_separated (stream,
func.place_db[local].regions.get_regions (),
[this] (FreeRegion region_id) {
- stream << "'?" << region_id;
+ stream << "'?" << region_id.value;
});
stream << "]\n";
}
for (auto ®ion : universal_regions)
{
- facts.universal_region.emplace_back (region);
- facts.placeholder.emplace_back (region, next_loan++);
- facts.known_placeholder_subset.emplace_back (0, region);
+ facts.universal_region.emplace_back (region.value);
+ facts.placeholder.emplace_back (region.value, next_loan++);
+ facts.known_placeholder_subset.emplace_back (0, region.value);
}
// Copy already collected subset facts, that are universally valid.
for (auto &bound : universal_region_bounds)
- facts.known_placeholder_subset.emplace_back (bound.first, bound.second);
+ facts.known_placeholder_subset.emplace_back (bound.first.value,
+ bound.second.value);
}
void visit_places (const std::vector<PlaceId> &args)
facts.path_is_var.emplace_back (place_id.value, place_id.value);
for (auto ®ion : place.regions)
facts.use_of_var_derefs_origin.emplace_back (place_id.value,
- region);
+ region.value);
// TODO: drop_of_var_derefs_origin
break;
rust_debug ("\tSanitize deref of %s", base.tyty->as_string ().c_str ());
- std::vector<Polonius::Origin> regions;
+ std::vector<FreeRegion> regions;
regions.insert (regions.end (), base.regions.begin () + 1,
base.regions.end ());
- FreeRegions r (std::move (regions));
+ FreeRegions r;
+ r.set_from (std::move (regions));
push_subset_all (place.tyty, r, place.regions);
}
void sanizite_field (PlaceId place_id)
.query_field_regions (base.tyty->as<TyTy::ADTType> (), 0,
place.variable_or_field_index,
base.regions); // FIXME
- FreeRegions f (std::move (r));
+ FreeRegions f;
+ f.set_from (std::move (r));
push_subset_all (place.tyty, f, place.regions);
}
issue_loan (expr.get_origin (), expr.get_loan ());
}
- push_subset (main_loan_place.regions[0], expr.get_origin ());
+ push_subset (main_loan_place.regions[0], {expr.get_origin ()});
}
else
{
issue_loan (expr.get_origin (), expr.get_loan ());
}
- auto loan_regions = base_place.regions.prepend (expr.get_origin ());
+ auto loan_regions = base_place.regions.prepend ({expr.get_origin ()});
push_subset (ref_place.tyty, loan_regions, ref_place.regions);
}
protected: // Subset helpers.
void push_subset (FreeRegion lhs, FreeRegion rhs)
{
- rust_debug ("\t\tpush_subset: '?%lu: '?%lu", (unsigned long) lhs,
- (unsigned long) rhs);
+ rust_debug ("\t\tpush_subset: '?%lu: '?%lu", (unsigned long) lhs.value,
+ (unsigned long) rhs.value);
- facts.subset_base.emplace_back (lhs, rhs, get_current_point_mid ());
+ facts.subset_base.emplace_back (lhs.value, rhs.value,
+ get_current_point_mid ());
}
void push_subset_all (FreeRegion lhs, FreeRegion rhs)
{
- rust_debug ("\t\tpush_subset_all: '?%lu: '?%lu", (unsigned long) lhs,
- (unsigned long) rhs);
+ rust_debug ("\t\tpush_subset_all: '?%lu: '?%lu", (unsigned long) lhs.value,
+ (unsigned long) rhs.value);
for (auto point : cfg_points_all)
- facts.subset_base.emplace_back (lhs, rhs, point);
+ facts.subset_base.emplace_back (lhs.value, rhs.value, point);
}
void push_subset (Variance variance, FreeRegion lhs, FreeRegion rhs)
namespace Rust {
-using FreeRegion = size_t;
+struct FreeRegion
+{
+ size_t value;
+ // some overloads for comparision
+ bool operator== (const FreeRegion &rhs) const { return value == rhs.value; }
+ bool operator!= (const FreeRegion &rhs) const { return !(operator== (rhs)); }
+ bool operator< (const FreeRegion &rhs) const { return value < rhs.value; }
+ bool operator> (const FreeRegion &rhs) const { return value > rhs.value; }
+ bool operator<= (const FreeRegion &rhs) const { return !(operator> (rhs)); }
+ bool operator>= (const FreeRegion &rhs) const { return !(operator< (rhs)); }
+};
+
+static constexpr FreeRegion STATIC_FREE_REGION = {0};
class FreeRegions
{
this->regions.push_back ({region});
}
}
+ void set_from (std::vector<FreeRegion> &®ions)
+ {
+ this->regions.clear ();
+ for (auto ®ion : regions)
+ {
+ this->regions.push_back (region);
+ }
+ }
WARN_UNUSED_RESULT FreeRegions prepend (FreeRegion region) const
{
}
FreeRegions (std::vector<FreeRegion> &®ions) : regions (regions) {}
+ FreeRegions () {}
WARN_UNUSED_RESULT std::string to_string () const
{
std::stringstream result;
for (auto ®ion : regions)
{
- result << region;
+ result << region.value;
result << ", ";
}
// Remove the last ", " from the string.
WARN_UNUSED_RESULT FreeRegion get_next_free_region () const
{
- return next_free_region++;
+ ++next_free_region.value;
+ return {next_free_region.value - 1};
}
FreeRegions bind_regions (std::vector<TyTy::Region> regions,
if (region.is_early_bound ())
free_regions.push_back (parent_free_regions[region.get_index ()]);
else if (region.is_static ())
- free_regions.push_back (0);
+ free_regions.push_back (STATIC_FREE_REGION);
else if (region.is_anonymous ())
free_regions.push_back (get_next_free_region ());
else if (region.is_named ())
std::vector<Loan> loans;
- Polonius::Origin next_free_region = 1;
+ FreeRegion next_free_region = {1};
public:
PlaceDB ()
const Scope &get_scope (ScopeId id) const { return scopes[id]; }
- FreeRegion get_next_free_region () { return next_free_region++; }
+ FreeRegion get_next_free_region ()
+ {
+ ++next_free_region.value;
+ return {next_free_region.value - 1};
+ }
FreeRegion peek_next_free_region () const { return next_free_region; }
->get_variance_analysis_ctx ()
.query_type_variances (new_place_ref.tyty);
std::vector<Polonius::Origin> regions;
- for (size_t i = 0; i < variances.size (); i++)
- regions.push_back (next_free_region++);
+ for (size_t i = 0; i < variances.size (); ++i)
+ regions.push_back (next_free_region.value++);
new_place_ref.regions.set_from (std::move (regions));
void set_next_free_region (Polonius::Origin next_free_region)
{
- this->next_free_region = next_free_region;
+ this->next_free_region.value = next_free_region;
}
PlaceId lookup_or_add_variable (NodeId id, TyTy::BaseType *tyty)
{
if (region.is_early_bound ())
{
- regions.push_back (parent_regions[region.get_index ()]);
+ regions.push_back (parent_regions[region.get_index ()].value);
}
else if (region.is_late_bound ())
{
for (size_t i = type_param_ranges[param_i];
i < type_param_ranges[param_i + 1]; i++)
{
- regions.push_back (parent_regions[i]);
+ regions.push_back (parent_regions[i].value);
}
}
} // namespace VarianceAnalysis
} // namespace TyTy
-} // namespace Rust
\ No newline at end of file
+} // namespace Rust