[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
- Previous message: [Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
bytecodes.h, 1.2, 1.3 dump.c, 1.4, 1.5 ins.c, 1.3,
1.4 interpret.c, 1.2, 1.3 ports.c, 1.2, 1.3 print.c, 1.2,
1.3 scheme.c, 1.9, 1.10
- Next message: [Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
scheme.c, 1.11, 1.12
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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 },
};
- Previous message: [Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
bytecodes.h, 1.2, 1.3 dump.c, 1.4, 1.5 ins.c, 1.3,
1.4 interpret.c, 1.2, 1.3 ports.c, 1.2, 1.3 print.c, 1.2,
1.3 scheme.c, 1.9, 1.10
- Next message: [Tinyos-commits]
CVS: tinyos-1.x/tos/lib/VM/languages/motlle/standalone
scheme.c, 1.11, 1.12
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Tinyos-commits
mailing list