Hello,

SIP does not currently support __truediv__. The attached patch lets the user manually define it through %MethodCode in a SIP file.

I think SIP should also automatically generate __truediv__ for operator/, with exactly the same code that it uses for __div__. In fact, the difference between __truediv__ and __div__ exists only for builtin int/float types, for backward compatibility: any other user-defined type should define both slots to the same code.

Phile, how do I make SIP generate __truediv__ code exactly like it does for __div__? Or if you have time to handle this yourself, be my guest, I'll just sit, relax and grab the snapshot :)

Thanks!
--
Giovanni Bajo
Index: siplib/sip.h
===================================================================
--- siplib/sip.h        (revision 9342)
+++ siplib/sip.h        (working copy)
@@ -295,7 +295,8 @@
        repr_slot,                      /* __repr__ */
        hash_slot,                      /* __hash__ */
        pos_slot,                       /* __pos__ */
-       abs_slot                        /* __abs__ */
+       abs_slot,                       /* __abs__ */
+        truediv_slot,                  /* __truediv__ */
 } sipPySlotType;
 
 
Index: siplib/siplib.c
===================================================================
--- siplib/siplib.c     (revision 9342)
+++ siplib/siplib.c     (working copy)
@@ -6484,6 +6484,12 @@
                                        nb->nb_divide = (binaryfunc)f;
                        break;
 
+               case truediv_slot:
+                       if (nb != NULL)
+                               if (force || nb->nb_true_divide == NULL)
+                                       nb->nb_true_divide = (binaryfunc)f;
+                       break;
+
                case mod_slot:
                        if (nb != NULL)
                                if (force || nb->nb_remainder == NULL)
Index: sipgen/sip.h
===================================================================
--- sipgen/sip.h        (revision 9342)
+++ sipgen/sip.h        (working copy)
@@ -358,7 +358,8 @@
        abs_slot,
        repr_slot,
        hash_slot,
-       no_slot
+       no_slot,
+        truediv_slot
 } slotType;
 
 
Index: sipgen/gencode.c
===================================================================
--- sipgen/gencode.c    (revision 9342)
+++ sipgen/gencode.c    (working copy)
@@ -3863,7 +3863,7 @@
        slotType st = md -> slot;
 
        return (st == add_slot || st == sub_slot || st == mul_slot ||
-               st == div_slot || st == mod_slot ||
+               st == div_slot || st == truediv_slot || st == mod_slot ||
                st == and_slot || st == or_slot || st == xor_slot ||
                st == lshift_slot || st == rshift_slot);
 }
@@ -7369,6 +7369,10 @@
                sn = "div_slot";
                break;
 
+       case truediv_slot:
+               sn = "truediv_slot";
+               break;
+
        case mod_slot:
                sn = "mod_slot";
                break;
@@ -8777,6 +8781,10 @@
                        generateNumberSlotCall(od,"/",fp);
                        break;
 
+               case truediv_slot:
+                       generateNumberSlotCall(od,"/",fp);
+                       break;
+
                case mod_slot:
                        generateNumberSlotCall(od,"%",fp);
                        break;
@@ -9965,6 +9973,10 @@
                pt2 = "/";
                break;
 
+       case truediv_slot:
+               pt2 = "/";
+               break;
+
        case mod_slot:
                pt2 = "%";
                break;
Index: sipgen/parser.c
===================================================================
--- sipgen/parser.c     (revision 9342)
+++ sipgen/parser.c     (working copy)
@@ -6698,6 +6698,7 @@
                {"__sub__", sub_slot, FALSE, 1},
                {"__mul__", mul_slot, FALSE, 1},
                {"__div__", div_slot, FALSE, 1},
+                {"__truediv__", truediv_slot, FALSE, 1},
                {"__mod__", mod_slot, FALSE, 1},
                {"__and__", and_slot, FALSE, 1},
                {"__or__", or_slot, FALSE, 1},
Index: sipdistutils.py
===================================================================
--- sipdistutils.py     (revision 9342)
+++ sipdistutils.py     (working copy)
@@ -5,7 +5,7 @@
 # Based on Pyrex.Distutils, written by Graham Fawcett and Darrel Gallion.
 
 import distutils.command.build_ext
-from distutils.dep_util import newer
+from distutils.dep_util import newer, newer_group
 import os
 import sys
 
@@ -48,10 +48,18 @@
         # Add the SIP include directory to the include path
         if extension is not None:
             extension.include_dirs.append(self._sip_inc_dir())
+            depends = extension.depends
         else:
             # pre-2.4 compatibility
             self.include_dirs.append(self._sip_inc_dir())
+            depends = []  # ?
 
+        # Filter dependencies list: we are interested only in .sip files,
+        # since the main .sip files can only depend on additional .sip
+        # files. For instance, if a .h changes, there is no need to
+        # run sip again.
+        depends = [f for f in depends if os.path.splitext(f)[1] == ".sip"]
+
         # Create the temporary directory if it does not exist already
         if not os.path.isdir(self.build_temp):
             os.makedirs(self.build_temp)
@@ -67,8 +75,8 @@
         for sip in sip_sources:
             # Use the sbf file as dependency check
             sipbasename = os.path.basename(sip)
-            sbf = os.path.join(self.build_temp, replace_suffix(sipbasename, 
"sbf"))
-            if newer(sip, sbf) or self.force:
+            sbf = os.path.join(self.build_temp, replace_suffix(sipbasename, 
".sbf"))
+            if newer_group([sip]+depends, sbf) or self.force:
                 self._sip_compile(sip_bin, sip, sbf)
             out = self._get_sip_output_list(sbf)
             generated_sources.extend(out)
_______________________________________________
PyKDE mailing list    PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to