e576bb | 2002-10-11 | Martin Nilsson | |
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
fda0de | 1999-10-08 | Fredrik Noring | | #include "global.h"
#include "interpret.h"
#include "program.h"
#include "object.h"
#include "svalue.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
fda0de | 1999-10-08 | Fredrik Noring | |
|
2b1c92 | 2013-12-24 | Henrik Grubbström (Grubba) | | #include "bignum.h"
|
6ad237 | 2002-05-11 | Martin Nilsson | | #define sp Pike_sp
|
813337 | 2008-05-30 | Martin Stjernholm | | PMOD_EXPORT struct svalue auto_bignum_program = SVALUE_INIT_FREE;
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct program *get_auto_bignum_program(void)
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | {
|
43006a | 2013-12-26 | Henrik Grubbström (Grubba) | | return program_from_svalue(&auto_bignum_program);
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct program *get_auto_bignum_program_or_zero(void)
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(auto_bignum_program) == PIKE_T_FREE)
|
91487e | 2003-01-11 | Martin Stjernholm | | return 0;
|
43006a | 2013-12-26 | Henrik Grubbström (Grubba) | | return program_from_svalue(&auto_bignum_program);
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | }
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | void exit_auto_bignum(void)
{
free_svalue(&auto_bignum_program);
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | mark_free_svalue (&auto_bignum_program);
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_stack_top_to_bignum(void)
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(auto_bignum_program) != T_PROGRAM)
|
883794 | 2008-07-28 | Martin Stjernholm | | Pike_error("Gmp.mpz conversion failed (Gmp.bignum not loaded).\n");
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | apply_svalue(&auto_bignum_program, 1);
}
|
fda0de | 1999-10-08 | Fredrik Noring | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_stack_top_with_base_to_bignum(void)
|
31ea27 | 1999-10-22 | Fredrik Noring | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(auto_bignum_program) != T_PROGRAM)
|
883794 | 2008-07-28 | Martin Stjernholm | | Pike_error("Gmp.mpz conversion failed (Gmp.bignum not loaded).\n");
|
31ea27 | 1999-10-22 | Fredrik Noring | | apply_svalue(&auto_bignum_program, 2);
}
|
39ac73 | 1999-10-20 | Fredrik Noring | | int is_bignum_object(struct object *o)
{
|
e28b47 | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(auto_bignum_program) == T_INT)
|
3905cf | 1999-11-11 | Fredrik Hübinette (Hubbe) | | return 0;
|
e28b47 | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
|
1c1c5e | 2001-04-08 | Fredrik Hübinette (Hubbe) | | return o->prog == program_from_svalue(&auto_bignum_program);
|
39ac73 | 1999-10-20 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT int is_bignum_object_in_svalue(struct svalue *sv)
|
39ac73 | 1999-10-20 | Fredrik Noring | | {
|
6b304c | 2004-12-30 | Henrik Grubbström (Grubba) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | return TYPEOF(*sv) == T_OBJECT && is_bignum_object(sv->u.object);
|
39ac73 | 1999-10-20 | Fredrik Noring | | }
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct object *make_bignum_object(void)
|
fda0de | 1999-10-08 | Fredrik Noring | | {
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | convert_stack_top_to_bignum();
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
39ac73 | 1999-10-20 | Fredrik Noring | | return (--sp)->u.object;
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct object *bignum_from_svalue(struct svalue *s)
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | {
push_svalue(s);
convert_stack_top_to_bignum();
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
39ac73 | 1999-10-20 | Fredrik Noring | | return (--sp)->u.object;
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct pike_string *string_from_bignum(struct object *o, int base)
|
ff0d46 | 1999-10-15 | Fredrik Noring | | {
push_int(base);
safe_apply(o, "digits", 1);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(sp[-1]) != T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Gmp.mpz string conversion failed.\n");
|
ff0d46 | 1999-10-15 | Fredrik Noring | |
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
ff0d46 | 1999-10-15 | Fredrik Noring | | return (--sp)->u.string;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_svalue_to_bignum(struct svalue *s)
|
fda0de | 1999-10-08 | Fredrik Noring | | {
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | push_svalue(s);
convert_stack_top_to_bignum();
free_svalue(s);
*s=sp[-1];
|
fda0de | 1999-10-08 | Fredrik Noring | | sp--;
|
e801bb | 1999-10-24 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp);
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
bd35ec | 1999-10-30 | Fredrik Noring | | #ifdef INT64
|
0b926d | 2003-04-02 | Martin Stjernholm | | static void bootstrap_push_int64 (INT64 i)
|
2fe565 | 1999-10-29 | Fredrik Noring | | {
|
0a5d06 | 2000-08-08 | Henrik Grubbström (Grubba) | | if(i == DO_NOT_WARN((INT_TYPE)i))
|
2fe565 | 1999-10-29 | Fredrik Noring | | {
|
0a5d06 | 2000-08-08 | Henrik Grubbström (Grubba) | | push_int(DO_NOT_WARN((INT_TYPE)i));
|
2fe565 | 1999-10-29 | Fredrik Noring | | }
else
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | Pike_fatal ("Failed to convert large integer (Gmp.bignum not loaded).\n");
|
2fe565 | 1999-10-29 | Fredrik Noring | | }
|
956e5e | 2003-03-28 | Martin Stjernholm | | PMOD_EXPORT void (*push_int64) (INT64) = bootstrap_push_int64;
|
ae054d | 2022-09-22 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void (*ulongest_to_svalue_no_free)(struct svalue *sv, UINT64 i);
|
956e5e | 2003-03-28 | Martin Stjernholm | | PMOD_EXPORT int (*int64_from_bignum) (INT64 *, struct object *) = NULL;
|
00cf02 | 2003-11-15 | Martin Stjernholm | | PMOD_EXPORT void (*reduce_stack_top_bignum) (void) = NULL;
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | #endif
PMOD_EXPORT void (*push_ulongest) (unsigned LONGEST) = NULL;
PMOD_EXPORT int (*ulongest_from_bignum) (unsigned LONGEST *,
struct object *) = NULL;
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | |
|
43006a | 2013-12-26 | Henrik Grubbström (Grubba) | | PMOD_EXPORT int (*mpz_from_svalue)(MP_INT *, struct svalue *) = NULL;
|
2b1c92 | 2013-12-24 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void (*push_bignum)(MP_INT *) = NULL;
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | PMOD_EXPORT void hook_in_gmp_funcs (
#ifdef INT64
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | void (*push_int64_val)(INT64),
|
96f8f6 | 2018-03-21 | Tobias S. Josefowitz | | void (*ulongest_to_svalue_no_free_val)(struct svalue *, UINT64),
|
00cf02 | 2003-11-15 | Martin Stjernholm | | int (*int64_from_bignum_val) (INT64 *, struct object *),
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | void (*reduce_stack_top_bignum_val) (void),
#endif
void (*push_ulongest_val) (unsigned LONGEST),
|
2b1c92 | 2013-12-24 | Henrik Grubbström (Grubba) | | int (*ulongest_from_bignum_val) (unsigned LONGEST *, struct object *),
|
43006a | 2013-12-26 | Henrik Grubbström (Grubba) | | int (*mpz_from_svalue_val)(MP_INT *, struct svalue *),
|
2b1c92 | 2013-12-24 | Henrik Grubbström (Grubba) | | void (*push_bignum_val)(MP_INT *))
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | {
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | #ifdef INT64
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | push_int64 = push_int64_val ? push_int64_val : bootstrap_push_int64;
|
96f8f6 | 2018-03-21 | Tobias S. Josefowitz | | ulongest_to_svalue_no_free = ulongest_to_svalue_no_free_val;
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | int64_from_bignum = int64_from_bignum_val;
|
00cf02 | 2003-11-15 | Martin Stjernholm | | reduce_stack_top_bignum = reduce_stack_top_bignum_val;
|
956e5e | 2003-03-28 | Martin Stjernholm | | #endif
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | push_ulongest = push_ulongest_val;
ulongest_from_bignum = ulongest_from_bignum_val;
|
43006a | 2013-12-26 | Henrik Grubbström (Grubba) | | mpz_from_svalue = mpz_from_svalue_val;
|
2b1c92 | 2013-12-24 | Henrik Grubbström (Grubba) | | push_bignum = push_bignum_val;
|
dccaa2 | 2008-05-01 | Martin Stjernholm | | }
|