@@ -4,8 +4,7 @@ namespace rt::objects
44{
55 Region* get_region (DynObject* obj)
66 {
7- if ((obj == nullptr ) || obj->is_immutable ())
8- return nullptr ;
7+ assert (obj != nullptr );
98 return obj->region .get_ptr ();
109 }
1110
@@ -75,7 +74,7 @@ namespace rt::objects
7574 }
7675
7776 // Handle immutable case
78- if (target == nullptr )
77+ if (target == immutable_region )
7978 return ;
8079
8180 if (src == get_local_region ())
@@ -94,6 +93,7 @@ namespace rt::objects
9493
9594 void add_region_reference (Region* src_region, DynObject* target)
9695 {
96+ assert (target != nullptr );
9797 if (target->is_immutable ())
9898 return ;
9999
@@ -118,6 +118,7 @@ namespace rt::objects
118118
119119 void add_reference (DynObject* src, DynObject* target)
120120 {
121+ assert (src != nullptr );
121122 if (target == nullptr )
122123 return ;
123124
@@ -149,6 +150,8 @@ namespace rt::objects
149150
150151 void move_reference (DynObject* src, DynObject* dst, DynObject* target)
151152 {
153+ assert (src != nullptr );
154+ assert (dst != nullptr );
152155 if (target == nullptr || target->is_immutable ())
153156 return ;
154157
@@ -173,6 +176,8 @@ namespace rt::objects
173176 // If in the same region, then just remove the RC, but don't try to collect
174177 // as the whole region is being torndown including any potential cycles.
175178 auto same_region = [](DynObject* src, DynObject* target) {
179+ assert (src != nullptr );
180+ assert (target != nullptr );
176181 return get_region (src) == get_region (target);
177182 };
178183 for (auto & [key, field] : obj->fields )
@@ -190,8 +195,9 @@ namespace rt::objects
190195 remove_reference (obj, old_value);
191196 }
192197
193- if (same_region (obj, obj->prototype ))
198+ if ((obj-> prototype != nullptr ) && same_region (obj, obj->prototype ))
194199 {
200+ // TODO When freeze is no longer immortal, this will need to be updated.
195201 obj->prototype ->change_rc (-1 );
196202 }
197203 else
0 commit comments