[Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
scheme.c, 1.11, 1.12
David Gay
idgay at users.sourceforge.net
Fri Nov 18 12:27:49 PST 2005
Update of /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16289
Modified Files:
scheme.c
Log Message:
optimise and, or in conditions
Index: scheme.c
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone/scheme.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** scheme.c 18 Nov 2005 19:35:10 -0000 1.11
--- scheme.c 18 Nov 2005 20:27:47 -0000 1.12
***************
*** 184,197 ****
label slab, gencode scode, void *sdata,
label flab, gencode fcode, void *fdata,
! fncode fn)
{
! int builtin = builtins[is_builtin_call(condition, fn)].builtin;
! switch (builtin)
{
! case b_not:
! if (preservetrue)
! break;
/* Just swap conclusions */
sgen_condition_mgc(l, nth(condition, 2), FALSE,
--- 184,230 ----
label slab, gencode scode, void *sdata,
label flab, gencode fcode, void *fdata,
! fncode fn);
!
! struct andordata
{
! label lab, slab, flab;
! struct list *args;
! bool and;
! bool preservetrue;
! };
! static void sgen_condition_andor_mgc(location l, void *_data, fncode fn)
! {
! struct andordata *data = _data;
!
! if (data->args->cdr) /* not last clause */
{
! struct list *clause = data->args->car;
!
! data->args = data->args->cdr;
!
! if (data->lab)
! set_label(data->lab, fn);
! data->lab = new_label(fn);
! if (data->and)
! sgen_condition_mgc(l, clause, FALSE,
! data->lab, sgen_condition_andor_mgc, data,
! data->flab, NULL, NULL, fn);
! else /* or */
! sgen_condition_mgc(l, clause, data->preservetrue,
! data->slab, NULL, NULL,
! data->lab, sgen_condition_andor_mgc, data, fn);
! }
! }
+ void sgen_condition_mgc(location l, value condition, bool preservetrue,
+ label slab, gencode scode, void *sdata,
+ label flab, gencode fcode, void *fdata,
+ fncode fn)
+ {
+ repeat:
+ if (builtins[is_builtin_call(condition, fn)].builtin == b_not &&
+ !preservetrue)
+ {
/* Just swap conclusions */
sgen_condition_mgc(l, nth(condition, 2), FALSE,
***************
*** 200,203 ****
--- 233,261 ----
}
+ /* check for non-degenerate and, or */
+ if (list_length(condition) >= 2)
+ {
+ struct list *condlist = condition;
+ bool is_or = is_keyword(condlist->car, "or");
+ bool is_and = is_keyword(condlist->car, "and");
+
+ if (is_or || is_and)
+ {
+ struct andordata data;
+
+ data.lab = NULL;
+ data.slab = slab;
+ data.flab = flab;
+ data.args = condlist->cdr;
+ data.and = is_and;
+ data.preservetrue = preservetrue;
+ GCPRO1(data.args);
+ sgen_condition_andor_mgc(l, &data, fn);
+ GCPOP(1);
+ condition = data.args->car;
+ goto repeat;
+ }
+ }
+
/* Default behaviour */
scheme_compile_mgc(l, condition, FALSE, fn);
More information about the Tinyos-commits
mailing list