shithub: pprolog

Download patch

ref: e9f5f2ffcc62eee564d37d5776e701bab548a496
parent: 6dd50f970be88637fd2799ae8e2868c01002898e
author: Peter Mikkelsen <[email protected]>
date: Thu Jul 8 17:22:06 EDT 2021

Make the repl bindings and query global so the garbage collector can know about them

--- a/dat.h
+++ b/dat.h
@@ -97,4 +97,6 @@
 Module *modules;
 Module *systemmodule; /* The module for the builtins. Everything has access to those */
 Module *usermodule; /* The default module for user defined predicates */
-uvlong clausenr;
\ No newline at end of file
+uvlong clausenr;
+Binding *replbindings; /* The bindings used by the repl */
+Term *replquery; /* The currently active repl query */
\ No newline at end of file
--- a/garbage.c
+++ b/garbage.c
@@ -65,10 +65,14 @@
 		1) The modules
 		2) The goalstack
 		3) The choicestack
+		4) The replbindings
+		5) The replquery
 	*/
 	markmodules();
 	markgoalstack(goalstack);
 	markchoicestack();
+	markbindings(replbindings);
+	markterm(replquery);
 
 	/* Free the allocations that were not marked as reachable */
 	for(i = 0; i < TableSize; i++){
--- a/repl.c
+++ b/repl.c
@@ -6,6 +6,7 @@
 #include "fns.h"
 
 Rune parsefindmore(int);
+void dogc(void);
 
 void
 repl(void)
@@ -13,14 +14,15 @@
 	int fd = 0; /* Standard input */
 	while(1){
 		print("?- ");
-		Term *query = parse(fd, nil, 1);
-		Binding *bindings = nil;
+		replquery = parse(fd, nil, 1);
+		replbindings = nil;
 		choicestack = nil;
 		goalstack = nil;
 		int success;
 		int firsttime = 1;
 FindMore:
-		success = evalquery(query, &bindings);
+		success = evalquery(replquery, &replbindings);
+		dogc();
 		if(firsttime){
 			print(" ");
 			firsttime = 0;
@@ -28,15 +30,15 @@
 		if(success == 0)
 			print("  false.\n");
 		else{
-			if(bindings == nil)
+			if(replbindings == nil)
 				print("  true");
 			else{
-				while(bindings){
+				while(replbindings){
 					print("  %S = %S%s", 
-						bindings->name, 
-						prettyprint(bindings->value, 0, 0, 0), 
-						bindings->next ? ",\n " : "");
-					bindings = bindings->next;
+						replbindings->name, 
+						prettyprint(replbindings->value, 0, 0, 0), 
+						replbindings->next ? ",\n " : "");
+					replbindings = replbindings->next;
 				}
 			}
 			if(choicestack != nil){
@@ -50,10 +52,6 @@
 				print(".\n");
 			}
 		}
-
-		vlong amount = collectgarbage();
-		if(amount != 0)
-			print("Collected %lld bytes of garbage\n", amount);
 	}
 }
 
@@ -78,4 +76,12 @@
 		close(consctl);
 	}
 	return peek;
+}
+
+void
+dogc(void)
+{
+	vlong amount = collectgarbage();
+	if(amount != 0 && debug)
+		print("Collected %lld bytes of garbage\n", amount);
 }
\ No newline at end of file