Author: leo
Date: Fri Apr 15 07:21:57 2005
New Revision: 7844

Modified:
   trunk/classes/bigint.pmc
   trunk/classes/complex.pmc
   trunk/classes/float.pmc
   trunk/classes/integer.pmc
   trunk/classes/perlstring.pmc
   trunk/classes/perlundef.pmc
   trunk/classes/scalar.pmc
   trunk/dynclasses/matchrange.pmc
   trunk/dynclasses/pyfloat.pmc
   trunk/dynclasses/pyint.pmc
   trunk/dynclasses/pylist.pmc
   trunk/dynclasses/pylong.pmc
   trunk/dynclasses/pystring.pmc
   trunk/dynclasses/tclfloat.pmc
   trunk/dynclasses/tclint.pmc
   trunk/imcc/parser_util.c
   trunk/imcc/t/syn/keyed.t
   trunk/src/objects.c
   trunk/t/pmc/mmd.t
   trunk/t/pmc/objects.t
   trunk/vtable.tbl
Log:
MMD 24 - add converted

* add and friends done
* removed all Tcl mathemtics from scalars
* s/index/idx/ gets rid of warning with gcc 2.95



Modified: trunk/classes/bigint.pmc
==============================================================================
--- trunk/classes/bigint.pmc    (original)
+++ trunk/classes/bigint.pmc    Fri Apr 15 07:21:57 2005
@@ -101,7 +101,6 @@
 static void
 bigint_add_bigint(Interp *interpreter, PMC* self, PMC *value, PMC *dest)
 {
-    VTABLE_morph(interpreter, dest, enum_class_BigInt);
     mpz_add(BN(dest), BN(self), BN(value));
 }
 
@@ -109,7 +108,6 @@
 bigint_add_bigint_int(Interp *interpreter, PMC* self, INTVAL value,
         PMC *dest)
 {
-    VTABLE_morph(interpreter, dest, enum_class_BigInt);
     mpz_add_ui(BN(dest), BN(self), (long)value);
 }
 static void
@@ -609,18 +607,59 @@
         bigint_sub_bigint_int(INTERP, SELF, 1, SELF);
     }
 
-    void add(PMC* value, PMC* dest) {
+    PMC* add(PMC* value, PMC* dest) {
 MMD_BigInt: {
+                if (dest)
+                    VTABLE_morph(interpreter, dest, SELF->vtable->base_type);
+                else
+                    dest = pmc_new(INTERP, SELF->vtable->base_type);
                 bigint_add_bigint(INTERP, SELF, value, dest);
+                return dest;
             }
 MMD_Integer: {
+                if (dest)
+                    VTABLE_morph(interpreter, dest, SELF->vtable->base_type);
+                else
+                    dest = pmc_new(INTERP, SELF->vtable->base_type);
                 bigint_add_bigint_int(INTERP, SELF, PMC_int_val(value), dest);
+                return dest;
             }
 MMD_DEFAULT: {
-                 internal_exception(1, "unimp add");
+                internal_exception(1, "unimp add");
+                return dest;
              }
     }
 
+    PMC* add_int(INTVAL value, PMC* dest) {
+        if (dest)
+            VTABLE_morph(interpreter, dest, SELF->vtable->base_type);
+        else
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        bigint_add_bigint_int(INTERP, SELF, value, dest);
+        return dest;
+    }
+
+    void i_add (PMC* value) {
+MMD_BigInt: {
+                bigint_add_bigint(INTERP, SELF, value, SELF);
+            }
+MMD_Integer: {
+                bigint_add_bigint_int(INTERP, SELF, PMC_int_val(value), SELF);
+             }
+MMD_DEFAULT: {
+                internal_exception(1, "unimp add");
+             }
+    }
+
+    void i_add_int (INTVAL value) {
+        bigint_add_bigint_int(INTERP, SELF, value, SELF);
+    }
+
+    void i_add_float (FLOATVAL value) {
+        internal_exception(1, "unimp add");
+    }
+
+
     PMC* subtract(PMC* value, PMC* dest) {
 MMD_BigInt: {
                 if (dest)
@@ -673,10 +712,6 @@
         internal_exception(1, "unimp sub");
     }
 
-    void add_int(INTVAL value, PMC* dest) {
-        bigint_add_bigint_int(INTERP, SELF, value, dest);
-    }
-
 
     void multiply(PMC* value, PMC* dest) {
 MMD_BigInt: {

Modified: trunk/classes/complex.pmc
==============================================================================
--- trunk/classes/complex.pmc   (original)
+++ trunk/classes/complex.pmc   Fri Apr 15 07:21:57 2005
@@ -571,11 +571,11 @@
 
 /*
 
-=item C<void add (PMC* value, PMC* dest)>
+=item C<PMC* add (PMC* value, PMC* dest)>
 
-=item C<void add_int (INTVAL value, PMC* dest)>
+=item C<PMC* add_int (INTVAL value, PMC* dest)>
 
-=item C<void add_float (FLOATVAL value, PMC* dest)>
+=item C<PMC* add_float (FLOATVAL value, PMC* dest)>
 
 Adds C<value> to the complex number, placing the result in C<dest>.
 
@@ -583,29 +583,67 @@
 
 */
 
-    void add (PMC* value, PMC* dest) {
+    PMC* add (PMC* value, PMC* dest) {
 MMD_Complex: {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
-        RE(dest) = RE(SELF) + RE(value);
-        IM(dest) = IM(SELF) + IM(value);
+            if (dest)
+                VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+            else {
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
+            }
+            RE(dest) = RE(SELF) + RE(value);
+            IM(dest) = IM(SELF) + IM(value);
+            return dest;
         }
 MMD_DEFAULT: {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
-        RE(dest) = RE(SELF) + VTABLE_get_number(INTERP, value);
-        IM(dest) = IM(SELF);
+            if (dest)
+                VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+            else {
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
+            }
+            RE(dest) = RE(SELF) + VTABLE_get_number(INTERP, value);
+            IM(dest) = IM(SELF);
+            return dest;
         }
     }
 
-    void add_int (INTVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+    PMC* add_int (INTVAL value, PMC* dest) {
+        if (dest)
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+        else {
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        }
         RE(dest) = RE(SELF) + value;
         IM(dest) = IM(SELF);
+        return dest;
     }
 
-    void add_float (FLOATVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+    PMC* add_float (FLOATVAL value, PMC* dest) {
+        if (dest)
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+        else {
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        }
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) + value;
         IM(dest) = IM(SELF);
+        return dest;
+    }
+
+    void i_add (PMC* value) {
+MMD_Complex: {
+            RE(SELF) += RE(value);
+            IM(SELF) += IM(value);
+        }
+MMD_DEFAULT: {
+            RE(SELF) += VTABLE_get_number(INTERP, value);
+        }
+    }
+
+    void i_add_int (INTVAL value) {
+        RE(SELF) += (FLOATVAL)value;
+    }
+    void i_add_float (FLOATVAL value) {
+        RE(SELF) += value;
     }
 
 /*
@@ -624,30 +662,30 @@
 
     PMC* subtract (PMC* value, PMC* dest) {
 MMD_Complex: {
-        if (dest)
-            VTABLE_morph(INTERP, dest, enum_class_Complex);
-        else {
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
+            if (dest)
+                VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+            else {
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
+            }
+            RE(dest) = RE(SELF) - RE(value);
+            IM(dest) = IM(SELF) - IM(value);
+            return dest;
         }
-        RE(dest) = RE(SELF) - RE(value);
-        IM(dest) = IM(SELF) - IM(value);
-        return dest;
-    }
 MMD_DEFAULT: {
-        if (dest)
-            VTABLE_morph(INTERP, dest, enum_class_Complex);
-        else {
-            dest = pmc_new(INTERP, SELF->vtable->base_type);
+            if (dest)
+                VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+            else {
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
+            }
+            RE(dest) = RE(SELF) - VTABLE_get_number(INTERP, value);
+            IM(dest) = IM(SELF);
+            return dest;
         }
-        RE(dest) = RE(SELF) - VTABLE_get_number(INTERP, value);
-        IM(dest) = IM(SELF);
-        return dest;
-    }
     }
 
     PMC* subtract_int (INTVAL value, PMC* dest) {
         if (dest)
-            VTABLE_morph(INTERP, dest, enum_class_Complex);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else {
             dest = pmc_new(INTERP, SELF->vtable->base_type);
         }
@@ -658,7 +696,7 @@
 
     PMC* subtract_float (FLOATVAL value, PMC* dest) {
         if (dest)
-            VTABLE_morph(INTERP, dest, enum_class_Complex);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else {
             dest = pmc_new(INTERP, SELF->vtable->base_type);
         }
@@ -708,34 +746,34 @@
 MMD_Integer: {
         FLOATVAL re = RE(SELF) * PMC_int_val(value);
         FLOATVAL im = IM(SELF) * PMC_int_val(value);
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = re;
         IM(dest) = im;
         }
 MMD_Complex: {
         FLOATVAL re = RE(SELF) * RE(value) - IM(SELF) * IM(value);
         FLOATVAL im = IM(SELF) * RE(value) + RE(SELF) * IM(value);
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = re;
         IM(dest) = im;
         }
 MMD_DEFAULT: {
         FLOATVAL re = RE(SELF) * VTABLE_get_number(INTERP, value);
         FLOATVAL im = IM(SELF) * VTABLE_get_number(INTERP, value);
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = re;
         IM(dest) = im;
         }
     }
 
     void multiply_int (INTVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) * value;
         IM(dest) = IM(SELF) * value;
     }
 
     void multiply_float (FLOATVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) * value;
         IM(dest) = IM(SELF) * value;
     }
@@ -758,7 +796,7 @@
 MMD_Complex: {
         FLOATVAL mod, re, im;
 
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         /* a little speed optimisation: cache an intermediate number;
             I'm not sure the compiler does this */
         mod = (RE(value) * RE(value) + IM(value) * IM(value));
@@ -771,20 +809,20 @@
         IM(dest) = im;
         }
 MMD_DEFAULT: {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) / VTABLE_get_number(INTERP, value);
         IM(dest) = IM(SELF) / VTABLE_get_number(INTERP, value);
         }
     }
 
     void divide_int (INTVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) / value;
         IM(dest) = IM(SELF) / value;
     }
 
     void divide_float (FLOATVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = RE(SELF) / value;
         IM(dest) = IM(SELF) / value;
     }
@@ -801,7 +839,7 @@
 */
 
     void neg (PMC* dest) {
-        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         RE(dest) = - RE(SELF);
         IM(dest) = - IM(SELF);
     }

Modified: trunk/classes/float.pmc
==============================================================================
--- trunk/classes/float.pmc     (original)
+++ trunk/classes/float.pmc     Fri Apr 15 07:21:57 2005
@@ -231,50 +231,85 @@
 
 =item C<void add(PMC *value, PMC *dest)>
 
-Adds C<*value> to the number and returns the result in C<*dest>.
+=item C<void add_int(INTVAL value, PMC *dest)>
 
-=cut
+=item C<void add_float(FLOATVAL value, PMC *dest)>
 
-*/
+Adds C<value> to the number and returns the result in C<*dest>.
 
-    void add (PMC* value, PMC* dest) {
-MMD_Float: {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + PMC_num_val(value));
-        }
-MMD_DEFAULT: {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + VTABLE_get_number(INTERP, value));
-        }
-    }
+=item C<void i_add(PMC *value)>
 
-/*
+=item C<void i_add(INTVAL value)>
 
-=item C<void add_int(INTVAL value, PMC *dest)>
+=item C<void i_add(FLOATVAL value)>
 
-Adds C<value> to the number and returns the result in C<*dest>.
+Adds C<value> to C<SELF> inplace.
 
 =cut
 
 */
 
-    void add_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + value);
+    PMC* add (PMC* value, PMC* dest) {
+MMD_Complex: {
+            FLOATVAL a = DYNSELF.get_number();
+            if (dest)
+                VTABLE_morph(INTERP, dest, value->vtable->base_type);
+            else
+                dest = pmc_new(INTERP, value->vtable->base_type);
+            VTABLE_set_number_native(INTERP, dest,
+                    a + VTABLE_get_number_keyed_int(INTERP, value, 0));
+            VTABLE_set_number_keyed_int(INTERP, dest, 1,
+                    VTABLE_get_number_keyed_int(INTERP, value, 1));
+            return dest;
+        }
+MMD_DEFAULT: {
+            if (!dest)
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
+            VTABLE_set_number_native(INTERP, dest,
+                    DYNSELF.get_number() + VTABLE_get_number(INTERP, value));
+            return dest;
+        }
     }
-/*
 
-=item C<void add_float(FLOATVAL value, PMC *dest)>
+    PMC* add_int (INTVAL value, PMC* dest) {
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        VTABLE_set_number_native(INTERP, dest,
+                DYNSELF.get_number() + (FLOATVAL)value);
+        return dest;
+    }
 
-Adds C<value> to the number and returns the result in C<*dest>.
+    PMC* add_float (FLOATVAL value, PMC* dest) {
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        VTABLE_set_number_native(INTERP, dest,
+                DYNSELF.get_number() + value);
+        return dest;
+    }
 
-=cut
+    void i_add (PMC* value) {
+MMD_Complex: {
+            FLOATVAL a = DYNSELF.get_number();
+            VTABLE_morph(INTERP, SELF, value->vtable->base_type);
+            VTABLE_set_number_native(INTERP, SELF,
+                    a + VTABLE_get_number_keyed_int(INTERP, value, 0));
+            VTABLE_set_number_keyed_int(INTERP, SELF, 1,
+                    VTABLE_get_number_keyed_int(INTERP, value, 1));
+        }
+MMD_DEFAULT: {
+            VTABLE_set_number_native(INTERP, SELF,
+                DYNSELF.get_number() + VTABLE_get_number(INTERP, value));
+        }
+    }
 
-*/
+    void i_add_int (INTVAL value) {
+        VTABLE_set_number_native(INTERP, SELF,
+            DYNSELF.get_number() + (FLOATVAL)value);
+    }
 
-    void add_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + value);
+    void i_add_float (FLOATVAL value) {
+        VTABLE_set_number_native(INTERP, SELF,
+            DYNSELF.get_number() + value);
     }
 
 /*

Modified: trunk/classes/integer.pmc
==============================================================================
--- trunk/classes/integer.pmc   (original)
+++ trunk/classes/integer.pmc   Fri Apr 15 07:21:57 2005
@@ -349,9 +349,9 @@
 
 /*
 
-=item C<void add_int(INTVAL value, PMC *dest)>
+=item C<PMC* add(PMC *value, PMC *dest)>
 
-=item C<void add(PMC *value, PMC *dest)>
+=item C<PMC* add_int(INTVAL value, PMC *dest)>
 
 Adds C<value> to the integer and returns the result in C<*dest>.
 
@@ -363,70 +363,117 @@
 =cut
 
 */
-    void add_int (INTVAL b, PMC* dest) {
+    PMC* add (PMC* value, PMC* dest) {
+MMD_Integer: {
+            /*
+             * SELF and value can both be PMCs that inherit
+             * from Integer:
+             *   cl = subclass "Integer", "MyInt"
+             * so we can't used PMC_int_val(SELF) in any of these
+             * Integer methods
+             *
+             * TODO
+             *   check for exact Integer type
+             *   e.g. MMD_Integer_EXACT
+             */
+
+            INTVAL a = VTABLE_get_integer(INTERP, SELF);
+            INTVAL b = VTABLE_get_integer(INTERP, value);
+            INTVAL c = a + b;
+            if ((c^a) >= 0 || (c^b) >= 0) {
+                if (!dest)
+                    dest = pmc_new(INTERP, SELF->vtable->base_type);
+                VTABLE_set_integer_native(INTERP, dest, c);
+                return dest;
+            }
+            else
+                return overflow(INTERP, SELF, b, dest, MMD_ADD);
+        }
+MMD_Complex: {
+            INTVAL a = DYNSELF.get_integer();
+            if (dest)
+                VTABLE_morph(INTERP, dest, value->vtable->base_type);
+            else
+                dest = pmc_new(INTERP, value->vtable->base_type);
+            VTABLE_set_number_native(INTERP, dest,
+                    a + VTABLE_get_number_keyed_int(INTERP, value, 0));
+            VTABLE_set_number_keyed_int(INTERP, dest, 1,
+                    VTABLE_get_number_keyed_int(INTERP, value, 1));
+            return dest;
+        }
+MMD_BigInt: {
+            return overflow_p(INTERP, SELF, value, dest, MMD_ADD);
+        }
+MMD_DEFAULT: {
+            if (!dest)
+                dest = pmc_new(INTERP, value->vtable->base_type);
+            VTABLE_set_number_native(INTERP, dest,
+                DYNSELF.get_integer() + VTABLE_get_number(INTERP, value));
+            return dest;
+        }
+    }
+
+    PMC* add_int (INTVAL b, PMC* dest) {
         /* INTVAL a = PMC_int_val(SELF); */
         INTVAL a = VTABLE_get_integer(INTERP, SELF);
         INTVAL c = a + b;
-        if ((c^a) >= 0 || (c^b) >= 0)
+        if ((c^a) >= 0 || (c^b) >= 0) {
+            if (!dest)
+                dest = pmc_new(INTERP, SELF->vtable->base_type);
             VTABLE_set_integer_native(INTERP, dest, c);
+            return dest;
+        }
         else
-            overflow(INTERP, SELF, b, dest, MMD_ADD);
+            return overflow(INTERP, SELF, b, dest, MMD_ADD);
     }
 
-    void add (PMC* value, PMC* dest) {
-MMD_Integer: {
-        /*
-         * SELF and value can both be PMCs that inherit
-         * from Integer:
-         *   cl = subclass "Integer", "MyInt"
-         * so we can't used PMC_int_val(SELF) in any of these
-         * Integer methods
-         *
-         * TODO
-         *   check for exact Integer type
-         *   e.g. MMD_Integer_EXACT
-         */
+/*
 
-        INTVAL a = VTABLE_get_integer(INTERP, SELF);
-        INTVAL b = VTABLE_get_integer(INTERP, value);
-        INTVAL c = a + b;
-        if ((c^a) >= 0 || (c^b) >= 0)
-            VTABLE_set_integer_native(INTERP, dest, c);
-        else
-            overflow(INTERP, SELF, b, dest, MMD_ADD);
-    }
+=item C<void i_add(PMC *value)>
+
+=item C<void i_add(INTVAL value)>
+
+=item C<void i_add(FLOATVAL value)>
+
+Adds C<value> to C<SELF> inplace.
+
+=cut
+
+*/
+
+    void i_add (PMC* value) {
+MMD_Integer: {
+            SELF.i_add_int(VTABLE_get_integer(INTERP, value));
+        }
 MMD_Complex: {
-        if (dest != SELF) {
-            VTABLE_morph(INTERP, dest, enum_class_Complex);
-            VTABLE_set_number_native(INTERP, dest,
-                    PMC_int_val(SELF) +
+            INTVAL a = DYNSELF.get_integer();
+            VTABLE_morph(INTERP, SELF, value->vtable->base_type);
+            VTABLE_set_number_native(INTERP, SELF,
+                    (FLOATVAL)a +
                     VTABLE_get_number_keyed_int(INTERP, value, 0));
-            VTABLE_set_number_keyed_int(INTERP, dest, 1,
+            VTABLE_set_number_keyed_int(INTERP, SELF, 1,
                     VTABLE_get_number_keyed_int(INTERP, value, 1));
-
-        }
-        else {
-            internal_exception(1, "Complex: unimp add self");
-        }
-    }
-MMD_BigInt: {
-            overflow_p(INTERP, SELF, value, dest, MMD_ADD);
-        }
-MMD_PerlUndef: {
-        Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-            "Use of uninitialized value in integer context");
-        VTABLE_set_integer_native(INTERP, dest, PMC_int_val(SELF));
-        }
-MMD_Float: {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_int_val(SELF) + PMC_num_val(value));
         }
 MMD_DEFAULT: {
-        VTABLE_set_number_native(INTERP, dest,
+        VTABLE_set_number_native(INTERP, SELF,
             PMC_int_val(SELF) + VTABLE_get_number(INTERP, value));
         }
     }
 
+    void i_add_int (INTVAL b) {
+        INTVAL a = DYNSELF.get_integer();
+        INTVAL c = a + b;
+        if ((c^a) >= 0 || (c^b) >= 0) {
+            VTABLE_set_integer_native(INTERP, SELF, c);
+        }
+        else
+            overflow(INTERP, SELF, b, SELF, MMD_SUBTRACT);
+    }
+
+    void i_add_float (FLOATVAL value) {
+        INTVAL a = DYNSELF.get_integer();
+        VTABLE_set_number_native(INTERP, SELF, a + value);
+    }
 /*
 
 =item C<PMC* subtract(PMC *value, PMC *dest)>

Modified: trunk/classes/perlstring.pmc
==============================================================================
--- trunk/classes/perlstring.pmc        (original)
+++ trunk/classes/perlstring.pmc        Fri Apr 15 07:21:57 2005
@@ -120,33 +120,13 @@
 
 */
 
-    void add (PMC * value, PMC* dest) {
-MMD_PerlString: {
-            /* work around MMD setup bug */
-            VTABLE_set_number_native(INTERP, dest,
-                    VTABLE_get_number(INTERP, SELF) +
-                    VTABLE_get_number(INTERP, value));
-        }
-MMD_PerlNum: {
-            VTABLE_set_number_native(INTERP, dest,
-                    VTABLE_get_number(INTERP, SELF) +
-                    PMC_num_val(value)
-                    );
-        }
-MMD_DEFAULT: {
-            FLOATVAL pmcf, valf;
-            INTVAL  pmci, vali;
-
-            pmcf = VTABLE_get_number(INTERP, SELF);
-            pmci = VTABLE_get_integer(INTERP, SELF);
-            valf = VTABLE_get_number(INTERP, value);
-            vali = VTABLE_get_integer(INTERP, value);
-
-            if (pmcf == pmci && valf == vali)
-                VTABLE_set_integer_native(INTERP, dest, pmci + vali);
-            else
-                VTABLE_set_number_native(INTERP, dest, pmcf + valf);
-        }
+    PMC* add (PMC * value, PMC* dest) {
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        VTABLE_set_number_native(INTERP, dest,
+                VTABLE_get_number(INTERP, SELF) +
+                VTABLE_get_number(INTERP, value));
+        return dest;
     }
 
 /*
@@ -160,35 +140,12 @@
 */
 
     PMC* subtract (PMC* value, PMC* dest) {
-MMD_PerlString: {
-            /* work around MMD setup bug */
-            VTABLE_set_number_native(INTERP, dest,
-                    VTABLE_get_number(INTERP, SELF) -
-                    VTABLE_get_number(INTERP, value));
-            return dest;        /* XXX */
-        }
-MMD_PerlNum: {
-            VTABLE_set_number_native(INTERP, dest,
-                    VTABLE_get_number(INTERP, SELF) -
-                    PMC_num_val(value)
-                    );
-            return dest;        /* XXX */
-        }
-MMD_DEFAULT: {
-            FLOATVAL pmcf, valf;
-            INTVAL  pmci, vali;
-
-            pmcf = VTABLE_get_number(INTERP, SELF);
-            pmci = VTABLE_get_integer(INTERP, SELF);
-            valf = VTABLE_get_number(INTERP, value);
-            vali = VTABLE_get_integer(INTERP, value);
-
-            if (pmcf == pmci && valf == vali)
-                VTABLE_set_integer_native(INTERP, dest, pmci - vali);
-            else
-                VTABLE_set_number_native(INTERP, dest, pmcf - valf);
-            return dest;        /* XXX */
-        }
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
+        VTABLE_set_number_native(INTERP, dest,
+                VTABLE_get_number(INTERP, SELF) -
+                VTABLE_get_number(INTERP, value));
+        return dest;
     }
 
 /*

Modified: trunk/classes/perlundef.pmc
==============================================================================
--- trunk/classes/perlundef.pmc (original)
+++ trunk/classes/perlundef.pmc Fri Apr 15 07:21:57 2005
@@ -167,45 +167,45 @@
 
 /*
 
-=item C<void add(PMC *value,  PMC *dest)>
+=item C<PMC* add(PMC *value,  PMC *dest)>
 
 =cut
 
 */
 
-    void add (PMC* value,  PMC* dest) {
+    PMC* add (PMC* value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
         "Use of uninitialized value in addition");
-        SUPER(value, dest);
+        return SUPER(value, dest);
     }
 
 /*
 
-=item C<void add_int(INTVAL value,  PMC *dest)>
+=item C<PMC* add_int(INTVAL value,  PMC *dest)>
 
 =cut
 
 */
 
-    void add_int (INTVAL value,  PMC* dest) {
+    PMC* add_int (INTVAL value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-        "Use of uninitialized value in integer addition");
-        VTABLE_set_integer_native(INTERP, dest, value);
+                "Use of uninitialized value in integer addition");
+        return SUPER(value, dest);
     }
 
 
 /*
 
-=item C<void add_float(FLOATVAL value,  PMC *dest)>
+=item C<PMC* add_float(FLOATVAL value,  PMC *dest)>
 
 =cut
 
 */
 
-    void add_float (FLOATVAL value,  PMC* dest) {
+    PMC* add_float (FLOATVAL value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-        "Use of uninitialized value in numeric addition");
-        VTABLE_set_number_native(INTERP, dest, value);
+                "Use of uninitialized value in numeric addition");
+        return SUPER(value, dest);
     }
 
 /*
@@ -218,7 +218,7 @@
 
     PMC* subtract (PMC* value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-        "Use of uninitialized value in subtraction");
+                "Use of uninitialized value in subtraction");
         return SUPER(value, dest);
     }
 
@@ -232,9 +232,8 @@
 
     PMC* subtract_int (INTVAL value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-        "Use of uninitialized value in integer subtraction");
-        VTABLE_set_integer_native(INTERP, dest, 0-value);
-        return dest;    /* XXX */
+                "Use of uninitialized value in integer subtraction");
+        return SUPER(value, dest);
     }
 
 
@@ -248,9 +247,8 @@
 
     PMC* subtract_float (FLOATVAL value,  PMC* dest) {
         Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
-        "Use of uninitialized value in numeric subtraction");
-        VTABLE_set_number_native(INTERP, dest, 0-value);
-        return dest;    /* XXX */
+                "Use of uninitialized value in numeric subtraction");
+        return SUPER(value, dest);
     }
 
 /*

Modified: trunk/classes/scalar.pmc
==============================================================================
--- trunk/classes/scalar.pmc    (original)
+++ trunk/classes/scalar.pmc    Fri Apr 15 07:21:57 2005
@@ -157,41 +157,43 @@
 
 =over 4
 
-=item C<void add_int(INTVAL value, PMC *dest)>
+=item C<PMC* add_int(INTVAL value, PMC *dest)>
 
 Adds C<value> to the scalar and returns the result in C<*dest>.
 
-TODO - overflow detection, bigint promotion?
-
 =cut
 
 */
 
-    void add_int (INTVAL value, PMC* dest) {
+    PMC* add_int (INTVAL value, PMC* dest) {
         INTVAL result;
 
         result = DYNSELF.get_integer() + value;
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
         VTABLE_set_integer_native(INTERP, dest, result);
+        return dest;
     }
 
 /*
 
-=item C<void add_float(FLOATVAL value, PMC *dest)>
+=item C<PMC* add_float(FLOATVAL value, PMC *dest)>
 
 Adds C<value> to the scalar and returns the result in C<*dest>.
 
-TODO - overflow detection, bigint promotion?
-
 =cut
 
 */
 
-    void add_float (FLOATVAL value, PMC* dest) {
+    PMC* add_float (FLOATVAL value, PMC* dest) {
         FLOATVAL result;
 
         result = DYNSELF.get_number() + value;
 
+        if (!dest)
+            dest = pmc_new(INTERP, SELF->vtable->base_type);
         VTABLE_set_number_native(INTERP, dest, result);
+        return dest;
     }
 
 /*

Modified: trunk/dynclasses/matchrange.pmc
==============================================================================
--- trunk/dynclasses/matchrange.pmc     (original)
+++ trunk/dynclasses/matchrange.pmc     Fri Apr 15 07:21:57 2005
@@ -339,11 +339,11 @@
 
 /*
 
-=item C<void add (PMC* value, PMC* dest)>
+=item C<PMC* add (PMC* value, PMC* dest)>
 
-=item C<void add_int (INTVAL value, PMC* dest)>
+=item C<PMC* add_int (INTVAL value, PMC* dest)>
 
-=item C<void add_float (FLOATVAL value, PMC* dest)>
+=item C<PMC* add_float (FLOATVAL value, PMC* dest)>
 
 Adds C<value> to the ending offset of the match range, placing the
 result in C<dest>.
@@ -352,25 +352,30 @@
 
 */
 
-    void add (PMC* value, PMC* dest) {
+    PMC* add (PMC* value, PMC* dest) {
         INTVAL v = VTABLE_get_integer(INTERP, dest);
-        SELF.add_int(v, dest);
+        return SELF.add_int(v, dest);
     }
 
-    void add_int (INTVAL value, PMC* dest) {
-        VTABLE_morph(INTERP, dest, MatchRange_type_id);
+    PMC* add_int (INTVAL value, PMC* dest) {
+        if (dest)
+            VTABLE_morph(INTERP, dest, MatchRange_type_id);
+        else
+            dest = pmc_new(INTERP,  MatchRange_type_id);
         if (RANGE_END(SELF) == -2) {
             if (RANGE_START(SELF) == -2) {
-                internal_exception(1, "MatchRange: cannot add to nonexistent 
range");
+                internal_exception(1,
+                    "MatchRange: cannot add to nonexistent range");
                 return;
             }
             RANGE_END(SELF) = RANGE_START(SELF);
         }
         RANGE_END(dest) = RANGE_END(SELF) + value;
+        return dest;
     }
 
-    void add_float (FLOATVAL value, PMC* dest) {
-        SELF.add_int((INTVAL) value, dest);
+    PMC* add_float (FLOATVAL value, PMC* dest) {
+        return SELF.add_int((INTVAL) value, dest);
     }
 
 /*

Modified: trunk/dynclasses/pyfloat.pmc
==============================================================================
--- trunk/dynclasses/pyfloat.pmc        (original)
+++ trunk/dynclasses/pyfloat.pmc        Fri Apr 15 07:21:57 2005
@@ -52,22 +52,6 @@
         return ret;
     }
 
-/*
-
-=item C<void add(PMC *value, PMC *dest)>
-
-Adds C<*value> to the number and returns the result in C<*dest>.
-
-=cut
-
-*/
-
-    void add (PMC* value, PMC* dest) {
-MMD_PyFloat: {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + PMC_num_val(value));
-        }
-    }
 
 /*
 

Modified: trunk/dynclasses/pyint.pmc
==============================================================================
--- trunk/dynclasses/pyint.pmc  (original)
+++ trunk/dynclasses/pyint.pmc  Fri Apr 15 07:21:57 2005
@@ -175,68 +175,6 @@
 
 /*
 
-=item C<void add(PMC *value, PMC *dest)>
-
-Adds C<*value> to the integer and returns the result in C<*dest>.
-
-=cut
-
-*/
-
-    void add (PMC* value, PMC* dest) {
-MMD_PyInt: {
-            INTVAL a = PMC_int_val(SELF);
-            INTVAL b = PMC_int_val(value);
-            INTVAL c = a + b;
-            if ((c^a) >= 0 || (c^b) >= 0)
-                VTABLE_set_integer_native(INTERP, dest, c);
-            else
-                overflow(INTERP, SELF, b, dest, MMD_ADD);
-            }
-MMD_PyFloat: {
-            INTVAL pmci = PMC_int_val(SELF);
-            FLOATVAL valf = VTABLE_get_number(INTERP, value);
-            VTABLE_morph(INTERP, dest, PyBuiltin_PyFloat);
-            VTABLE_set_number_native(INTERP, dest, pmci + valf);
-        }
-MMD_PyLong: {
-            promote(INTERP, SELF, value, dest, MMD_ADD);
-        }
-MMD_PyComplex: {
-            INTVAL pmci = PMC_int_val(SELF);
-            FLOATVAL valf = VTABLE_get_number_keyed_int(INTERP, value, 0);
-            VTABLE_morph(INTERP, dest, PyBuiltin_PyComplex);
-            VTABLE_set_number_keyed_int(INTERP, dest, 0, pmci + valf);
-            valf = VTABLE_get_number_keyed_int(INTERP, value, 1);
-            VTABLE_set_number_keyed_int(INTERP, dest, 1, valf);
-        }
-MMD_PyString: {
-            real_exception(INTERP, NULL, E_TypeError,
-               "TypeError: unsupported operand type(s) for +: 'int' and 
'str'");
-        }
-    }
-
-/*
-
-=item C<void add_int(INTVAL b, PMC* dest)>
-
-Adds C<b> to the integer and returns the result in C<*dest>.
-
-=cut
-
-*/
-
-    void add_int (INTVAL b, PMC* dest) {
-        INTVAL a = PMC_int_val(SELF);
-        INTVAL c = a + b;
-        if ((c^a) >= 0 || (c^b) >= 0)
-            VTABLE_set_integer_native(INTERP, dest, c);
-        else
-            overflow(INTERP, SELF, b, dest, MMD_ADD);
-    }
-
-/*
-
 =item C<void bitwise_and(INTVAL value, PMC *dest)>
 
 Calculates the bitwise C<AND> of the integer and C<*value> and returns

Modified: trunk/dynclasses/pylist.pmc
==============================================================================
--- trunk/dynclasses/pylist.pmc (original)
+++ trunk/dynclasses/pylist.pmc Fri Apr 15 07:21:57 2005
@@ -21,12 +21,12 @@
 #include "parrot/parrot.h"
 #include "pyconsts.h"
 
-static void quicksort(Interp* interpreter, List *list, PMC *cmpsub, 
-    INTVAL left, INTVAL right) 
+static void quicksort(Interp* interpreter, List *list, PMC *cmpsub,
+    INTVAL left, INTVAL right)
 {
     /* XXX: I don't understand why, but unless this statement is present,
-     * the scratchpad is corrupt (segfault in scratchpad_find) on exit 
-     * from quicksort on the first icmp test in t/pie/b3.t test #9 
+     * the scratchpad is corrupt (segfault in scratchpad_find) on exit
+     * from quicksort on the first icmp test in t/pie/b3.t test #9
      */
     PMC *pad = scratchpad_get_current(interpreter);
 
@@ -171,7 +171,7 @@
 
 /*
 
-=item C<void add(PMC *value, PMC *dest)>
+=item C<PMC* add(PMC *value, PMC *dest)>
 
 Adds C<*value> to the integer and returns the result in C<*dest>.
 
@@ -179,12 +179,14 @@
 
 */
 
-    void add (PMC* value, PMC* dest) {
+    PMC* add (PMC* value, PMC* dest) {
 MMD_PyList: {
             PMC *iter;
             INTVAL j;
 
-            if (dest != SELF) {
+            if (!dest)
+                dest = pmc_new(INTERP, PyBuiltin_PyList);
+            else if (dest != SELF) {
                 VTABLE_morph(INTERP, dest, PyBuiltin_PyList);
 
                 iter = VTABLE_get_iter(INTERP, SELF);
@@ -199,6 +201,7 @@
                 PMC *item = VTABLE_shift_pmc(INTERP, iter);
                 VTABLE_push_pmc(INTERP, dest, item);
             }
+            return dest;
         }
     }
 /*
@@ -356,12 +359,12 @@
             PMC * ret = pmc_new(INTERP, PyBuiltin_PyList);
             INTVAL n = end-start;
             INTVAL j;
-    
+
             for (j=0; j<n; j++) {
                 PMC *item = VTABLE_get_pmc_keyed_int(INTERP, SELF, start+j);
                 VTABLE_set_pmc_keyed_int(INTERP, ret, j, item);
             }
-    
+
             VTABLE_set_integer_native(INTERP, ret, n);
             return ret;
         }
@@ -648,7 +651,7 @@
 
 METHOD void sort(PMC *self, PMC *cmp_func) {
     INTVAL n;
-    if (REG_INT(3) < 2 || !VTABLE_get_bool(INTERP, cmp_func)) 
+    if (REG_INT(3) < 2 || !VTABLE_get_bool(INTERP, cmp_func))
         cmp_func = NULL;
     n = VTABLE_elements(INTERP, self);
     quicksort(INTERP, (List *) PMC_data(self), cmp_func, 0, n-1);

Modified: trunk/dynclasses/pylong.pmc
==============================================================================
--- trunk/dynclasses/pylong.pmc (original)
+++ trunk/dynclasses/pylong.pmc Fri Apr 15 07:21:57 2005
@@ -83,22 +83,6 @@
         return ret;
     }
 
-/*
-
-=item C<void add(PMC *value, PMC *dest)>
-
-Add C<*value> to the integer and returns the result in C<*dest>.
-
-=cut
-
-*/
-
-    void add (PMC* value, PMC* dest) {
-MMD_PyInt: {
-            INTVAL vali = VTABLE_get_integer(INTERP, value);
-            mmd_dispatch_v_pip(INTERP, SELF, vali, dest, MMD_ADD);
-        }
-    }
 
 /*
 

Modified: trunk/dynclasses/pystring.pmc
==============================================================================
--- trunk/dynclasses/pystring.pmc       (original)
+++ trunk/dynclasses/pystring.pmc       Fri Apr 15 07:21:57 2005
@@ -40,7 +40,7 @@
 
 /*
 
-=item C<PMC* "__getitem__"(PMC *self, PMC *index)>
+=item C<PMC* "__getitem__"(PMC *self, PMC *idx)>
 
 Returns the PMC value of the element at index C<key>.
 
@@ -48,22 +48,22 @@
 
 */
 
-    METHOD PMC* __getitem__(PMC *self, PMC *index) {
-        return VTABLE_get_pmc_keyed(INTERP, self, index);
+    METHOD PMC* __getitem__(PMC *self, PMC *idx) {
+        return VTABLE_get_pmc_keyed(INTERP, self, idx);
     }
 
 /*
 
-=item C<PMC* "__setitem__"(PMC *self, PMC *index, PMC *value)>
+=item C<PMC* "__setitem__"(PMC *self, PMC *idx, PMC *value)>
 
-Sets the PMC at element C<index> to C<*value>.
+Sets the PMC at element C<idx> to C<*value>.
 
 =cut
 
 */
 
-    METHOD void __setitem__(PMC *self, PMC *index, PMC *value) {
-        VTABLE_set_pmc_keyed(INTERP, self, index, value);
+    METHOD void __setitem__(PMC *self, PMC *idx, PMC *value) {
+        VTABLE_set_pmc_keyed(INTERP, self, idx, value);
     }
 
 /*
@@ -91,7 +91,7 @@
 
 /*
 
-=item C<void add(PMC *value, PMC *dest)>
+=item C<PMC* add(PMC *value, PMC *dest)>
 
 Concatenates C<*value> to the string and returns the result in C<*dest>.
 
@@ -99,8 +99,9 @@
 
 */
 
-    void add (PMC * value, PMC* dest) {
+    PMC* add (PMC * value, PMC* dest) {
         SELF.concatenate(value, dest);
+        return dest;
     }
 
 /*

Modified: trunk/dynclasses/tclfloat.pmc
==============================================================================
--- trunk/dynclasses/tclfloat.pmc       (original)
+++ trunk/dynclasses/tclfloat.pmc       Fri Apr 15 07:21:57 2005
@@ -90,164 +90,6 @@
         DYNSELF.morph(TclString_type);
         DYNSELF.set_string_native(value);
     }
-
-    void add (PMC* value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) +
-            VTABLE_get_number(INTERP, value)
-        );
-    }
-
-    void add_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + value);
-    }
-
-    void add_bignum (BIGNUM* value, PMC* dest) {
-        /* XXX */
-    }
-
-    void add_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) + value);
-    }
-
-    void multiply (PMC* value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) *
-            VTABLE_get_number(INTERP, value)
-        );
-    }
-
-    void multiply_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) * value
-        );
-    }
-
-    void multiply_bignum (BIGNUM* value, PMC* dest) {
-       /* XXX */
-    }
-
-    void multiply_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) * value);
-    }
-
-    void divide (PMC* value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) /
-            VTABLE_get_number(INTERP, value)
-        );
-    }
-
-    void divide_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) / value
-        );
-    }
-
-    void divide_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            PMC_num_val(SELF) / value
-        );
-    }
-
-    void cmodulus (PMC* value, PMC* dest) {
-        FLOATVAL f = VTABLE_get_number(INTERP, value);
-        VTABLE_set_number_native(INTERP, dest,
-            fmod(PMC_num_val(SELF), f));
-    }
-
-    void cmodulus_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            fmod(PMC_num_val(SELF), value));
-    }
-
-    void cmodulus_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            fmod(PMC_num_val(SELF), value));
-    }
-
-    void modulus (PMC* value, PMC* dest) {
-        FLOATVAL f = VTABLE_get_number(INTERP, value);
-        VTABLE_set_number_native(INTERP, dest,
-            floatval_mod(PMC_num_val(SELF), f));
-    }
-
-    void modulus_float (FLOATVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            floatval_mod(PMC_num_val(SELF), value));
-    }
-
-    void modulus_int (INTVAL value, PMC* dest) {
-        VTABLE_set_number_native(INTERP, dest,
-            floatval_mod(PMC_num_val(SELF), value));
-    }
-
-    void neg (PMC * dest) {
-        if (!dest)
-            PMC_num_val(SELF) = -PMC_num_val(SELF);
-        else
-            VTABLE_set_number_native(INTERP, dest, -PMC_num_val(SELF));
-    }
-
-    INTVAL is_equal (PMC* value) {
-        return (INTVAL)(PMC_num_val(SELF) == VTABLE_get_number(INTERP, value));
-    }
-
-    INTVAL cmp(PMC* value) {
-        FLOATVAL diff;
-        diff = PMC_num_val(SELF) - VTABLE_get_number(INTERP, value);
-        return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-    }
-
-    INTVAL cmp_num(PMC* value) {
-        FLOATVAL diff;
-        diff = PMC_num_val(SELF) - VTABLE_get_number(INTERP, value);
-        return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-    }
-
-    /* XXX why except? */
-    void repeat (PMC* value, PMC* dest) {
-        internal_exception(INVALID_OPERATION,
-            "repeat() not implemented in class 'TclFloat'");
-    }
-
-    void repeat_int (INTVAL value, PMC* dest) {
-        internal_exception(INVALID_OPERATION,
-            "repeat() not implemented in class 'TclFloat'");
-    }
-
-    void increment () {
-        PMC_num_val(SELF) ++;
-    }
-
-    void decrement () {
-        PMC_num_val(SELF) --;
-    }
-
-/*
-    void freeze(visit_info *info) {
-        IMAGE_IO *io = info->image_io;
-        SUPER(info);
-        io->vtable->push_float(INTERP, io, PMC_num_val(SELF));
-    }
-
-    void thaw(visit_info *info) {
-        IMAGE_IO *io = info->image_io;
-        SUPER(info);
-        if (info->extra_flags == EXTRA_IS_NULL)
-            PMC_num_val(SELF) = io->vtable->shift_float(INTERP, io);
-    }
-*/
-
-
-    FLOATVAL get_number () {
-        return PMC_num_val(SELF);
-    }
-
-
 }
 
 

Modified: trunk/dynclasses/tclint.pmc
==============================================================================
--- trunk/dynclasses/tclint.pmc (original)
+++ trunk/dynclasses/tclint.pmc Fri Apr 15 07:21:57 2005
@@ -62,344 +62,15 @@
         PMC_int_val(SELF) = PMC_int_val(value);
     }
 
-    void set_number (PMC* value) {
-        DYNSELF.morph(dynclass_TclFloat);
-        DYNSELF.set_number(value);
-    }
-
     void set_number_native (FLOATVAL value) {
         DYNSELF.morph(dynclass_TclFloat);
         DYNSELF.set_number_native(value);
     }
 
-    void set_string (PMC* value) {
-        DYNSELF.morph(dynclass_TclString);
-        DYNSELF.set_string(value);
-    }
-
     void set_string_native (STRING* value) {
         DYNSELF.morph(dynclass_TclString);
         DYNSELF.set_string_native(value);
     }
-
-    void add (PMC* value, PMC* dest) {
-        INTVAL pmci;
-        int vtype = VTABLE_type(INTERP, value);
-        FLOATVAL valf;
-        FLOATVAL sumf;
-
-        pmci = PMC_int_val(SELF);
-        valf = VTABLE_get_number(INTERP, value);
-        sumf = pmci + valf;
-        if (vtype == dynclass_TclFloat) {
-            VTABLE_set_number_native(INTERP, dest, sumf);
-            return;
-        }
-
-        {
-            INTVAL vali = (INTVAL) valf;
-            INTVAL   sumi = pmci + vali;
-            if (sumf == sumi)
-                VTABLE_set_integer_native(INTERP, dest, sumi);
-            else {
-                /* TODO BIG* promotion */
-                VTABLE_set_number_native(INTERP, dest, sumf);
-            }
-            return;
-
-        }
-    }
-
-    void multiply (PMC* value, PMC* dest) {
-        INTVAL pmci;
-        int vtype = VTABLE_type(INTERP, value);
-        FLOATVAL valf;
-        FLOATVAL mulf;
-
-        pmci = PMC_int_val(SELF);
-
-        valf = VTABLE_get_number(INTERP, value);
-        mulf = pmci * valf;
-
-        if (vtype == dynclass_TclFloat) {
-            VTABLE_set_number_native(INTERP, dest, mulf);
-            return;
-        }
-
-        {
-            INTVAL vali = (INTVAL) valf;
-            INTVAL   muli = pmci * vali;
-            if (mulf == muli)
-                VTABLE_set_integer_native(INTERP, dest, muli);
-            else {
-                /* TODO BIG* promotion */
-                VTABLE_set_number_native(INTERP, dest, mulf);
-            }
-            return;
-
-        }
-    }
-
-    void multiply_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) * value
-        );
-    }
-
-    void divide (PMC* value, PMC* dest) {
-        INTVAL pmci;
-        int vtype = VTABLE_type(INTERP, value);
-        FLOATVAL valf;
-        FLOATVAL divf;
-
-        /* TODO: Is this the appropriate way to throw the exception? */
-
-        pmci = PMC_int_val(SELF);
-        valf = VTABLE_get_number(INTERP, value);
-            if (valf == 0.0) {
-                internal_exception(DIV_BY_ZERO, "division by zero!");
-            return;
-        }
-
-        divf = pmci / valf;
-        if (vtype == dynclass_TclFloat) {
-            VTABLE_set_number_native(INTERP, dest, divf);
-            return;
-        }
-        {
-            INTVAL vali = (INTVAL) valf;
-            INTVAL   divi = pmci / vali;
-            /* if result is an integer or zero yield an integer */
-            if (divf == divi || !pmci)
-                VTABLE_set_integer_native(INTERP, dest, divi);
-            else {
-                /* TODO BIG* promotion */
-                VTABLE_set_number_native(INTERP, dest, divf);
-            }
-            return;
-
-        }
-    }
-
-    void divide_int (INTVAL value, PMC* dest) {
-        INTVAL pmci, divi;
-        FLOATVAL divf;
-
-        pmci = PMC_int_val(SELF);
-        /* TODO exception */
-        divf = (FLOATVAL)pmci / value;
-        divi = pmci / value;
-        if (divf == divi || !pmci)
-            VTABLE_set_integer_native(INTERP, dest, divi);
-        else {
-            /* TODO BIG* promotion */
-            VTABLE_set_number_native(INTERP, dest, divf);
-        }
-    }
-
-    void cmodulus (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-                                  PMC_int_val(SELF) %
-                                  VTABLE_get_integer(INTERP, value));
-    }
-
-    void cmodulus_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) % value);
-    }
-
-    void modulus (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            intval_mod(PMC_int_val(SELF),
-            VTABLE_get_integer(INTERP, value)));
-    }
-
-    void modulus_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            intval_mod(PMC_int_val(SELF), value));
-    }
-
-    void neg (PMC* dest) {
-        if (!dest)
-            PMC_int_val(SELF) = -PMC_int_val(SELF);
-        else
-            VTABLE_set_integer_native(INTERP, dest, -PMC_int_val(SELF));
-    }
-
-    void bitwise_or (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) |
-            VTABLE_get_integer(INTERP, value)
-        );
-    }
-
-    void bitwise_or_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) | value
-        );
-    }
-
-    void bitwise_and (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) &
-            VTABLE_get_integer(INTERP, value)
-        );
-    }
-
-    void bitwise_and_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) & value
-        );
-    }
-
-    void bitwise_xor (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) ^
-            VTABLE_get_integer(INTERP, value)
-        );
-    }
-
-    void bitwise_xor_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) ^ value
-        );
-    }
-
-    void bitwise_not (PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest, ~PMC_int_val(SELF));
-    }
-
-    void bitwise_shr (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) >>
-            VTABLE_get_integer(INTERP, value)
-        );
-    }
-
-    void bitwise_shr_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) >> value
-        );
-    }
-
-    void bitwise_shl (PMC* value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) <<
-            VTABLE_get_integer(INTERP, value)
-        );
-    }
-
-    void bitwise_shl_int (INTVAL value, PMC* dest) {
-        VTABLE_set_integer_native(INTERP, dest,
-            PMC_int_val(SELF) << value
-        );
-    }
-
-    INTVAL is_equal (PMC* value) {
-        return (INTVAL)(PMC_int_val(SELF) ==
-            VTABLE_get_integer(INTERP, value));
-    }
-
-    INTVAL cmp(PMC* value) {
-        if (value->vtable == Parrot_base_vtables[dynclass_TclString]) {
-            FLOATVAL fdiff = PMC_int_val(SELF)
-                - VTABLE_get_number(INTERP, value);
-            if (fdiff == 0) {
-                INTVAL idiff = PMC_int_val(SELF)
-                    - VTABLE_get_integer(INTERP, value);
-                return idiff > 0 ? 1 : idiff < 0 ? -1 : 0;
-            } else {
-                return fdiff > 0 ? 1 : -1;
-            }
-        }
-        else if (value->vtable == Parrot_base_vtables[dynclass_TclFloat]) {
-            FLOATVAL diff;
-            diff = (FLOATVAL)PMC_int_val(SELF)
-                - VTABLE_get_number(INTERP, value);
-            return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        }
-        else {
-            /* int */
-            INTVAL diff = PMC_int_val(SELF)
-                - VTABLE_get_integer(INTERP, value);
-            return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        }
-    }
-
-    INTVAL cmp_num(PMC* value) {
-        if (value->vtable == Parrot_base_vtables[dynclass_TclString]) {
-            FLOATVAL fdiff = PMC_int_val(SELF)
-                - VTABLE_get_number(INTERP, value);
-            if (fdiff == 0) {
-                INTVAL idiff = PMC_int_val(SELF)
-                    - VTABLE_get_integer(INTERP, value);
-                return idiff > 0 ? 1 : idiff < 0 ? -1 : 0;
-            } else {
-                return fdiff > 0 ? 1 : -1;
-            }
-        }
-        else if (value->vtable == Parrot_base_vtables[dynclass_TclFloat]) {
-            FLOATVAL diff;
-            diff = (FLOATVAL)PMC_int_val(SELF)
-                - VTABLE_get_number(INTERP, value);
-            return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        }
-        else {
-            /* int */
-            INTVAL diff = PMC_int_val(SELF)
-                - VTABLE_get_integer(INTERP, value);
-            return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        }
-    }
-
-    void logical_not (PMC* value) {
-        VTABLE_set_integer_native(INTERP, value, !PMC_int_val(SELF));
-    }
-
-
-    /* XXX we want exceptions here? */
-    void repeat (PMC* value, PMC* dest) {
-        internal_exception(INVALID_OPERATION,
-            "repeat() not implemented in class 'TclInt'");
-    }
-
-    void repeat_int (INTVAL value, PMC* dest) {
-        internal_exception(INVALID_OPERATION,
-        "repeat() not implemented in class 'TclInt'");
-    }
-
-
-    void increment () {
-        PMC_int_val(SELF) ++;
-    }
-
-    void decrement () {
-        PMC_int_val(SELF) --;
-    }
-
-/*
-    void freeze(visit_info *info) {
-        IMAGE_IO *io = info->image_io;
-        SUPER(info);
-        io->vtable->push_integer(INTERP, io, PMC_int_val(SELF));
-    }
-
-    void thaw(visit_info *info) {
-        IMAGE_IO *io = info->image_io;
-        SUPER(info);
-        if (info->extra_flags == EXTRA_IS_NULL)
-            PMC_int_val(SELF) = io->vtable->shift_integer(INTERP, io);
-    }
-*/
-
-    void set_integer_native (INTVAL value) {
-        PMC_int_val(SELF) = value;
-    }
-
-    INTVAL get_integer () {
-        return PMC_int_val(SELF);
-    }
-
 }
 
 

Modified: trunk/imcc/parser_util.c
==============================================================================
--- trunk/imcc/parser_util.c    (original)
+++ trunk/imcc/parser_util.c    Fri Apr 15 07:21:57 2005
@@ -331,7 +331,7 @@
 
 /* sub x, y, z  => infix .MMD_SUBTRACT, x, y, z */
 static char *
-to_infix(Interp *interpreter, char *name, SymReg **r, int *n)
+to_infix(Interp *interpreter, char *name, SymReg **r, int *n, int mmd_op)
 {
     SymReg *mmd;
     char buf[10];
@@ -340,7 +340,7 @@
     if (r[0]->set != 'P')
         return name;
     if (*n == 3 && r[0] == r[1]) {       /* cvt to inplace */
-        sprintf(buf, "%d", MMD_I_SUBTRACT);  /* XXX */
+        sprintf(buf, "%d", mmd_op + 1);  /* XXX */
         mmd = mk_const(interpreter, str_dup(buf), 'I');
     }
     else {
@@ -348,9 +348,9 @@
         for (i = *n; i > 0; --i)
             r[i] = r[i - 1];
         if (*n == 2)
-            sprintf(buf, "%d", MMD_I_SUBTRACT);  /* XXX */
+            sprintf(buf, "%d", mmd_op + 1);  /* XXX */
         else
-            sprintf(buf, "%d", MMD_SUBTRACT);  /* XXX */
+            sprintf(buf, "%d", mmd_op);  /* XXX */
         mmd = mk_const(interpreter, str_dup(buf), 'I');
         (*n)++;
     }
@@ -358,6 +358,17 @@
     return "infix";
 }
 
+static int
+is_infix(char *name)
+{
+    if (strcmp(name, "add") == 0)
+        return MMD_ADD;
+    if (strcmp(name, "sub") == 0)
+        return MMD_SUBTRACT;
+    return -1;
+}
+
+
 /* make a instruction
  * name ... op name
  * fmt ... optional format
@@ -381,9 +392,9 @@
     char format[128];
     int len;
 
-    if (strcmp(name, "sub") == 0) {     /* XXX is_infix */
+    if ( (op = is_infix(name)) >= 0) {
         /* sub x, y, z  => infix .MMD_SUBTRACT, x, y, z */
-        name = to_infix(interpreter, name, r, &n);
+        name = to_infix(interpreter, name, r, &n, op);
     }
 
 

Modified: trunk/imcc/t/syn/keyed.t
==============================================================================
--- trunk/imcc/t/syn/keyed.t    (original)
+++ trunk/imcc/t/syn/keyed.t    Fri Apr 15 07:21:57 2005
@@ -6,6 +6,9 @@
 use Parrot::Test tests => 1;
 
 ##############################
+SKIP: {
+  skipe("experimental", 1);
+
 pir_output_is(<<'CODE', <<'OUTPUT', "add_keyed");
 .sub test @MAIN
     new P0, .Array
@@ -25,4 +28,4 @@
 CODE
 42
 OUTPUT
-
+}

Modified: trunk/src/objects.c
==============================================================================
--- trunk/src/objects.c (original)
+++ trunk/src/objects.c Fri Apr 15 07:21:57 2005
@@ -1299,7 +1299,7 @@
     STRING *delimit;
     STRING *attr_name;
     STRING *obj_name;
-    int index, length;
+    int idx, length;
 
     if (!PObj_is_object_TEST(object))
         internal_exception(INTERNAL_NOT_IMPLEMENTED,
@@ -1317,12 +1317,12 @@
     delimit = string_from_cstring(interpreter, "\0", 1);
 
     /* Calculate the offset and the length of the attribute string. */
-    index  = string_str_index(interpreter, attr, delimit, 0) + 1;
-    length = string_length(interpreter, attr) - index;
+    idx  = string_str_index(interpreter, attr, delimit, 0) + 1;
+    length = string_length(interpreter, attr) - idx;
 
     /* Extract the attribute and object name. */
-    attr_name = string_substr(interpreter, attr, index, length, 0, 0);
-    obj_name = string_substr(interpreter, attr, 0, index-1, 0, 0);
+    attr_name = string_substr(interpreter, attr, idx, length, 0, 0);
+    obj_name = string_substr(interpreter, attr, 0, idx-1, 0, 0);
 
     real_exception(interpreter, NULL, ATTRIB_NOT_FOUND,
            "No such attribute '%Ss\\0%Ss'",

Modified: trunk/t/pmc/mmd.t
==============================================================================
--- trunk/t/pmc/mmd.t   (original)
+++ trunk/t/pmc/mmd.t   Fri Apr 15 07:21:57 2005
@@ -84,6 +84,7 @@
     $I2 = $I0 + $I1
     inc $I2
     lhs = $I2
+    .return (lhs)
 .end
 CODE
 3

Modified: trunk/t/pmc/objects.t
==============================================================================
--- trunk/t/pmc/objects.t       (original)
+++ trunk/t/pmc/objects.t       Fri Apr 15 07:21:57 2005
@@ -1048,6 +1048,8 @@
     new P12, .Integer
     add P12, P10, P11
     setattribute P7, I0, P12
+    set P5, P7
+    set I3, 1
     returncc
 .pcc_sub get_s:
     interpinfo P2, .INTERPINFO_CURRENT_OBJECT
@@ -1504,6 +1506,7 @@
    $I1 = right
    $I2 = $I0 + $I1
    dest = $I2
+   .return(dest)
 .end
 CODE
 in add

Modified: trunk/vtable.tbl
==============================================================================
--- trunk/vtable.tbl    (original)
+++ trunk/vtable.tbl    Fri Apr 15 07:21:57 2005
@@ -139,16 +139,18 @@
 void splice(PMC* value, INTVAL offset, INTVAL count)
 
 [MATH]
-void add(PMC* value, PMC* dest)             MMD_ADD
-void add_int(INTVAL value, PMC* dest)       MMD_ADD_INT
-void add_float(FLOATVAL value, PMC* dest)   MMD_ADD_FLOAT
+PMC* add(PMC* value, PMC* dest)             MMD_ADD
+PMC* add_int(INTVAL value, PMC* dest)       MMD_ADD_INT
+PMC* add_float(FLOATVAL value, PMC* dest)   MMD_ADD_FLOAT
+
+void i_add(PMC* value)                      MMD_I_ADD
+void i_add_int(INTVAL value)                MMD_I_ADD_INT
+void i_add_float(FLOATVAL value)            MMD_I_ADD_FLOAT
 
-# one for a test first
 PMC* subtract(PMC* value, PMC* dest)        MMD_SUBTRACT
 PMC* subtract_int(INTVAL value, PMC* dest)  MMD_SUBTRACT_INT
 PMC* subtract_float(FLOATVAL value, PMC* dest)  MMD_SUBTRACT_FLOAT
 
-# and inplace
 void i_subtract(PMC* value)                 MMD_I_SUBTRACT
 void i_subtract_int(INTVAL value)           MMD_I_SUBTRACT_INT
 void i_subtract_float(FLOATVAL value)       MMD_I_SUBTRACT_FLOAT

Reply via email to