[Tinyos-commits] CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone scheme.c, 1.10, 1.11

David Gay idgay at users.sourceforge.net
Fri Nov 18 11:35:13 PST 2005


Update of /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2557

Modified Files:
	scheme.c 
Log Message:
or, and


Index: scheme.c
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone/scheme.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** scheme.c	18 Nov 2005 18:47:41 -0000	1.10
--- scheme.c	18 Nov 2005 19:35:10 -0000	1.11
***************
*** 685,698 ****
  }
  
! struct conddata {
!   location l;
    struct list *args;
!   label truelab, contlab, endlab;
    bool discard;
  };
  
! static void continue_cond_mgc(struct conddata *data, fncode fn);
! 
! static void exit_cond(struct conddata *data, fncode fn)
  {
    branch(OPmba3, data->endlab, fn);
--- 685,695 ----
  }
  
! struct logicaldata {
    struct list *args;
!   label truelab, falselab, endlab;
    bool discard;
  };
  
! static void exit_logical(struct logicaldata *data, fncode fn)
  {
    branch(OPmba3, data->endlab, fn);
***************
*** 701,722 ****
  }
  
  static void cond_clause_true_mgc(location l, void *_data, fncode fn)
  {
!   struct conddata *data = _data;
    struct list *first = data->args->car;
  
    set_label(data->truelab, fn);
!   compile_begin_mgc(data->l, first->cdr, data->discard, fn);
!   exit_cond(data, fn);
  }
  
  static void cond_clause_truecall_mgc(location l, void *_data, fncode fn)
  {
!   struct conddata *data = _data;
  
    set_label(data->truelab, fn);
    adjust_depth(1, fn);
!   compile_call_mgc(data->l, nth(data->args->car, 3), 1, data->discard, fn);
!   exit_cond(data, fn);
  }
  
--- 698,721 ----
  }
  
+ static void continue_cond_mgc(location l, struct logicaldata *data, fncode fn);
+ 
  static void cond_clause_true_mgc(location l, void *_data, fncode fn)
  {
!   struct logicaldata *data = _data;
    struct list *first = data->args->car;
  
    set_label(data->truelab, fn);
!   compile_begin_mgc(l, first->cdr, data->discard, fn);
!   exit_logical(data, fn);
  }
  
  static void cond_clause_truecall_mgc(location l, void *_data, fncode fn)
  {
!   struct logicaldata *data = _data;
  
    set_label(data->truelab, fn);
    adjust_depth(1, fn);
!   compile_call_mgc(l, nth(data->args->car, 3), 1, data->discard, fn);
!   exit_logical(data, fn);
  }
  
***************
*** 725,749 ****
    /* Copy the data as we're modifying args (there's no guarantee the
       true clauses won't be called after us) */
!   struct conddata *olddata = _data;
!   struct conddata newdata = *olddata;
  
!   set_label(olddata->contlab, fn);
    newdata.args = olddata->args->cdr;
    GCPRO1(newdata.args);
!   continue_cond_mgc(&newdata, fn);
    GCPOP(1);
  }
  
! static void continue_cond_mgc(struct conddata *data, fncode fn) 
  {
    int len;
  
    data->truelab = new_label(fn);
!   data->contlab = new_label(fn);
  
    if (!data->args)
      {
!       scheme_compile_mgc(data->l, makeint(42), data->discard, fn);
!       exit_cond(data, fn);
      }
    else if ((len = list_length(data->args->car)) >= 2)
--- 724,748 ----
    /* Copy the data as we're modifying args (there's no guarantee the
       true clauses won't be called after us) */
!   struct logicaldata *olddata = _data;
!   struct logicaldata newdata = *olddata;
  
!   set_label(olddata->falselab, fn);
    newdata.args = olddata->args->cdr;
    GCPRO1(newdata.args);
!   continue_cond_mgc(l, &newdata, fn);
    GCPOP(1);
  }
  
! static void continue_cond_mgc(location l, struct logicaldata *data, fncode fn) 
  {
    int len;
  
    data->truelab = new_label(fn);
!   data->falselab = new_label(fn);
  
    if (!data->args)
      {
!       scheme_compile_mgc(l, makeint(42), data->discard, fn);
!       exit_logical(data, fn);
      }
    else if ((len = list_length(data->args->car)) >= 2)
***************
*** 755,794 ****
  	{
  	  if (data->args->cdr)
! 	    log_error(data->l, "else clause must come last");
! 	  compile_begin_mgc(data->l, body, data->discard, fn);
! 	  exit_cond(data, fn);
  	}
        else if (is_keyword(body->car, "=>"))
  	{
  	  if (len != 3)
! 	    log_error(data->l, "invalid => clause in cond");
  	  else
! 	    sgen_condition_mgc(data->l, clause->car, TRUE,
  			       data->truelab, cond_clause_truecall_mgc, data,
! 			       data->contlab, cond_clause_cont_mgc, data, fn);
  	}
        else /* regular clause */
! 	sgen_condition_mgc(data->l, clause->car, FALSE,
  			   data->truelab, cond_clause_true_mgc, data,
! 			   data->contlab, cond_clause_cont_mgc, data, fn);
      }
    else
!     log_error(data->l, "invalid cond clause");
  }
  
  static void compile_cond_mgc(location l, struct list *args, bool discard, fncode fn)
  {
!   struct conddata conddata;
  
!   conddata.l = l;
!   conddata.endlab = new_label(fn);
!   conddata.args = args;
!   conddata.discard = discard;
!   GCPRO1(conddata.args);
!   continue_cond_mgc(&conddata, fn);
    GCPOP(1);
!   set_label(conddata.endlab, fn);
  }
  
  static struct {
    const char *keyword;
--- 754,887 ----
  	{
  	  if (data->args->cdr)
! 	    log_error(l, "else clause must come last");
! 	  compile_begin_mgc(l, body, data->discard, fn);
! 	  exit_logical(data, fn);
  	}
        else if (is_keyword(body->car, "=>"))
  	{
  	  if (len != 3)
! 	    log_error(l, "invalid => clause in cond");
  	  else
! 	    sgen_condition_mgc(l, clause->car, TRUE,
  			       data->truelab, cond_clause_truecall_mgc, data,
! 			       data->falselab, cond_clause_cont_mgc, data, fn);
  	}
        else /* regular clause */
! 	sgen_condition_mgc(l, clause->car, FALSE,
  			   data->truelab, cond_clause_true_mgc, data,
! 			   data->falselab, cond_clause_cont_mgc, data, fn);
      }
    else
!     log_error(l, "invalid cond clause");
  }
  
  static void compile_cond_mgc(location l, struct list *args, bool discard, fncode fn)
  {
!   struct logicaldata logicaldata;
  
!   logicaldata.endlab = new_label(fn);
!   logicaldata.args = args;
!   logicaldata.discard = discard;
!   GCPRO1(logicaldata.args);
!   continue_cond_mgc(l, &logicaldata, fn);
    GCPOP(1);
!   set_label(logicaldata.endlab, fn);
  }
  
+ static void continue_and_mgc(location l, void *_data, fncode fn) 
+ {
+   struct logicaldata *data = _data;
+ 
+   if (!data->args->cdr) /* last clause */
+     {
+       scheme_compile_mgc(l, data->args->car, data->discard, fn);
+       exit_logical(data, fn);
+     }
+   else
+     {
+       struct list *clause = data->args->car;
+ 
+       data->args = data->args->cdr;
+ 
+       if (data->truelab)
+ 	set_label(data->truelab, fn);
+       data->truelab = new_label(fn);
+       sgen_condition_mgc(l, clause, FALSE,
+ 			 data->truelab, continue_and_mgc, data,
+ 			 data->falselab, NULL, NULL, fn);
+     }
+ }
+ 
+ static void compile_and_mgc(location l, struct list *args, bool discard, fncode fn)
+ {
+   struct logicaldata logicaldata;
+ 
+   if (args == NULL)
+     {
+       if (!discard)
+ 	ins_constant(makebool(TRUE), fn);
+       return;
+     }
+ 
+   logicaldata.truelab = NULL;
+   logicaldata.falselab = new_label(fn);
+   logicaldata.endlab = new_label(fn);
+   logicaldata.args = args;
+   logicaldata.discard = discard;
+   GCPRO1(logicaldata.args);
+   continue_and_mgc(l, &logicaldata, fn);
+   GCPOP(1);
+   set_label(logicaldata.falselab, fn);
+   if (!discard)
+     ins_constant(makebool(FALSE), fn);
+   set_label(logicaldata.endlab, fn);
+ }
+ 
+ static void continue_or_mgc(location l, void *_data, fncode fn) 
+ {
+   struct logicaldata *data = _data;
+ 
+   if (!data->args->cdr) /* last clause */
+     {
+       scheme_compile_mgc(l, data->args->car, data->discard, fn);
+       exit_logical(data, fn);
+     }
+   else
+     {
+       struct list *clause = data->args->car;
+ 
+       data->args = data->args->cdr;
+ 
+       if (data->falselab)
+ 	set_label(data->falselab, fn);
+       data->falselab = new_label(fn);
+       sgen_condition_mgc(l, clause, !data->discard,
+ 			 data->endlab, NULL, NULL,
+ 			 data->falselab, continue_or_mgc, data, fn);
+     }
+ }
+ 
+ static void compile_or_mgc(location l, struct list *args, bool discard, fncode fn)
+ {
+   struct logicaldata logicaldata;
+ 
+   if (args == NULL)
+     {
+       if (!discard)
+ 	ins_constant(makebool(FALSE), fn);
+       return;
+     }
+ 
+   logicaldata.falselab = NULL;
+   logicaldata.endlab = new_label(fn);
+   logicaldata.args = args;
+   logicaldata.discard = discard;
+   GCPRO1(logicaldata.args);
+   continue_or_mgc(l, &logicaldata, fn);
+   GCPOP(1);
+   set_label(logicaldata.endlab, fn);
+ }
+ 
+ 
  static struct {
    const char *keyword;
***************
*** 808,811 ****
--- 901,906 ----
    { "do", -3, compile_do_mgc },
    { "cond", -1, compile_cond_mgc },
+   { "and", 0, compile_and_mgc },
+   { "or", 0, compile_or_mgc },
  };
  



More information about the Tinyos-commits mailing list