Leopold Toetsch wrote:
The Complex PMC arithmetic MMD vtables (add, subtract, divide) blindly assume that the RHS argument C<value> is complex too. This needs fixing and tests.

Fixed, tested. (the tests were there, only commented out)

I only added implementations for MMD_Complex and MMD_DEFAULT. I suppose more could be written, but how much is too much?

regards,
alexm
diff -rNu parrot/classes/complex.pmc my_parrot/classes/complex.pmc
--- parrot/classes/complex.pmc	Sun Oct  3 02:00:04 2004
+++ my_parrot/classes/complex.pmc	Thu Oct 14 19:47:13 2004
@@ -315,7 +315,7 @@
 
     void destroy () {
         mem_sys_free(PMC_struct_val(SELF));
-	PMC_struct_val(SELF) = NULL;
+        PMC_struct_val(SELF) = NULL;
     }
 
     void morph (INTVAL type) {
@@ -361,8 +361,7 @@
     }
 
     FLOATVAL get_number () {
-        internal_exception(1, "Complex: unimp get_number");
-        return (FLOATVAL)0;
+        return sqrt(RE(SELF)*RE(SELF) + IM(SELF)*IM(SELF));
     }
 
     STRING* get_string () {
@@ -598,9 +597,16 @@
 */
 
     void 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);
+        }
+MMD_DEFAULT: {
+        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        RE(dest) = RE(SELF) + VTABLE_get_number(INTERP, value);
+        IM(dest) = IM(SELF);
+        }
     }
 
     void add_int (INTVAL value, PMC* dest) {
@@ -630,9 +636,16 @@
 */
 
     void subtract (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);
+        }
+MMD_DEFAULT: {
+        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        RE(dest) = RE(SELF) - VTABLE_get_number(INTERP, value);
+        IM(dest) = IM(SELF);
+        }
     }
 
     void subtract_int (INTVAL value, PMC* dest) {
@@ -719,6 +732,7 @@
 */
 
     void divide (PMC* value, PMC* dest) {
+MMD_Complex: {
         FLOATVAL mod, re, im;
 
         VTABLE_morph(INTERP, dest, enum_class_Complex);
@@ -732,6 +746,12 @@
 
         RE(dest) = re;
         IM(dest) = im;
+        }
+MMD_DEFAULT: {
+        VTABLE_morph(INTERP, dest, enum_class_Complex);
+        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) {
diff -rNu parrot/t/pmc/complex.t my_parrot/t/pmc/complex.t
--- parrot/t/pmc/complex.t	Sat Oct  2 02:00:20 2004
+++ my_parrot/t/pmc/complex.t	Thu Oct 14 19:44:17 2004
@@ -180,11 +180,11 @@
     print P1
     print "\n"
 
-#    set P0, "2 + i"
-#    set P2, 3.3
-#    add P1, P0, P2
-#    print P1
-#    print "\n"
+    set P0, "2 + i"
+    set P2, 3.3
+    add P1, P0, P2
+    print P1
+    print "\n"
 
     set P0, "3 + 5i"
     add P1, P0, 2
@@ -203,6 +203,7 @@
 1+1i
 0-1i
 1-1i
+5.3+1i
 5+5i
 0+2i
 OUTPUT
@@ -233,11 +234,11 @@
     print P1
     print "\n"
 
-#    set P0, "1 - 4i"
-#    set P2, -1.0
-#    sub P1, P0, P2
-#    print P1
-#    print "\n"
+    set P0, "1 - 4i"
+    set P2, -1.0
+    sub P1, P0, P2
+    print P1
+    print "\n"
 
     set P0, "- 2 - 2i"
     sub P1, P0, -4
@@ -256,6 +257,7 @@
 1+1i
 0-1i
 -1-1i
+2-4i
 2-2i
 1.8+1i
 OUTPUT
@@ -286,11 +288,11 @@
     print P1
     print "\n"
 
-#    set P0, "2 - 2i"
-#    set P2, 0.5
-#    mul P1, P0, P2
-#    print P1
-#    print "\n"
+    set P0, "2 - 2i"
+    set P2, 0.5
+    mul P1, P0, P2
+    print P1
+    print "\n"
 
     set P0, "1 - i"
     mul P1, P0, 2
@@ -309,6 +311,7 @@
 5+2i
 0+3i
 3+6i
+1-1i
 2-2i
 1-1i
 OUTPUT
@@ -339,11 +342,11 @@
     print P1
     print "\n"
 
-#    set P0, "-3 + 6i"
-#    set P2, 3.0
-#    div P1, P0, P2
-#    print P1
-#    print "\n"
+    set P0, "-3 + 6i"
+    set P2, 3.0
+    div P1, P0, P2
+    print P1
+    print "\n"
 
     set P0, "-2 + 3i"
     div P1, P0, 2
@@ -362,44 +365,44 @@
 5-3i
 25+0i
 3-4i
+-1+2i
 -1+1.5i
 4-6i
 OUTPUT
 
-SKIP: {
-  skip("modulus not implemented", 1);
-output_is(<<'CODE', <<'OUTPUT', "get int/num/bool");
+output_is(<<"CODE", <<'OUTPUT', "get int/num/bool");
[EMAIL PROTECTED] $fp_equality_macro ]}
         new P0, .Complex
-        set P0, "1.6 - .9i"
+        set P0, "2 - 1.5i"
         print P0
-        print "\n"
+        print "\\n"
 
         set I0, P0
         print I0
-        print "\n"
+        print "\\n"
 
         set N0, P0
-        print N0
-        print "\n"
+        .fp_eq( N0, 2.5, OK )
+        print "not "
+OK:     print "ok\\n"
 
         if P0, TRUE
         print "not "
-TRUE:   print "true\n"
+TRUE:   print "true\\n"
 
         set P0, "0"
         unless P0, FALSE
         print "not "
-FALSE:  print "false\n"
+FALSE:  print "false\\n"
 
         end
 CODE
-1.6-0.9i
+2-1.5i
 2
-2.5
+ok
 true
 false
 OUTPUT
-}
 
 output_is(<<"CODE", <<'OUTPUT', "get keyed");
 @{[ $fp_equality_macro ]}

Reply via email to