shithub: MicroHs

Download patch

ref: 80288a669f121451a3ab4d92a2bc52f9e408e366
parent: 746dd19827d8bcb0f98b1b3ba61a294938ab8363
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Fri Aug 23 12:17:17 EDT 2024

Avoid global variables.

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -2541,19 +2541,17 @@
 #undef CRET
 }
 
-bits_t *rnf_bits;
-
 void
-rnf_rec(NODEPTR n)
+rnf_rec(bits_t *done, NODEPTR n)
 {
  top:
-  if (test_bit(rnf_bits, n))
+  if (test_bit(done, n))
     return;
-  set_bit(rnf_bits, n);
+  set_bit(done, n);
   n = evali(n);
   if (GETTAG(n) == T_AP) {
     PUSH(ARG(n));               /* protect from GC */
-    rnf_rec(FUN(n));
+    rnf_rec(done, FUN(n));
     n = POPTOP();
     goto top;
   }
@@ -2569,15 +2567,15 @@
 rnf(value_t noerr, NODEPTR n)
 {
   /* Mark visited nodes to avoid getting stuck in loops. */
-  rnf_bits = calloc(free_map_nwords, sizeof(bits_t));
-  if (!rnf_bits)
+  bits_t *done = calloc(free_map_nwords, sizeof(bits_t));
+  if (!done)
     memerr();
   if (doing_rnf)
     ERR("recursive rnf()");
   doing_rnf = (int)noerr;
-  rnf_rec(n);
+  rnf_rec(done, n);
   doing_rnf = 0;
-  FREE(rnf_bits);
+  FREE(done);
 }
 
 void execio(NODEPTR *);
--