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