@@ -33,8 +33,8 @@ option_ref<level> get_lmvar_assignment(metavar_ctx & mctx, name const & mid) {
33
33
34
34
class instantiate_lmvars_fn {
35
35
metavar_ctx & m_mctx;
36
- std::unordered_map<lean_object *, level> m_cache;
37
36
std::vector<level> m_saved; // Helper vector to prevent values from being garbagge collected
37
+ std::unordered_map<lean_object *, level> m_cache;
38
38
39
39
inline level cache (level const & l, level r, bool shared) {
40
40
if (shared) {
@@ -71,14 +71,14 @@ class instantiate_lmvars_fn {
71
71
if (!has_mvar (a)) {
72
72
return a;
73
73
} else {
74
+ /*
75
+ We save `a` to ensure it will not be garbage collected.
76
+ This is necessary because `m_cache` may contain references
77
+ to it and its subterms, **and** it does not bump their RC's
78
+ */
79
+ m_saved.push_back (a);
74
80
level a_new = visit (a);
75
81
if (!is_eqp (a, a_new)) {
76
- /*
77
- We save `a` to ensure it will not be garbage collected
78
- after we update `mctx`. This is necessary because `m_cache`
79
- may contain references to its subterms.
80
- */
81
- m_saved.push_back (a);
82
82
assign_lmvar (m_mctx, mvar_id (l), a_new);
83
83
}
84
84
return a_new;
@@ -140,9 +140,9 @@ expr replace_fvars(expr const & e, array_ref<expr> const & fvars, expr const * r
140
140
class instantiate_mvars_fn {
141
141
metavar_ctx & m_mctx;
142
142
instantiate_lmvars_fn m_level_fn;
143
+ std::vector<expr> m_saved; // Helper vector to prevent values from being garbagge collected
143
144
name_set m_already_normalized; // Store metavariables whose assignment has already been normalized.
144
145
std::unordered_map<lean_object *, expr> m_cache;
145
- std::vector<expr> m_saved; // Helper vector to prevent values from being garbagge collected
146
146
147
147
level visit_level (level const & l) {
148
148
return m_level_fn (l);
@@ -172,14 +172,14 @@ class instantiate_mvars_fn {
172
172
return optional<expr>(a);
173
173
} else {
174
174
m_already_normalized.insert (mid);
175
+ /*
176
+ We save `a` to ensure it will not be garbage collected.
177
+ This is necessary because `m_cache` may contain references to it and
178
+ its subterms. Recall that `m_cache` does not bump their RC's.
179
+ */
180
+ m_saved.push_back (a);
175
181
expr a_new = visit (a);
176
182
if (!is_eqp (a, a_new)) {
177
- /*
178
- We save `a` to ensure it will not be garbage collected
179
- after we update `mctx`. This is necessary because `m_cache`
180
- may contain references to its subterms.
181
- */
182
- m_saved.push_back (a);
183
183
assign_mvar (m_mctx, mid, a_new);
184
184
}
185
185
return optional<expr>(a_new);
0 commit comments