projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/lisp: Deal with memory compation in the middle of operations
[fw/altos]
/
src
/
lisp
/
ao_lisp_lambda.c
diff --git
a/src/lisp/ao_lisp_lambda.c
b/src/lisp/ao_lisp_lambda.c
index cc5af4bce23bd860b55203ad27bf99d568c6a72d..8eafb18794baf48cbf5e2f20a3cf7f9f981d9ac0 100644
(file)
--- a/
src/lisp/ao_lisp_lambda.c
+++ b/
src/lisp/ao_lisp_lambda.c
@@
-133,18
+133,17
@@
ao_lisp_macro(struct ao_lisp_cons *cons)
}
ao_poly
}
ao_poly
-ao_lisp_lambda_eval(struct ao_lisp_lambda *lambda,
- struct ao_lisp_cons *cons)
+ao_lisp_lambda_eval(void)
{
{
- struct ao_lisp_cons *code;
- struct ao_lisp_cons *args;
+ struct ao_lisp_lambda *lambda = ao_lisp_poly_lambda(ao_lisp_v);
+ struct ao_lisp_cons *cons = ao_lisp_poly_cons(ao_lisp_stack->values);
+ struct ao_lisp_cons *code = ao_lisp_poly_cons(lambda->code);
+ struct ao_lisp_cons *args = ao_lisp_poly_cons(ao_lisp_arg(code, 0));
struct ao_lisp_frame *next_frame;
int args_wanted;
int args_provided;
struct ao_lisp_frame *next_frame;
int args_wanted;
int args_provided;
- code = ao_lisp_poly_cons(lambda->code);
DBGI("lambda "); DBG_POLY(ao_lisp_lambda_poly(lambda)); DBG("\n");
DBGI("lambda "); DBG_POLY(ao_lisp_lambda_poly(lambda)); DBG("\n");
- args = ao_lisp_poly_cons(ao_lisp_arg(code, 0));
args_wanted = ao_lisp_cons_length(args);
args_wanted = ao_lisp_cons_length(args);
@@
-156,7
+155,15
@@
ao_lisp_lambda_eval(struct ao_lisp_lambda *lambda,
args_provided = 1;
if (args_wanted != args_provided)
return ao_lisp_error(AO_LISP_INVALID, "need %d args, not %d", args_wanted, args_provided);
args_provided = 1;
if (args_wanted != args_provided)
return ao_lisp_error(AO_LISP_INVALID, "need %d args, not %d", args_wanted, args_provided);
+
next_frame = ao_lisp_frame_new(args_wanted);
next_frame = ao_lisp_frame_new(args_wanted);
+
+ /* Re-fetch all of the values in case something moved */
+ lambda = ao_lisp_poly_lambda(ao_lisp_v);
+ cons = ao_lisp_poly_cons(ao_lisp_stack->values);
+ code = ao_lisp_poly_cons(lambda->code);
+ args = ao_lisp_poly_cons(ao_lisp_arg(code, 0));
+
switch (lambda->args) {
case AO_LISP_FUNC_LAMBDA: {
int f;
switch (lambda->args) {
case AO_LISP_FUNC_LAMBDA: {
int f;