]> git.pld-linux.org Git - packages/parigp.git/blob - pari-Math-Pari-diff.patch
- try with pari 2.13.1
[packages/parigp.git] / pari-Math-Pari-diff.patch
1 --- pari-2.13.1/src/language/anal.c.orig        2020-10-26 13:43:04.000000000 +0100
2 +++ pari-2.13.1/src/language/anal.c     2021-06-26 11:47:46.571531691 +0200
3 @@ -159,6 +159,10 @@ findentry(const char *s, long len, entre
4        if (!strncmp(t, s, len) && !t[len]) return ep;
5      }
6    /* not found */
7 +  if (foreignAutoload) {       /* Try to autoload. */
8 +    ep = foreignAutoload(s,len);
9 +    if(ep) return ep;
10 +  }  /* not found */
11    if (insert) { ep = initep(s,len); insertep(ep, T, hash); }
12    return ep;
13  }
14 @@ -214,7 +218,7 @@ gp_read_str_prec(const char *s, long pre
15  /* valid return type */
16  static int
17  isreturn(char c)
18 -{ return c == 'l' || c == 'v' || c == 'i' || c == 'm' || c == 'u'; }
19 +{ return c == 'l' || c == 'v' || c == 'i' || c == 'm' || c == 'u' || c == 'x'; }
20  
21  /* if is known that 2 commas follow s; base-10 signed integer followed
22   * by comma? */
23 @@ -241,7 +245,7 @@ check_proto(const char *code)
24  {
25    long arity = 0;
26    const char *s = code;
27 -  if (isreturn(*s)) s++;
28 +  if (isreturn(*s)) { if(*s == 'x') { arity++; } s++; }
29    while (*s && *s != '\n') switch (*s++)
30    {
31      case '&':
32 @@ -329,7 +333,11 @@ install(void *f, const char *name, const
33    {
34      if (ep->valence != EpINSTALL)
35        pari_err(e_MISC,"[install] identifier '%s' already in use", name);
36 -    pari_warn(warner, "[install] updating '%s' prototype; module not reloaded", name);
37 +    if (foreignFuncFree && ep->code && (*ep->code == 'x'))
38 +      (*foreignFuncFree)(ep); /* function created by foreign interpreter */
39 +    else
40 +      pari_warn(warner, "[install] updating '%s' prototype; module not reloaded", name);
41 +
42      if (ep->code) pari_free((void*)ep->code);
43    }
44    else
45 diff -pru pari-2.9.0-ini/src/language/anal.h pari-2.9.0/src/language/anal.h
46 --- pari-2.9.0-ini/src/language/anal.h  2016-10-01 04:23:18.000000000 -0700
47 +++ pari-2.9.0/src/language/anal.h      2019-03-06 02:48:18.136608900 -0800
48 @@ -34,6 +34,9 @@ void   pari_fill_hashtable(entree **tabl
49  void compile_err(const char *msg, const char *str);
50  void compile_varerr(const char *str);
51  
52 +extern entree * (*foreignAutoload)(const char*, long len);
53 +extern void (*foreignFuncFree)(entree *);
54 +
55  #ifdef STACK_CHECK
56  extern THREAD void *PARI_stack_limit;
57  #endif
58 diff -pru pari-2.9.0-ini/src/language/compile.c pari-2.9.0/src/language/compile.c
59 --- pari-2.9.0-ini/src/language/compile.c       2016-10-05 02:43:38.000000000 -0700
60 +++ pari-2.9.0/src/language/compile.c   2019-03-06 02:48:18.027408700 -0800
61 @@ -519,9 +519,10 @@ detag(long n)
62  
63  /* return type for GP functions */
64  static op_code
65 -get_ret_type(const char **p, long arity, Gtype *t, long *flag)
66 +get_ret_type(const char **p, long arity, Gtype *t, long *flag, long *is_external)
67  {
68 -  *flag = 0;
69 +  *flag = *is_external = 0;
70 +  if (**p == 'x') { (*p)++; *is_external = 1; }
71    if (**p == 'v') { (*p)++; *t=Gvoid; return OCcallvoid; }
72    else if (**p == 'i') { (*p)++; *t=Gsmall;  return OCcallint; }
73    else if (**p == 'l') { (*p)++; *t=Gsmall;  return OCcalllong; }
74 @@ -1203,7 +1204,7 @@ compilefunc(entree *ep, long n, int mode
75    long j;
76    long x=tree[n].x, y=tree[n].y;
77    op_code ret_op;
78 -  long ret_flag;
79 +  long ret_flag, is_external;
80    Gtype ret_typ;
81    char const *p,*q;
82    char c;
83 @@ -1337,8 +1337,9 @@ compilefunc(entree *ep, long n, int mode
84    if (!ep->value)
85      compile_err("unknown function",tree[n].str);
86    nbopcodes = s_opcode.n;
87 -  ret_op = get_ret_type(&p, ep->arity, &ret_typ, &ret_flag);
88 +  ret_op = get_ret_type(&p, ep->arity, &ret_typ, &ret_flag, &is_external);
89    j=1;
90 +  if (is_external) op_push(OCpushlong,(long)ep,n);     /* as in PPauto */
91    if (*p)
92    {
93      q=p;
94 @@ -1661,8 +1663,8 @@ genclosure(entree *ep, const char *loc,
95    long arity=0, maskarg=0, maskarg0=0, stop=0, dovararg=0;
96    PPproto mod;
97    Gtype ret_typ;
98 -  long ret_flag;
99 -  op_code ret_op=get_ret_type(&code,ep->arity,&ret_typ,&ret_flag);
100 +  long ret_flag, is_external;
101 +  op_code ret_op=get_ret_type(&code,ep->arity,&ret_typ,&ret_flag,&is_external);
102    p=code;
103    while ((mod=parseproto(&p,&c,NULL))!=PPend)
104    {
105 @@ -1705,6 +1707,7 @@ genclosure(entree *ep, const char *loc,
106    if (maskarg)  op_push_loc(OCcheckargs,maskarg,loc);
107    if (maskarg0) op_push_loc(OCcheckargs0,maskarg0,loc);
108    p=code;
109 +  if (is_external) op_push_loc(OCpushlong,(long)ep,loc);       /* as in PPauto */
110    while ((mod=parseproto(&p,&c,NULL))!=PPend)
111    {
112      switch(mod)
113 @@ -2292,14 +2292,14 @@ optimizefunc(entree *ep, long n)
114    const char *p;
115    char c;
116    GEN arg = listtogen(y,Flistarg);
117 -  long nb=lg(arg)-1, ret_flag;
118 +  long nb=lg(arg)-1, ret_flag, is_external /* ignored */;
119    if (is_func_named(ep,"if") && nb>=4)
120      ep=is_entry("_multi_if");
121    p = ep->code;
122    if (!p)
123      fl=0;
124    else
125 -    (void) get_ret_type(&p, 2, &t, &ret_flag);
126 +    (void) get_ret_type(&p, 2, &t, &ret_flag, &is_external);
127    if (p && *p)
128    {
129      j=1;
130 --- pari-2.13.1/src/language/eval.c.orig        2020-10-26 13:43:04.000000000 +0100
131 +++ pari-2.13.1/src/language/eval.c     2021-06-26 11:49:53.724176179 +0200
132 @@ -139,6 +139,9 @@ pop_val(entree *ep)
133  void
134  freeep(entree *ep)
135  {
136 +  if (foreignFuncFree && ep->code && (*ep->code == 'x'))
137 +    (*foreignFuncFree)(ep); /* function created by foreign interpreter */
138 +
139    if (EpSTATIC(ep)) return; /* gp function loaded at init time */
140    if (ep->help) {pari_free((void*)ep->help); ep->help=NULL;}
141    if (ep->code) {pari_free((void*)ep->code); ep->code=NULL;}
142 @@ -1672,7 +1675,8 @@ evalstate_reset(void)
143    reset_break();
144    compilestate_reset();
145    parsestate_reset();
146 -  set_avma(pari_mainstack->top);
147 +  if (!cb_exception_resets_avma)
148 +    set_avma(pari_mainstack->top);
149  }
150  
151  void
152 diff -pru pari-2.9.0-ini/src/language/init.c pari-2.9.0/src/language/init.c
153 --- pari-2.9.0-ini/src/language/init.c  2016-10-25 01:15:32.000000000 -0700
154 +++ pari-2.9.0/src/language/init.c      2019-03-06 03:00:07.190054300 -0800
155 @@ -113,6 +113,9 @@ static pari_stack s_MODULES;
156  const long functions_tblsz = 135; /* size of functions_hash */
157  entree **functions_hash, **defaults_hash;
158  
159 +entree* (*foreignAutoload)(const char*, long len); /* Autoloader         */
160 +void (*foreignFuncFree)(entree *);    /* How to free external entree.    */
161 +
162  char *(*cb_pari_fgets_interactive)(char *s, int n, FILE *f);
163  int (*cb_pari_get_line_interactive)(const char*, const char*, filtre_t *F);
164  void (*cb_pari_quit)(long);
165 @@ -130,6 +133,9 @@ void (*cb_pari_start_output)();
166  
167  const char * pari_library_path = NULL;
168  
169 +int cb_exception_resets_avma = 0;
170 +int cb_exception_flushes_err = 0;
171 +
172  static THREAD GEN global_err_data;
173  THREAD jmp_buf *iferr_env;
174  const long CATCH_ALL = -1;
175 @@ -1141,7 +1147,8 @@ pari_sigint(const char *time_s)
176    out_puts(pariErr, "user interrupt after ");
177    out_puts(pariErr, time_s);
178    out_term_color(pariErr, c_NONE);
179 -  pariErr->flush();
180 +  if (!cb_exception_flushes_err)
181 +    pariErr->flush();
182    if (cb_pari_handle_exception)
183      recover = cb_pari_handle_exception(-1);
184    if (!recover && !block)
185 @@ -1505,7 +1505,9 @@ pari_err_display(GEN err)
186      pari_free(s);
187    }
188    out_term_color(pariErr, c_NONE);
189 -  pariErr->flush(); return 0;
190 +  if (!cb_exception_flushes_err)
191 +    pariErr->flush();
192 +  return 0;
193  }
194  
195  void
196 --- pari-2.9.0/src/headers/paricom.h-pre        2011-05-30 02:28:34.000000000 -0700
197 +++ pari-2.9.0/src/headers/paricom.h    2018-09-16 00:04:16.527215600 -0700
198 @@ -92,6 +92,10 @@ extern void (*cb_pari_start_output)(void
199  extern const char *pari_library_path;
200  extern THREAD long *varpriority;
201  
202 +#define CB_EXCEPTION_FLAGS 1
203 +extern int cb_exception_resets_avma;
204 +extern int cb_exception_flushes_err;
205 +
206  /* pari_init_opts */
207  enum {
208    INIT_JMPm = 1,
This page took 0.04143 seconds and 3 git commands to generate.