Bill Allombert on Thu, 24 Nov 2016 10:16:31 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: closure_evalvoid


On Thu, Nov 24, 2016 at 03:41:57AM -0500, Charles Greathouse wrote:
> I'm having trouble using closure_evalvoid. Here is a snippet of code which
> tries to run a closure on factor(n) as n ranges from a to b. I get
> 
> ***   bug in closure_eval, stack underflow, please report.

Note that the stack here is the my() variable stack, not the PARI stack.

> /* a and b must be t_INTs, code must be a t_CLOSURE. */
> static int
> forfactoredss(long a, long b, GEN code)
> {
>   pari_sp av = avma;
>   int br = 0;
>   GEN f = gnil;
>   long n;
>   push_lex(f,code);
>   for (n = a; n <= b; n++) {
>     f = Z_factor(stoi(n));
>     set_lex(-1, f);
>     closure_evalvoid(code);
>     if (loop_break()) {
>       pop_lex(1);
>       br = 1;
>       break;
>     }
>     if (get_lex(-1) != f)
>       pari_err(e_MISC, "factors read-only: was changed to %Ps",
> get_lex(-1));
>   }
>   pop_lex(1);
>   avma = av;
>   return br;
> }

If loop_break() return true, then pop_lex(1) is called twice.
SInce there is one push and two pop the variable stack underflows.

Cheers,
Bill