[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