shithub: MicroHs

Download patch

ref: 9277a221708b1546518f8ee467e38c0ef7239d77
parent: 48a34d1eb8df3def243689c0c5be2d5b3000a90c
author: Lennart Augustsson <lennart@augustsson.net>
date: Sun Apr 7 17:00:58 EDT 2024

Add missing find_sharing for arrays.

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1800,7 +1800,8 @@
   }
   if (n < cells || n >= cells + heap_size) abort();
   //PRINT("find_sharing %p %llu ", n, LABEL(n));
-  if (GETTAG(n) == T_AP) {
+  tag_t tag = GETTAG(n);
+  if (tag == T_AP || tag == T_ARR) {
     if (test_bit(shared_bits, n)) {
       /* Alread marked as shared */
       //PRINT("shared\n");
@@ -1814,9 +1815,15 @@
       /* Mark as visited, and recurse */
       //PRINT("unmarked\n");
       set_bit(marked_bits, n);
-      find_sharing(FUN(n));
-      n = ARG(n);
-      goto top;
+      if (tag == T_AP) {
+        find_sharing(FUN(n));
+        n = ARG(n);
+        goto top;
+      } else {
+        for(size_t i = 0; i < ARR(n)->size; i++) {
+          find_sharing(ARR(n)->array[i]);
+        }
+      }
     }
   } else {
     /* Not an application, so do nothing */
--