X-Git-Url: https://git.hcoop.net/bpt/guile.git/blobdiff_plain/e4eb0e39b4bbfa321fd30376ebdda32e931b60f7..37ae02ffa0d788f59c096cec7a3ac9744d87cf16:/libguile/continuations.c diff --git a/libguile/continuations.c b/libguile/continuations.c index 1d677610b..8dca62e2d 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,2000,2001,2004, 2006, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000,2001,2004, 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -161,12 +161,15 @@ scm_i_make_continuation (int *first, struct scm_vm *vp, SCM vm_cont) return make_continuation_trampoline (cont); } else - return SCM_UNDEFINED; + { + scm_gc_after_nonlocal_exit (); + return SCM_UNDEFINED; + } } #undef FUNC_NAME -SCM -scm_i_continuation_to_frame (SCM continuation) +int +scm_i_continuation_to_frame (SCM continuation, struct scm_frame *frame) { SCM contregs; scm_t_contregs *cont; @@ -177,13 +180,16 @@ scm_i_continuation_to_frame (SCM continuation) if (scm_is_true (cont->vm_cont)) { struct scm_vm_cont *data = SCM_VM_CONT_DATA (cont->vm_cont); - return scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, data, - (data->fp + data->reloc) - data->stack_base, - (data->sp + data->reloc) - data->stack_base, - data->ra); + + frame->stack_holder = data; + frame->fp_offset = (data->fp + data->reloc) - data->stack_base; + frame->sp_offset = (data->sp + data->reloc) - data->stack_base; + frame->ip = data->ra; + + return 1; } else - return SCM_BOOL_F; + return 0; } struct scm_vm *