]> Nishi Git Mirror - gwion.git/commitdiff
:art: handle ref objects in closures
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 27 Apr 2022 09:33:00 +0000 (11:33 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 27 Apr 2022 09:33:00 +0000 (11:33 +0200)
src/vm/closure.c

index 910e63310da2e2124644a1d353a7728a3b1f26e5..8d8882933eca352a4f9e9c6cb68786d71c34c2b4 100644 (file)
@@ -19,9 +19,12 @@ ANN Closure *new_closure(MemPool mp, const m_uint sz) {
 
 ANN void free_closure(Closure *a, const Gwion gwion) {
   const Map m = &a->m;
-  for (m_uint i = 0; i < map_size(m); ++i)
-    compound_release(gwion->vm->cleaner_shred, (Type)VKEY(m, i),
-                     a->data + VVAL(m, i));
+  for (m_uint i = 0; i < map_size(m); ++i) {
+    const Type t = (Type)VKEY(m, i);
+    const m_bit *data = tflag(t, tflag_ref) ?
+      (a->data + VVAL(m, i)) : *(m_bit**)(a->data + VVAL(m, i));
+    compound_release(gwion->vm->cleaner_shred, t, data);
+  }
   map_release(m);
   _mp_free(gwion->mp, sizeof(Closure) + a->sz, a);
 }