aboutsummaryrefslogtreecommitdiff
path: root/interpreter/print.c
diff options
context:
space:
mode:
authorCamil Staps2016-08-30 21:28:08 +0200
committerCamil Staps2016-08-30 21:28:08 +0200
commit2218e6612081d14c2cd3c94391472ffe2f338944 (patch)
tree252a6e58137b69c43b292e448997eead78281b77 /interpreter/print.c
parentFixed issue with twice (diff)
Fix one memory leak mentioned in #2; add debug dot graphs output
Diffstat (limited to 'interpreter/print.c')
-rw-r--r--interpreter/print.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/interpreter/print.c b/interpreter/print.c
index edcedf3..fa784ed 100644
--- a/interpreter/print.c
+++ b/interpreter/print.c
@@ -122,3 +122,66 @@ void print_node(struct node* node) {
free_expression(e);
my_free(e);
}
+
+#ifdef _FUSPEL_DEBUG
+static unsigned int file_count = 0;
+
+void print_node_to_file(struct node* node, FILE* f) {
+ unsigned close = 0;
+
+ if (!node)
+ return;
+
+ if (!f) {
+ char fname[20];
+ sprintf(fname, "graph-%03u.dot", file_count++);
+ f = fopen(fname, "w");
+ fprintf(f, "digraph {\n");
+ fprintf(f, "node [shape=rectangle];\n");
+ close = 1;
+ }
+
+ switch (node->kind) {
+ case EXPR_INT:
+ fprintf(f, "%d [label=\"%d (%d)\"];\n",
+ node, *((int*) node->var1), node->used_count);
+ break;
+
+ case EXPR_NAME:
+ fprintf(f, "%d [label=\"%s (%d)\"];\n",
+ node, (char*) node->var1, node->used_count);
+ break;
+
+ case EXPR_CODE:
+ fprintf(f, "%d [label=\"code: %p (%d)\"];\n",
+ node, node->var1, node->used_count);
+ break;
+
+ case EXPR_LIST:
+ case EXPR_TUPLE:
+ case EXPR_APP:
+ if (node->kind == EXPR_LIST)
+ fprintf(f, "%d [label=\"List (%d)\"];\n",
+ node, node->used_count);
+ else if (node->kind == EXPR_TUPLE)
+ fprintf(f, "%d [label=\"Tuple (%d)\"];\n",
+ node, node->used_count);
+ else if (node->kind == EXPR_APP)
+ fprintf(f, "%d [label=\"App (%d)\"];\n",
+ node, node->used_count);
+
+ if (node->var1) {
+ print_node_to_file((struct node*) node->var1, f);
+ print_node_to_file((struct node*) node->var2, f);
+ fprintf(f, "%d -> %d;\n", node, node->var1);
+ fprintf(f, "%d -> %d;\n", node, node->var2);
+ }
+ break;
+ }
+
+ if (close) {
+ fprintf(f, "}");
+ fclose(f);
+ }
+}
+#endif