shithub: MicroHs

Download patch

ref: 9178a59adace081f3d576cb659c28c40264737f7
parent: 1a9dd10f9d2918382b938bda9079652d6b392e0c
author: Lennart Augustsson <lennart@augustsson.net>
date: Sat Aug 31 17:42:04 EDT 2024

Share BSTR nodes.

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1890,7 +1890,7 @@
   if (n < cells || n >= cells + heap_size) abort();
   //PRINT("find_sharing %p %llu ", n, LABEL(n));
   tag_t tag = GETTAG(n);
-  if (tag == T_AP || tag == T_ARR) {
+  if (tag == T_AP || tag == T_ARR || tag == T_BSTR) {
     if (test_bit(pb->shared_bits, n)) {
       /* Alread marked as shared */
       //PRINT("shared\n");
@@ -1904,18 +1904,22 @@
       /* Mark as visited, and recurse */
       //PRINT("unmarked\n");
       set_bit(pb->marked_bits, n);
-      if (tag == T_AP) {
+      switch(tag) {
+      case T_AP:
         find_sharing(pb, FUN(n));
         n = ARG(n);
         goto top;
-      } else {
+      case T_ARR:
         for(size_t i = 0; i < ARR(n)->size; i++) {
           find_sharing(pb, ARR(n)->array[i]);
         }
+        break;
+      default:
+        break;
       }
     }
   } else {
-    /* Not an application, so do nothing */
+    /* Not an sharable node, so do nothing */
     //PRINT("not T_AP\n");
     ;
   }
--