/* allocates memory */
bignum *factorvm::bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
{
- GC_BIGNUM(x); GC_BIGNUM(y);
+ GC_BIGNUM(x,this); GC_BIGNUM(y,this);
if ((BIGNUM_LENGTH (y)) > (BIGNUM_LENGTH (x)))
{
/* allocates memory */
bignum *factorvm::bignum_subtract_unsigned(bignum * x, bignum * y)
{
- GC_BIGNUM(x); GC_BIGNUM(y);
+ GC_BIGNUM(x,this); GC_BIGNUM(y,this);
int negative_p = 0;
switch (bignum_compare_unsigned (x, y))
/* allocates memory */
bignum *factorvm::bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
{
- GC_BIGNUM(x); GC_BIGNUM(y);
+ GC_BIGNUM(x,this); GC_BIGNUM(y,this);
if ((BIGNUM_LENGTH (y)) > (BIGNUM_LENGTH (x)))
{
/* allocates memory */
bignum *factorvm::bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p)
{
- GC_BIGNUM(x);
+ GC_BIGNUM(x,this);
bignum_length_type length_x = (BIGNUM_LENGTH (x));
/* allocates memory */
void factorvm::bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p)
{
- GC_BIGNUM(numerator); GC_BIGNUM(denominator);
+ GC_BIGNUM(numerator,this); GC_BIGNUM(denominator,this);
bignum_length_type length_n = ((BIGNUM_LENGTH (numerator)) + 1);
bignum_length_type length_d = (BIGNUM_LENGTH (denominator));
((quotient != ((bignum * *) 0))
? (allot_bignum ((length_n - length_d), q_negative_p))
: BIGNUM_OUT_OF_BAND);
- GC_BIGNUM(q);
+ GC_BIGNUM(q,this);
bignum * u = (allot_bignum (length_n, r_negative_p));
- GC_BIGNUM(u);
+ GC_BIGNUM(u,this);
int shift = 0;
BIGNUM_ASSERT (length_d > 1);
/* allocates memory */
void factorvm::bignum_divide_unsigned_medium_denominator(bignum * numerator,bignum_digit_type denominator, bignum * * quotient, bignum * * remainder,int q_negative_p, int r_negative_p)
{
- GC_BIGNUM(numerator);
+ GC_BIGNUM(numerator,this);
bignum_length_type length_n = (BIGNUM_LENGTH (numerator));
bignum_length_type length_q;
bignum * q = NULL;
- GC_BIGNUM(q);
+ GC_BIGNUM(q,this);
int shift = 0;
/* Because `bignum_digit_divide' requires a normalized denominator. */
/* allocates memory */
void factorvm::bignum_divide_unsigned_small_denominator(bignum * numerator, bignum_digit_type denominator, bignum * * quotient, bignum * * remainder,int q_negative_p, int r_negative_p)
{
- GC_BIGNUM(numerator);
+ GC_BIGNUM(numerator,this);
bignum * q = (bignum_new_sign (numerator, q_negative_p));
- GC_BIGNUM(q);
+ GC_BIGNUM(q,this);
bignum_digit_type r = (bignum_destructive_scale_down (q, denominator));
/* allocates memory */
bignum *factorvm::bignum_new_sign(bignum * x, int negative_p)
{
- GC_BIGNUM(x);
+ GC_BIGNUM(x,this);
bignum * result = (allot_bignum ((BIGNUM_LENGTH (x)), negative_p));
bignum_destructive_copy (x, result);
/* assume arg1 is a big number, n is a long */
bignum *factorvm::bignum_magnitude_ash(bignum * arg1, fixnum n)
{
- GC_BIGNUM(arg1);
+ GC_BIGNUM(arg1,this);
bignum * result = NULL;
bignum_digit_type *scan1;
/* allocates memory */
bignum *factorvm::bignum_pospos_bitwise_op(int op, bignum * arg1, bignum * arg2)
{
- GC_BIGNUM(arg1); GC_BIGNUM(arg2);
+ GC_BIGNUM(arg1,this); GC_BIGNUM(arg2,this);
bignum * result;
bignum_length_type max_length;
/* allocates memory */
bignum *factorvm::bignum_posneg_bitwise_op(int op, bignum * arg1, bignum * arg2)
{
- GC_BIGNUM(arg1); GC_BIGNUM(arg2);
+ GC_BIGNUM(arg1,this); GC_BIGNUM(arg2,this);
bignum * result;
bignum_length_type max_length;
/* allocates memory */
bignum *factorvm::bignum_negneg_bitwise_op(int op, bignum * arg1, bignum * arg2)
{
- GC_BIGNUM(arg1); GC_BIGNUM(arg2);
+ GC_BIGNUM(arg1,this); GC_BIGNUM(arg2,this);
bignum * result;
bignum_length_type max_length;
/* Allocates memory */
bignum *factorvm::bignum_integer_length(bignum * x)
{
- GC_BIGNUM(x);
+ GC_BIGNUM(x,this);
bignum_length_type index = ((BIGNUM_LENGTH (x)) - 1);
bignum_digit_type digit = (BIGNUM_REF (x, index));
~gc_root() {
#ifdef FACTOR_DEBUG
- assert(vm->gc_locals.back() == (cell)this);
+ assert(myvm->gc_locals.back() == (cell)this);
#endif
- vm->gc_locals.pop_back();
+ myvm->gc_locals.pop_back();
}
};
{
bignum **addr;
factorvm *myvm;
- //gc_bignum(bignum **addr_, factorvm *vm) : addr(addr_), myvm(vm) {
- gc_bignum(bignum **addr_) : addr(addr_), myvm(vm) {
+ gc_bignum(bignum **addr_, factorvm *vm) : addr(addr_), myvm(vm) {
if(*addr_)
check_data_pointer(*addr_);
- vm->gc_bignums.push_back((cell)addr);
+ myvm->gc_bignums.push_back((cell)addr);
}
~gc_bignum() {
#ifdef FACTOR_DEBUG
- assert(vm->gc_bignums.back() == (cell)addr);
+ assert(myvm->gc_bignums.back() == (cell)addr);
#endif
- vm->gc_bignums.pop_back();
+ myvm->gc_bignums.pop_back();
}
};
-#define GC_BIGNUM(x) gc_bignum x##__gc_root(&x)
+#define GC_BIGNUM(x,vm) gc_bignum x##__gc_root(&x,vm)
}