e576bb2002-10-11Martin Nilsson /* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. */
1b10db2002-10-08Martin Nilsson 
fda0de1999-10-08Fredrik Noring #include "global.h" #include "interpret.h" #include "program.h" #include "object.h" #include "svalue.h"
b2d3e42000-12-01Fredrik Hübinette (Hubbe) #include "pike_error.h"
fda0de1999-10-08Fredrik Noring 
2b1c922013-12-24Henrik Grubbström (Grubba) #include "bignum.h"
6ad2372002-05-11Martin Nilsson #define sp Pike_sp
8133372008-05-30Martin Stjernholm PMOD_EXPORT struct svalue auto_bignum_program = SVALUE_INIT_FREE;
e37a3e1999-10-09Fredrik Hübinette (Hubbe) 
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct program *get_auto_bignum_program(void)
8852cb1999-10-25Fredrik Hübinette (Hubbe) {
43006a2013-12-26Henrik Grubbström (Grubba)  return program_from_svalue(&auto_bignum_program);
8852cb1999-10-25Fredrik Hübinette (Hubbe) }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct program *get_auto_bignum_program_or_zero(void)
8852cb1999-10-25Fredrik Hübinette (Hubbe) {
43006a2013-12-26Henrik Grubbström (Grubba)  return program_from_svalue(&auto_bignum_program);
8852cb1999-10-25Fredrik Hübinette (Hubbe) }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void convert_stack_top_to_bignum(void)
e37a3e1999-10-09Fredrik Hübinette (Hubbe) { apply_svalue(&auto_bignum_program, 1); }
fda0de1999-10-08Fredrik Noring 
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void convert_stack_top_with_base_to_bignum(void)
31ea271999-10-22Fredrik Noring { apply_svalue(&auto_bignum_program, 2); }
39ac731999-10-20Fredrik Noring int is_bignum_object(struct object *o) {
1c1c5e2001-04-08Fredrik Hübinette (Hubbe)  return o->prog == program_from_svalue(&auto_bignum_program);
39ac731999-10-20Fredrik Noring }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT int is_bignum_object_in_svalue(struct svalue *sv)
39ac731999-10-20Fredrik Noring {
6b304c2004-12-30Henrik Grubbström (Grubba)  /* FIXME: object subtype? */
017b572011-10-28Henrik Grubbström (Grubba)  return TYPEOF(*sv) == T_OBJECT && is_bignum_object(sv->u.object);
39ac731999-10-20Fredrik Noring }
e37a3e1999-10-09Fredrik Hübinette (Hubbe) 
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct object *make_bignum_object(void)
fda0de1999-10-08Fredrik Noring {
e37a3e1999-10-09Fredrik Hübinette (Hubbe)  convert_stack_top_to_bignum();
50ea682003-03-14Henrik Grubbström (Grubba)  dmalloc_touch_svalue(sp-1);
39ac731999-10-20Fredrik Noring  return (--sp)->u.object;
e37a3e1999-10-09Fredrik Hübinette (Hubbe) }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct object *bignum_from_svalue(struct svalue *s)
e37a3e1999-10-09Fredrik Hübinette (Hubbe) { push_svalue(s); convert_stack_top_to_bignum();
50ea682003-03-14Henrik Grubbström (Grubba)  dmalloc_touch_svalue(sp-1);
39ac731999-10-20Fredrik Noring  return (--sp)->u.object;
fda0de1999-10-08Fredrik Noring }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct pike_string *string_from_bignum(struct object *o, int base)
ff0d461999-10-15Fredrik Noring { push_int(base); safe_apply(o, "digits", 1);
017b572011-10-28Henrik Grubbström (Grubba)  if(TYPEOF(sp[-1]) != T_STRING)
b2d3e42000-12-01Fredrik Hübinette (Hubbe)  Pike_error("Gmp.mpz string conversion failed.\n");
ff0d461999-10-15Fredrik Noring 
50ea682003-03-14Henrik Grubbström (Grubba)  dmalloc_touch_svalue(sp-1);
ff0d461999-10-15Fredrik Noring  return (--sp)->u.string; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void convert_svalue_to_bignum(struct svalue *s)
fda0de1999-10-08Fredrik Noring {
e37a3e1999-10-09Fredrik Hübinette (Hubbe)  push_svalue(s); convert_stack_top_to_bignum(); free_svalue(s); *s=sp[-1];
fda0de1999-10-08Fredrik Noring  sp--;
e801bb1999-10-24Henrik Grubbström (Grubba)  dmalloc_touch_svalue(sp);
fda0de1999-10-08Fredrik Noring }