r5373 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Mon Aug 3 18:08:29 CEST 2009


Author: werner
Date: 2009-08-03 18:08:29 +0200 (Mon, 03 Aug 2009)
New Revision: 5373

Modified:
   developers/werner/fped/TODO
   developers/werner/fped/expr.c
   developers/werner/fped/fpd.y
   developers/werner/fped/obj.c
   developers/werner/fped/obj.h
Log:
- answered some of the questions in TODO
- added detection of recursive variable evaluation
- added detection of accesses to inactice loops



Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO	2009-08-03 13:58:08 UTC (rev 5372)
+++ developers/werner/fped/TODO	2009-08-03 16:08:29 UTC (rev 5373)
@@ -13,7 +13,6 @@
 - add option to include/omit helper vecs and frames (display and postscript)
 
 Error detection:
-- detect recursive evaluation (through variables)
 - eliminate duplicate instances
 
 Style:
@@ -29,12 +28,20 @@
 
 Open decisions:
 - decide on table presentation (merge frame and vars into single entity ?)
-- Q: should loop be (start, last) or (start, iterations) ?
+- Q: should loop be (start, last) or (start, iterations) ? or start ... last ?
 - change vector circle color ? (also, highlight on hover ?)
-- Q: allow reassignment of vector names ? (no: would cause confusion in GUI)
+- Q: allow reassignment of vector names ?
+  A1: no: would cause confusion in GUI (vectors could become orphaned)
+  A2: yes. but we don't change the linkage.
 - Q: how do we handle stacks of objects ?
+  A: we don't but we make it easy to avoid them, by giving a good zoom,
+     flexible selection, and by disallowing stacks of identical objects in the
+     first place.
 - Q: add frame arguments ? (e.g., .frame pad(pin_num_offset) ...)
+  we can already approximate this by introducing an intermediate table that
+  sets up the arguments (provided that we don't consider vectors as well)
 - Q: should we make it a requirement to generate objects only once ?
+  A: almost certainly yes.
 
 Future directions:
 - future: consider using cairo instead of gdk

Modified: developers/werner/fped/expr.c
===================================================================
--- developers/werner/fped/expr.c	2009-08-03 13:58:08 UTC (rev 5372)
+++ developers/werner/fped/expr.c	2009-08-03 16:08:29 UTC (rev 5373)
@@ -112,19 +112,35 @@
 	const struct table *table;
 	const struct loop *loop;
 	const struct value *value;
-	const struct var *var;
+	struct var *var;
+	struct num res;
 
 	for (table = frame->tables; table; table = table->next) {
 		value = table->curr_row->values;
 		for (var = table->vars; var; var = var->next) {
-			if (var->name == name)
-				return eval_num(value->expr, frame);
+			if (var->name == name) {
+				if (var->visited) {
+					fail("recursive evaluation through "
+					    "\"%s\"", name);
+					return undef;
+				}
+				var->visited = 1;
+				res = eval_num(value->expr, frame);
+				var->visited = 0;
+				return res;
+				
+			}
 			value = value->next;
 		}
 	}
 	for (loop = frame->loops; loop; loop = loop->next)
-		if (loop->var.name == name)
+		if (loop->var.name == name) {
+			if (!loop->initialized) {
+				fail("uninitialized loop \"%s\"", name);
+				return undef;
+			}
 			return make_num(loop->curr_value);
+		}
 	if (frame->curr_parent)
 		return eval_var(frame->curr_parent, name);
 	return undef;

Modified: developers/werner/fped/fpd.y
===================================================================
--- developers/werner/fped/fpd.y	2009-08-03 13:58:08 UTC (rev 5372)
+++ developers/werner/fped/fpd.y	2009-08-03 16:08:29 UTC (rev 5373)
@@ -103,6 +103,7 @@
 	loop->to.next = NULL;
 	loop->next = NULL;
 	loop->active = 0;
+	loop->initialized = 0;
 	*next_loop = loop;
 	next_loop = &loop->next;
 }

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c	2009-08-03 13:58:08 UTC (rev 5372)
+++ developers/werner/fped/obj.c	2009-08-03 16:08:29 UTC (rev 5373)
@@ -13,6 +13,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 
 #include "util.h"
 #include "error.h"
@@ -182,6 +183,7 @@
 		fail_expr(loop->from.expr);
 		return 0;
 	}
+
 	to = eval_num(loop->to.expr, frame);
 	if (is_undef(to)) {
 		fail_expr(loop->to.expr);
@@ -192,20 +194,29 @@
 		fail_expr(loop->to.expr);
 		return 0;
 	}
+
+	assert(!loop->initialized);
+	loop->curr_value = from.n;
+	loop->initialized = 1;
+
 	n = 0;
-	for (loop->curr_value = from.n; loop->curr_value <= to.n;
-	    loop->curr_value += 1) {
+	for (; loop->curr_value <= to.n; loop->curr_value += 1) {
 		if (n >= MAX_ITERATIONS) {
 			fail("%s: too many iterations (%d)", loop->var.name,
 			    MAX_ITERATIONS);
-			return 0;
+			goto fail;
 		}
 		if (!run_loops(frame, loop->next, base,
 		    active && loop->active == n))
-			return 0;
+			goto fail;
 		n++;
 	}
+	loop->initialized = 0;
 	return 1;
+
+fail:
+	loop->initialized = 0;
+	return 0;
 }
 
 

Modified: developers/werner/fped/obj.h
===================================================================
--- developers/werner/fped/obj.h	2009-08-03 13:58:08 UTC (rev 5372)
+++ developers/werner/fped/obj.h	2009-08-03 16:08:29 UTC (rev 5373)
@@ -29,6 +29,9 @@
 
 	/* for the GUI */
 	GtkWidget *widget;
+
+	/* for evaluation */
+	int visited;
 };
 
 struct value {
@@ -73,6 +76,9 @@
 
 	/* GUI use */
 	int active;	/* n-th iteration is active, 0 based */
+
+	/* for evaluation */
+	int initialized;
 };
 
 struct vec {




More information about the commitlog mailing list