[Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
mudlle.h, 1.4, 1.5 scheme.c, 1.12, 1.13
David Gay
idgay at users.sourceforge.net
Fri Nov 18 14:28:32 PST 2005
Update of /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10421
Modified Files:
mudlle.h scheme.c
Log Message:
case
depth fixes
Index: mudlle.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone/mudlle.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** mudlle.h 19 May 2005 17:23:48 -0000 1.4
--- mudlle.h 18 Nov 2005 22:28:30 -0000 1.5
***************
*** 87,90 ****
--- 87,92 ----
#endif
+ #define undefined_value makeint(42)
+
#ifdef MDBG
#define MDBGLEDS(x) motlle_req_leds(led_ ## x)
Index: scheme.c
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/standalone/scheme.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** scheme.c 18 Nov 2005 20:27:47 -0000 1.12
--- scheme.c 18 Nov 2005 22:28:30 -0000 1.13
***************
*** 16,22 ****
#include <string.h>
! static void ins_undefined(fncode fn)
{
! ins_constant(makeint(42), fn);
}
--- 16,37 ----
#include <string.h>
! static void ins_undefined(bool discard, fncode fn)
{
! if (!discard)
! ins_constant(undefined_value, fn);
! }
!
! static void terminate(label lab, bool discard, fncode fn)
! {
! branch(OPmba3, lab, fn);
! if (!discard)
! adjust_depth(-1, fn);
! }
!
! static void entry_with_data(label lab, bool discard, fncode fn)
! {
! set_label(lab, fn);
! if (!discard)
! adjust_depth(1, fn);
}
***************
*** 54,60 ****
}
static vlist sym2vlist(block_t region, value sym)
{
! return new_vlist(region, sym2str(region, sym), stype_any, NULL, NULL);
}
--- 69,80 ----
}
+ static vlist str2vlist(block_t region, const char *str)
+ {
+ return new_vlist(region, str, stype_any, NULL, NULL);
+ }
+
static vlist sym2vlist(block_t region, value sym)
{
! return str2vlist(region, sym2str(region, sym));
}
***************
*** 290,296 ****
set_label(data->slab, fn);
scheme_compile_mgc(l, data->success, data->discard, fn);
! branch(OPmba3, data->endlab, fn);
! if (!data->discard)
! adjust_depth(-1, fn);
}
--- 310,314 ----
set_label(data->slab, fn);
scheme_compile_mgc(l, data->success, data->discard, fn);
! terminate(data->endlab, data->discard, fn);
}
***************
*** 301,307 ****
set_label(data->flab, fn);
scheme_compile_mgc(l, data->failure, data->discard, fn);
! branch(OPmba3, data->endlab, fn);
! if (!data->discard)
! adjust_depth(-1, fn);
}
--- 319,323 ----
set_label(data->flab, fn);
scheme_compile_mgc(l, data->failure, data->discard, fn);
! terminate(data->endlab, data->discard, fn);
}
***************
*** 321,328 ****
ifdata.slab, ifs_code_mgc, &ifdata,
ifdata.flab, iff_code_mgc, &ifdata, fn);
- set_label(ifdata.endlab, fn);
- if (!discard)
- adjust_depth(1, fn);
GCPOP(2);
}
--- 337,342 ----
ifdata.slab, ifs_code_mgc, &ifdata,
ifdata.flab, iff_code_mgc, &ifdata, fn);
GCPOP(2);
+ entry_with_data(ifdata.endlab, discard, fn);
}
***************
*** 493,497 ****
sgen_if_mgc(l, cond, true, args->car, discard, fn);
else
! sgen_if_mgc(l, cond, true, makeint(42), discard, fn);
}
--- 507,511 ----
sgen_if_mgc(l, cond, true, args->car, discard, fn);
else
! sgen_if_mgc(l, cond, true, undefined_value, discard, fn);
}
***************
*** 751,757 ****
static void exit_logical(struct logicaldata *data, fncode fn)
{
! branch(OPmba3, data->endlab, fn);
! if (!data->discard)
! adjust_depth(-1, fn);
}
--- 765,769 ----
static void exit_logical(struct logicaldata *data, fncode fn)
{
! terminate(data->endlab, data->discard, fn);
}
***************
*** 772,777 ****
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);
--- 784,788 ----
struct logicaldata *data = _data;
! entry_with_data(data->truelab, FALSE, fn);
compile_call_mgc(l, nth(data->args->car, 3), 1, data->discard, fn);
exit_logical(data, fn);
***************
*** 801,805 ****
if (!data->args)
{
! scheme_compile_mgc(l, makeint(42), data->discard, fn);
exit_logical(data, fn);
}
--- 812,816 ----
if (!data->args)
{
! ins_undefined(data->discard, fn);
exit_logical(data, fn);
}
***************
*** 844,848 ****
continue_cond_mgc(l, &logicaldata, fn);
GCPOP(1);
! set_label(logicaldata.endlab, fn);
}
--- 855,859 ----
continue_cond_mgc(l, &logicaldata, fn);
GCPOP(1);
! entry_with_data(logicaldata.endlab, discard, fn);
}
***************
*** 938,944 ****
continue_or_mgc(l, &logicaldata, fn);
GCPOP(1);
! set_label(logicaldata.endlab, fn);
}
static struct {
--- 949,1016 ----
continue_or_mgc(l, &logicaldata, fn);
GCPOP(1);
! entry_with_data(logicaldata.endlab, discard, fn);
}
+ #define CASEVARNAME ".case."
+ static void compile_case_mgc(location l, struct list *args, bool discard, fncode fn)
+ {
+ label nextclause = NULL;
+ label done = new_label(fn);
+
+ env_block_push(NULL);
+ env_declare(str2vlist(fnmemory(fn), CASEVARNAME));
+ GCPRO1(args);
+ scheme_compile_mgc(l, args->car, FALSE, fn);
+ sgen_assign_mgc(l, CASEVARNAME, TRUE, fn);
+
+ while (args->cdr)
+ {
+ struct list *clause;
+
+ if (nextclause)
+ set_label(nextclause, fn);
+ nextclause = new_label(fn);
+
+ args = args->cdr;
+ clause = args->car;
+ if (list_length(clause) < 2)
+ log_error(l, "invalid case clause");
+ else if (is_keyword(clause->car, "else"))
+ {
+ if (args->cdr)
+ log_error(l, "else clause must be last in case");
+ compile_begin_mgc(l, clause->cdr, discard, fn);
+ terminate(done, discard, fn);
+ }
+ else if (list_length(clause->car) < 0)
+ log_error(l, "invalid case datums");
+ else if (clause->car) /* empty datums is ok, but should be ignored */
+ {
+ struct list *datums;
+ label match = new_label(fn);
+
+ GCPRO1(datums);
+ for (datums = clause->car; datums; datums = datums->cdr)
+ {
+ scompile_recall(l, CASEVARNAME, fn);
+ ins_constant(datums->car, fn);
+ ins0(OPmeq, fn);
+ if (datums->cdr)
+ branch(OPmbt3, match, fn);
+ else
+ branch(OPmbf3, nextclause, fn);
+ }
+ GCPOP(1);
+ set_label(match, fn);
+ compile_begin_mgc(l, clause->cdr, discard, fn);
+ terminate(done, discard, fn);
+ }
+ }
+ GCPOP(1);
+ set_label(nextclause, fn);
+ ins_undefined(discard, fn);
+ set_label(done, fn);
+ env_block_pop();
+ }
static struct {
***************
*** 961,964 ****
--- 1033,1037 ----
{ "and", 0, compile_and_mgc },
{ "or", 0, compile_or_mgc },
+ { "case", -2, compile_case_mgc },
};
More information about the Tinyos-commits
mailing list