I've done some work in this problem. The attached patch is a way to make
the examples work but I think this is not the way to go, or a lot of
functions in a lot of pmc will need changes.
Index: src/pmc/complex.pmc
===================================================================
--- src/pmc/complex.pmc (revision 31697)
+++ src/pmc/complex.pmc (working copy)
@@ -758,14 +758,21 @@
*/
MULTI PMC *subtract(Complex value, PMC *dest) {
- if (dest)
- VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+ if (dest) {
+ if(! VTABLE_isa(INTERP, dest, CONST_STRING(INTERP, 'Complex')))
+ VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
+ }
else
- dest = pmc_new(INTERP, SELF->vtable->base_type);
+ dest = VTABLE_clone(INTERP, SELF);
- RE(dest) = RE(SELF) - RE(value);
- IM(dest) = IM(SELF) - IM(value);
-
+ {
+ FLOATVAL re1 = VTABLE_get_number_keyed_int(INTERP, SELF, 0);
+ FLOATVAL im1 = VTABLE_get_number_keyed_int(INTERP, SELF, 1);
+ FLOATVAL re2 = VTABLE_get_number_keyed_int(INTERP, value, 0);
+ FLOATVAL im2 = VTABLE_get_number_keyed_int(INTERP, value, 1);
+ VTABLE_set_number_keyed_int(INTERP, dest, 0, re1 - re2);
+ VTABLE_set_number_keyed_int(INTERP, dest, 1, im1 - im2);
+ }
return dest;
}