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

bacek at svn.parrot.org bacek at svn.parrot.org
Sat May 30 01:15:29 UTC 2009


Author: bacek
Date: Sat May 30 01:15:28 2009
New Revision: 39250
URL: https://trac.parrot.org/parrot/changeset/39250

Log:
[pmc] Cleanup BigNum's float handling a bit.

Modified:
   trunk/src/pmc/bignum.pmc

Modified: trunk/src/pmc/bignum.pmc
==============================================================================
--- trunk/src/pmc/bignum.pmc	Sat May 30 01:15:09 2009	(r39249)
+++ trunk/src/pmc/bignum.pmc	Sat May 30 01:15:28 2009	(r39250)
@@ -1133,8 +1133,12 @@
         bignum_add_bignum(INTERP, SELF, value, SELF);
     }
 
-    MULTI void i_add(FLOATVAL value) {
-        bignum_add_bignum_float(INTERP, SELF, value, SELF);
+    MULTI void i_add(Integer value) {
+        bignum_add_bignum_int(INTERP, SELF, VTABLE_get_integer(INTERP, value), SELF);
+    }
+
+    MULTI void i_add(Float value) {
+        bignum_add_bignum_float(INTERP, SELF, VTABLE_get_number(INTERP, value), SELF);
     }
 
     MULTI void i_add(DEFAULT value) {
@@ -1149,9 +1153,7 @@
     }
 
     VTABLE void i_add_float(FLOATVAL value) {
-        Parrot_ex_throw_from_c_args(INTERP, NULL,
-            EXCEPTION_INTERNAL_NOT_IMPLEMENTED,
-            "BigNum: no multiple dispatch variant 'i_add_float' for FLOATVAL");
+        bignum_add_bignum_float(INTERP, SELF, value, SELF);
     }
 
 /*
@@ -1203,8 +1205,12 @@
         bignum_sub_bignum(INTERP, SELF, value, SELF);
     }
 
-    MULTI void i_subtract(FLOATVAL value) {
-        bignum_sub_bignum_float(INTERP, SELF, value, SELF);
+    MULTI void i_subtract(Integer value) {
+        bignum_sub_bignum_int(INTERP, SELF, VTABLE_get_integer(INTERP, value), SELF);
+    }
+
+    MULTI void i_subtract(Float value) {
+        bignum_sub_bignum_float(INTERP, SELF, VTABLE_get_number(INTERP, value), SELF);
     }
 
     MULTI void i_subtract(DEFAULT value) {
@@ -1219,9 +1225,7 @@
     }
 
     VTABLE void i_subtract_float(FLOATVAL value) {
-        Parrot_ex_throw_from_c_args(INTERP, NULL,
-            EXCEPTION_INTERNAL_NOT_IMPLEMENTED,
-            "BigNum: no multiple dispatch variant 'i_subtract_float' for FLOATVAL");
+        bignum_sub_bignum_float(INTERP, SELF, value, SELF);
     }
 
 /*
@@ -1264,8 +1268,8 @@
         bignum_mul_bignum(INTERP, SELF, value, SELF);
     }
 
-    MULTI void i_multiply(FLOATVAL value) {
-        bignum_mul_bignum_float(INTERP, SELF, value, SELF);
+    MULTI void i_multiply(Float value) {
+        bignum_mul_bignum_float(INTERP, SELF, VTABLE_get_number(INTERP, value), SELF);
     }
 
     MULTI void i_multiply(Integer value) {
@@ -1284,9 +1288,7 @@
     }
 
     VTABLE void i_multiply_float(FLOATVAL value) {
-        Parrot_ex_throw_from_c_args(INTERP, NULL,
-            EXCEPTION_INTERNAL_NOT_IMPLEMENTED,
-            "BigNum: no multiple dispatch variant 'i_multiply_float' for FLOATVAL");
+        bignum_mul_bignum_float(INTERP, SELF, value, SELF);
     }
 
 /*
@@ -1377,6 +1379,9 @@
     MULTI void i_divide(Integer value) {
         bignum_div_bignum_int(INTERP, SELF, VTABLE_get_integer(interp, value), SELF);
     }
+    MULTI void i_divide(Float value) {
+        bignum_div_bignum_float(INTERP, SELF, VTABLE_get_integer(interp, value), SELF);
+    }
     MULTI void i_divide(DEFAULT value) {
          Parrot_ex_throw_from_c_args(INTERP, NULL,
             EXCEPTION_INTERNAL_NOT_IMPLEMENTED,


More information about the parrot-commits mailing list