diff options
| author | Keith Packard <keithp@keithp.com> | 2016-11-10 23:29:21 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-02-20 11:16:50 -0800 | 
| commit | 7da6bfc195fad97e3afc576c609897c131fd4d8c (patch) | |
| tree | 14bd1b100b490bff43794767b70160545c76557b /src/lisp/ao_lisp_lambda.c | |
| parent | 137898e3431d887e75b09d8c1ce57297a1558e43 (diff) | |
altos/lisp: Deal with memory compation in the middle of operations
Handle memory compaction in places where we've got pointers into the
heap across an allocation operation. Either re-compute the values from
managed global references or add new roots across the allocation.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_lambda.c')
| -rw-r--r-- | src/lisp/ao_lisp_lambda.c | 19 | 
1 files changed, 13 insertions, 6 deletions
| diff --git a/src/lisp/ao_lisp_lambda.c b/src/lisp/ao_lisp_lambda.c index cc5af4bc..8eafb187 100644 --- 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_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; -	code = ao_lisp_poly_cons(lambda->code);  	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); @@ -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); +  	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; | 
