Karim BELABAS on Mon, 4 Oct 1999 13:57:36 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: type() bug in gp |
[Followup to my previous post:] The type() function has always been "unsafe" in the sense that it let you create meaningless objects that could completely corrupt a session. This patch adds consistency checks to prevent this. It could be extended for genuine type conversions (as done by Pol(), Vec(), Str(), ...). The idea looks nice but I don't think it's worth the effort. Karim. Index: src/gp/highlvl.c =================================================================== RCS file: /home/megrez/cvsroot/pari/src/gp/highlvl.c,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 highlvl.c *** src/gp/highlvl.c 1999/09/16 13:47:42 1.1.1.1 --- src/gp/highlvl.c 1999/10/04 11:25:52 *************** *** 163,175 **** GEN type0(GEN x, char *st) { if (! *st) { char *s = type_name(typ(x)); return strtoGENstr(s, 0); } ! x = gcopy(x); settyp(x,get_type_num(st)); ! return x; } entree functions_highlevel[]={ --- 163,204 ---- GEN type0(GEN x, char *st) { + long t, tx; if (! *st) { char *s = type_name(typ(x)); return strtoGENstr(s, 0); } ! tx = typ(x); ! t = get_type_num(st); ! ! if (is_frac_t(tx)) ! { ! if (!is_frac_t(t) && !is_rfrac_t(t)) ! err(typeer, "type"); ! x = gcopy(x); ! } ! else if (is_rfrac_t(tx)) ! { ! if (is_frac_t(t)) ! { ! x = gred_rfrac(x); ! tx = typ(x); ! if (!is_frac_t(tx)) err(typeer, "type"); ! } ! else ! { ! if (!is_rfrac_t(t)) err(typeer, "type"); ! x = gcopy(x); ! } ! } ! else if (is_vec_t(tx)) ! { ! if (!is_vec_t(t)) err(typeer, "type"); ! x = gcopy(x); ! } ! else if (tx != t) err(typeer, "type"); ! settyp(x, t); return x; } entree functions_highlevel[]={ Index: doc/usersch3.tex =================================================================== RCS file: /home/megrez/cvsroot/pari/doc/usersch3.tex,v retrieving revision 1.5 diff -c -r1.5 usersch3.tex *** doc/usersch3.tex 1999/09/29 13:47:48 1.5 --- doc/usersch3.tex 1999/10/04 11:25:59 *************** *** 6473,6494 **** part here, so that \kbd{FRACN} by itself would also be all right). Check out existing type names with the metacommand \b{t}.\label{se:gptype} ! Type changes must be used with extreme caution, or disasters may ! occur (\kbd{SIGSEGV} or \kbd{SIGBUS} being one's best bet), but one instance ! where it can be useful is \kbd{type(x,RFRACN)} when \kbd{x} is a rational ! function (type \typ{RFRAC}). In this case, the created object, as well as ! the objects created from it, will not be reduced automatically, making the ! operations much faster. In fact this function is the {\it only\/} way to create reducible rationals (type \typ{FRACN}) or rational functions (type ! \typ{RFRACN}) in GP. There is no equivalent library syntax, since the internal functions \kbd{typ} ! and \kbd{settyp} are available. Note that \kbd{settyp} does {\it not\/} create ! a copy of \kbd{x}, contrary to most PARI functions. It just changes the type in ! place (and returns nothing). \kbd{typ} returns a C long integer. Note also ! the different spellings of the internal functions (\kbd{set})\kbd{typ} and of ! the GP function \kbd{type}\footnote{*}{This is due to the fact that ! \kbd{type} is a reserved identifier for some C compilers.}. \subsubsecidx{whatnow}$(\var{key})$: if keyword \var{key} is the name of a function that was present in GP version 1.39.15 or lower, outputs --- 6473,6493 ---- part here, so that \kbd{FRACN} by itself would also be all right). Check out existing type names with the metacommand \b{t}.\label{se:gptype} ! GP won't let you create meaningless objects in this way where the internal ! structure doesn't match the type. This function can be useful to create reducible rationals (type \typ{FRACN}) or rational functions (type ! \typ{RFRACN}). In fact it's the only way to do so in GP. In this case, the ! created object, as well as the objects created from it, will not be reduced ! automatically, making some operations a bit faster. There is no equivalent library syntax, since the internal functions \kbd{typ} ! and \kbd{settyp} are available. Note that \kbd{settyp} does {\it not\/} ! create a copy of \kbd{x}, contrary to most PARI functions. It also doesn't ! check for consistency. \kbd{settyp} just changes the type in place and ! returns nothing. \kbd{typ} returns a C long integer. Note also the different ! spellings of the internal functions (\kbd{set})\kbd{typ} and of the GP ! function \kbd{type}, which is due to the fact that \kbd{type} is a reserved ! identifier for some C compilers. \subsubsecidx{whatnow}$(\var{key})$: if keyword \var{key} is the name of a function that was present in GP version 1.39.15 or lower, outputs __ Karim Belabas email: Karim.Belabas@math.u-psud.fr Dep. de Mathematiques, Bat. 425 Universite Paris-Sud Tel: (00 33) 1 69 15 57 48 F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19 -- PARI/GP Home Page: http://hasse.mathematik.tu-muenchen.de/ntsw/pari/