diff options
author | Keith Packard <keithp@keithp.com> | 2017-12-03 19:52:11 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2017-12-03 19:52:11 -0800 |
commit | a1d013ab8cc508d4e17ae8876bc5465d1a2dfc1e (patch) | |
tree | 25cb082d6cf9032cf908b4901eeff68314417acb | |
parent | 32ab76c3049b913283caafbaef873754d76dc9d4 (diff) |
altos/lisp: Fix stash usage across frame allocation
Must un-stash before allocation failure check.
Use frame_stash instead of poly_stash for frames.
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | src/lisp/ao_lisp_frame.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/lisp/ao_lisp_frame.c b/src/lisp/ao_lisp_frame.c index 13a68b38..c285527e 100644 --- a/src/lisp/ao_lisp_frame.c +++ b/src/lisp/ao_lisp_frame.c @@ -225,9 +225,11 @@ ao_lisp_frame_new(int num) frame->num = 0; frame->prev = AO_LISP_NIL; frame->vals = AO_LISP_NIL; - ao_lisp_poly_stash(0, ao_lisp_frame_poly(frame)); + ao_lisp_frame_stash(0, frame); vals = ao_lisp_frame_vals_new(num); - frame = ao_lisp_poly_frame(ao_lisp_poly_fetch(0)); + frame = ao_lisp_frame_fetch(0); + if (!vals) + return NULL; frame->vals = ao_lisp_frame_vals_poly(vals); frame->num = num; } @@ -271,9 +273,9 @@ ao_lisp_frame_realloc(struct ao_lisp_frame *frame, int new_num) return frame; ao_lisp_frame_stash(0, frame); new_vals = ao_lisp_frame_vals_new(new_num); + frame = ao_lisp_frame_fetch(0); if (!new_vals) return NULL; - frame = ao_lisp_frame_fetch(0); vals = ao_lisp_poly_frame_vals(frame->vals); copy = new_num; if (copy > frame->num) @@ -303,15 +305,14 @@ ao_lisp_frame_add(struct ao_lisp_frame *frame, ao_poly atom, ao_poly val) ao_poly *ref = frame ? ao_lisp_frame_ref(frame, atom) : NULL; if (!ref) { - int f; + int f = frame->num; ao_lisp_poly_stash(0, atom); ao_lisp_poly_stash(1, val); - f = frame->num; frame = ao_lisp_frame_realloc(frame, f + 1); + val = ao_lisp_poly_fetch(1); + atom = ao_lisp_poly_fetch(0); if (!frame) return AO_LISP_NIL; - atom = ao_lisp_poly_fetch(0); - val = ao_lisp_poly_fetch(1); ao_lisp_frame_bind(frame, frame->num - 1, atom, val); } else *ref = val; |