[CM] fn defined in C returns to wrong place

Gregg Reynolds dev at mobileink.com
Fri Aug 26 09:31:57 PDT 2022


On Fri, Aug 26, 2022 at 9:28 AM <bil at ccrma.stanford.edu> wrote:

> *error-hook* is only called if there is no catch; it resets the s7 stack
> when it returns, so you're back at the top level.  My first thought is
> that you need a catch in convert.scm where you do the s7_call.  Maybe
> I have the wrong model of what's happening.
>
> The s7 stack can be viewed via (*s7* 'stack); it is independent of the
> C stack (I assume that's what you're seeing with backtrace).  I don't
> think the GC is the culprit.  s7_show_stack can give an abbreviated
> view of the s7 stack from C (you'll need a declaration -- it's not
> in s7.h, but it is accessible globally -- I thought of it as a
> debugging aid -- (*s7* 'stack) is sometimes very verbose).
>

Looks like the s7 stack is the issue. I got rid of the error-hook.  Now my
'return' statement hangs.  Here is the code, details omitted:

for each dune file (composed of "stanza" sexps):

    while(true) {
        s7_pointer stanza = s7_read(s7, port);
        s7_show_stack(s7);
        errmsg = s7_get_output_string(s7, s7_current_error_port(s7));
        if ((errmsg) && (*errmsg)) {
            if (strstr(errmsg,
                       ";read-error (\"unexpected close paren:") != NULL) {
               ... fix problem, reading entire dune file ...
               break;
            }
        }
        if (stanza == s7_eof_object(s7)) {
            break;
        }
        ... do stuff with stanza ...
    }

If the file has no errors, the stack looks like this:

stack:
  let*1
  let*1
  eval_done
  gc_protect

But when we try to s7_read a stanza with the dot syntax error, the stack is:

reading stanza
stack:
  read_list
  read_list
  eval_done
  barrier
  let*1
  let*1
  eval_done
  gc_protect

I can still fix the error by reading the file into a string, fixing it, and
then s7_read the string-port. But now my return hangs.

Is there any way to unwind the stack past "barrier"?  Or is there a way to
call s7_read with a catch that will allow me to recover in situ?

Thanks,

Gregg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cm-mail.stanford.edu/pipermail/cmdist/attachments/20220826/19b66e6e/attachment-0001.html>


More information about the Cmdist mailing list