develooper Front page | perl.cvs.parrot | Postings from January 2009

[svn:parrot] r35664 - trunk/src/pmc

From:
cotto
Date:
January 16, 2009 21:10
Subject:
[svn:parrot] r35664 - trunk/src/pmc
Message ID:
20090117051023.3B749CB9AE@x12.develooper.com
Author: cotto
Date: Fri Jan 16 21:10:22 2009
New Revision: 35664

Modified:
   trunk/src/pmc/bigint.pmc

Log:
[pmc] convert BigInt PMC to use ATTRs


Modified: trunk/src/pmc/bigint.pmc
==============================================================================
--- trunk/src/pmc/bigint.pmc	(original)
+++ trunk/src/pmc/bigint.pmc	Fri Jan 16 21:10:22 2009
@@ -36,116 +36,170 @@
     mpz_t b;
 } BIGINT;
 
-#  define BN(x) ((BIGINT *)PMC_struct_val(x))->b
 
 static void
 bigint_init(PARROT_INTERP, PMC *self) {
-    PMC_struct_val(self) = malloc(sizeof (BIGINT));
-    mpz_init(BN(self));
+    Parrot_BigInt_attributes *attrs =
+        mem_allocate_zeroed_typed(Parrot_BigInt_attributes);
+    attrs->bi = mem_allocate_zeroed_typed(BIGINT);
+    mpz_init(attrs->bi->b);
+    PMC_data(self) = attrs;
 }
+
 static void
 bigint_clear(PARROT_INTERP, PMC *self) {
-    mpz_clear(BN(self));
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    mpz_clear(bi->b);
 }
 
 static void
 bigint_set(PARROT_INTERP, PMC *dest, PMC *src) {
-    mpz_clear(BN(dest));
-    mpz_init(BN(dest));
-    mpz_set(BN(dest), BN(src));
+    BIGINT *bi_dest, *bi_src;
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    GETATTR_BigInt_bi(interp, src,  bi_src);
+    mpz_clear(bi_dest->b);
+    mpz_init(bi_dest->b);
+    mpz_set(bi_dest->b, bi_src->b);
 }
 
 static void
 bigint_set_long(PARROT_INTERP, PMC *self, long value) {
-    mpz_set_si(BN(self), value);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    mpz_set_si(bi->b, value);
 }
 
 static void
 bigint_set_double(PARROT_INTERP, PMC *self, double value) {
-    mpz_set_d(BN(self), value);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    mpz_set_d(bi->b, value);
 }
 
 static void
 bigint_set_str(PARROT_INTERP, PMC *self, char *value, int base) {
-    mpz_set_str(BN(self), value, base);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    mpz_set_str(bi->b, value, base);
 }
 
 static BIGNUM*
 bigint_get_self(PARROT_INTERP, PMC *self) {
-    return PMC_struct_val(self);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    return bi;
 }
 
 static void
 bigint_set_self(PARROT_INTERP, PMC *self, BIGNUM *value) {
-    mpz_set(BN(self), (mpz_srcptr)value);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    mpz_set(bi->b, (mpz_srcptr)((BIGINT*)value)->b);
 }
 
 static long
 bigint_get_long(PARROT_INTERP, PMC *self) {
-    if (mpz_fits_slong_p(BN(self)))
-        return mpz_get_si(BN(self));
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    if (mpz_fits_slong_p(bi->b))
+        return mpz_get_si(bi->b);
 
     Parrot_ex_throw_from_c_args(interp, NULL, 1, "bigint_get_long: number too big");
 }
 
 static int
 bigint_get_bool(PARROT_INTERP, PMC *self) {
-    if (mpz_sgn(BN(self)) != 0)
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    if (mpz_sgn(bi->b) != 0)
         return 1;
     else
         return 0;
 }
+
 static char *
 bigint_get_string(PARROT_INTERP, PMC *self, int base) {
-    size_t n = mpz_sizeinbase(BN(self), base) + 2;
-    char  *s = (char *)mem_sys_allocate(n);
-    return mpz_get_str(s, base, BN(self));
+    BIGINT *bi;
+    size_t  n;
+    char   *s;
+
+    GETATTR_BigInt_bi(interp, self, bi);
+    n = mpz_sizeinbase(bi->b, base) + 2;
+    s = (char *)mem_sys_allocate(n);
+    return mpz_get_str(s, base, bi->b);
 }
 
 static double
 bigint_get_double(PARROT_INTERP, PMC *self) {
-    return mpz_get_d(BN(self));
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    return mpz_get_d(bi->b);
 }
 
 static void
 bigint_add_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
-    mpz_add(BN(dest), BN(self), BN(value));
+    BIGINT *bi_self, *bi_value, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_add(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_add_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     if (value < 0)
-        mpz_sub_ui(BN(dest), BN(self), (unsigned long int)-value);
+        mpz_sub_ui(bi_dest->b, bi_self->b, (unsigned long int)-value);
     else
-        mpz_add_ui(BN(dest), BN(self), (unsigned long int)value);
+        mpz_add_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static void
 bigint_sub_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
-    mpz_sub(BN(dest), BN(self), BN(value));
+    BIGINT *bi_self, *bi_value, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_sub(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_sub_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     if (value < 0)
-        mpz_add_ui(BN(dest), BN(self), (unsigned long int)-value);
+        mpz_add_ui(bi_dest->b, bi_self->b, (unsigned long int)-value);
     else
-        mpz_sub_ui(BN(dest), BN(self), (unsigned long int)value);
+        mpz_sub_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static void
 bigint_mul_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
-    mpz_mul(BN(dest), BN(self), BN(value));
+    BIGINT *bi_self, *bi_value, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_mul(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_mul_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
-    mpz_mul_si(BN(dest), BN(self), value);
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_mul_si(bi_dest->b, bi_self->b, value);
 }
 
 static void
 bigint_pow_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
-    mpz_pow_ui(BN(dest), BN(self), (unsigned long int)value);
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_pow_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static void
@@ -158,110 +212,150 @@
 static void
 bigint_check_divide_zero(PARROT_INTERP, PMC *value) {
     /* Throw an exception if we are dividing by zero. */
-    if (mpz_cmp_si(BN(value), 0) == 0)
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, value, bi);
+    if (mpz_cmp_si(bi->b, 0) == 0)
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_DIV_BY_ZERO,
             "Divide by zero");
 }
 
 static void
 bigint_div_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
+    BIGINT *bi_self, *bi_value, *bi_dest;
     bigint_check_divide_zero(interp, value);
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     /* this is mpz_fdiv_q */
-    mpz_div(BN(dest), BN(self), BN(value));
+    mpz_div(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_div_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     int_check_divide_zero(interp, value);
 
     /* this is mpz_fdiv_q */
     if (value < 0) {
-        mpz_div_ui(BN(dest), BN(self), (unsigned long int)-value);
-        mpz_neg(BN(dest), BN(dest));
+        mpz_div_ui(bi_dest->b, bi_self->b, (unsigned long int)-value);
+        mpz_neg(bi_dest->b, bi_dest->b);
     }
     else
-        mpz_div_ui(BN(dest), BN(self), (unsigned long int)value);
+        mpz_div_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static void
 bigint_fdiv_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
+    BIGINT *bi_self, *bi_value, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     bigint_check_divide_zero(interp, value);
-    mpz_fdiv_q(BN(dest), BN(self), BN(value));
+    mpz_fdiv_q(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_fdiv_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     int_check_divide_zero(interp, value);
 
     if (value < 0) {
-        mpz_fdiv_q_ui(BN(dest), BN(self), (unsigned long int)-value);
-        mpz_neg(BN(dest), BN(dest));
+        mpz_fdiv_q_ui(bi_dest->b, bi_self->b, (unsigned long int)-value);
+        mpz_neg(bi_dest->b, bi_dest->b);
     }
     else
-        mpz_fdiv_q_ui(BN(dest), BN(self), (unsigned long int)value);
+        mpz_fdiv_q_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static void
 bigint_mod_bigint(PARROT_INTERP, PMC *self, PMC *value, PMC *dest) {
+    BIGINT *bi_self, *bi_value, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     bigint_check_divide_zero(interp, value);
-    mpz_mod(BN(dest), BN(self), BN(value));
+    mpz_mod(bi_dest->b, bi_self->b, bi_value->b);
 }
 
 static void
 bigint_mod_bigint_int(PARROT_INTERP, PMC *self, INTVAL value, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     int_check_divide_zero(interp, value);
 
     if (value < 0) {
-        mpz_mod_ui(BN(dest), BN(self), (unsigned long int)-value);
+        mpz_mod_ui(bi_dest->b, bi_self->b, (unsigned long int)-value);
     }
     else
-        mpz_mod_ui(BN(dest), BN(self), (unsigned long int)value);
+        mpz_mod_ui(bi_dest->b, bi_self->b, (unsigned long int)value);
 }
 
 static INTVAL
 bigint_cmp(PARROT_INTERP, PMC *self, PMC *value) {
-    return mpz_cmp(BN(self), BN(value));
+    BIGINT *bi_self, *bi_value;
+    GETATTR_BigInt_bi(interp, self,  bi_self);
+    GETATTR_BigInt_bi(interp, value, bi_value);
+    return mpz_cmp(bi_self->b, bi_value->b);
 }
 
 static INTVAL
 bigint_cmp_int(PARROT_INTERP, PMC *self, INTVAL value) {
-    return mpz_cmp_si(BN(self), value);
+    BIGINT *bi;
+    GETATTR_BigInt_bi(interp, self, bi);
+    return mpz_cmp_si(bi->b, value);
 }
 
 static void
 bigint_abs(PARROT_INTERP, PMC *self, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
     VTABLE_morph(interp, dest, enum_class_BigInt);
-    mpz_abs(BN(dest), BN(self));
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_abs(bi_dest->b, bi_self->b);
 }
 
 static void
 bigint_neg(PARROT_INTERP, PMC *self, PMC *dest) {
+    BIGINT *bi_self, *bi_dest;
     VTABLE_morph(interp, dest, enum_class_BigInt);
-    mpz_neg(BN(dest), BN(self));
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
+    mpz_neg(bi_dest->b, bi_self->b);
 }
 
 static void
 bigint_bitwise_shl_bigint_int(PARROT_INTERP, PMC *self,
                               INTVAL value, PMC *dest)
 {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     /* The third args to mpz_mul_2exp and mpz_tdiv_q_2exp are unsigned, so we
        need to do something sensible with negative values. */
     if (value >= 0)
-        mpz_mul_2exp(BN(dest), BN(self), (unsigned long int)value);
+        mpz_mul_2exp(bi_dest->b, bi_self->b, (unsigned long int)value);
     else
-        mpz_tdiv_q_2exp(BN(dest), BN(self), (unsigned long int)-value);
+        mpz_tdiv_q_2exp(bi_dest->b, bi_self->b, (unsigned long int)-value);
 }
 
 static void
 bigint_bitwise_shr_bigint_int(PARROT_INTERP, PMC *self,
                               INTVAL value, PMC *dest)
 {
+    BIGINT *bi_self, *bi_dest;
+    GETATTR_BigInt_bi(interp, self, bi_self);
+    GETATTR_BigInt_bi(interp, dest, bi_dest);
     /* The third args to mpz_mul_2exp and mpz_tdiv_q_2exp are unsigned, so we
        need to do something sensible with negative values. */
     if (value >= 0)
-        mpz_tdiv_q_2exp(BN(dest), BN(self), (unsigned long int)value);
+        mpz_tdiv_q_2exp(bi_dest->b, bi_self->b, (unsigned long int)value);
     else
-        mpz_mul_2exp(BN(dest), BN(self), (unsigned long int)-value);
+        mpz_mul_2exp(bi_dest->b, bi_self->b, (unsigned long int)-value);
 }
 
 #else /* ifdef PARROT_HAS_GMP */
@@ -469,6 +563,7 @@
 #endif /* ifdef PARROT_HAS_GMP */
 
 pmclass BigInt {
+    ATTR struct BIGINT * bi; /*bigint val*/
 
 /*
 
@@ -541,8 +636,14 @@
     }
 
     VTABLE void destroy() {
+        BIGINT                   *bi;
+        Parrot_BigInt_attributes *attrs;
+
         bigint_clear(INTERP, SELF);
-        mem_sys_free(PMC_struct_val(SELF));
+
+        attrs = (Parrot_BigInt_attributes*)PMC_data(SELF);
+        mem_sys_free(attrs->bi);
+        mem_sys_free(attrs);
     }
 
 /*
@@ -920,6 +1021,7 @@
     }
 
     MULTI PMC *divide(BigInt value, PMC *dest) {
+        BIGINT *bi;
         if (dest)
             VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
@@ -928,8 +1030,9 @@
         bigint_div_bigint(INTERP, SELF, value, dest);
 #if 0
         /* to downgrade or not that's the question */
-        if (mpz_fits_slong_p(BN(dest))) {
-            long iresult = mpz_get_si(BN(dest));
+        GETATTR_BigInt_bi(interp, dest, bi);
+        if (mpz_fits_slong_p(bi->b)) {
+            long iresult = mpz_get_si(bi->b);
             VTABLE_morph(interp, dest, enum_class_Integer);
             VTABLE_set_integer_native(interp, dest, iresult);
         }



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About