conditional compilation for {Py2|Py3}-only special methods
authorLisandro Dalcin <dalcinl@gmail.com>
Wed, 18 Aug 2010 19:28:39 +0000 (16:28 -0300)
committerLisandro Dalcin <dalcinl@gmail.com>
Wed, 18 Aug 2010 19:28:39 +0000 (16:28 -0300)
Cython/Compiler/Nodes.py
Cython/Compiler/TypeSlots.py

index 0d5312c027d17063533aca92bb0e0ee759a68673..fab63c1a02b5d16c6dec063c2557420dd6b56789 100644 (file)
@@ -1237,6 +1237,18 @@ class FuncDefNode(StatNode, BlockNode):
         self.generate_cached_builtins_decls(lenv, code)
         # ----- Function header
         code.putln("")
+
+        preprocessor_guard = None
+        if self.entry.is_special:
+            slot = TypeSlots.method_name_to_slot.get(self.entry.name)
+            if slot:
+                preprocessor_guard = slot.preprocessor_guard_code()
+                if (self.entry.name == '__long__' and
+                    not self.entry.scope.lookup_here('__int__')):
+                    preprocessor_guard = None
+        if preprocessor_guard:
+            code.putln(preprocessor_guard)
+
         with_pymethdef = self.needs_assignment_synthesis(env, code)
         if self.py_func:
             self.py_func.generate_function_header(code, 
@@ -1464,6 +1476,10 @@ class FuncDefNode(StatNode, BlockNode):
             code.putln("return %s;" % Naming.retval_cname)
             
         code.putln("}")
+
+        if preprocessor_guard:
+            code.putln("#endif /*!(%s)*/" % preprocessor_guard)
+
         # ----- Go back and insert temp variable declarations
         tempvardecl_code.put_temp_declarations(code.funcstate)
         # ----- Python version
index b48b5c8dcee87aa425673b6fdc8cfe0adedef4d3..b4dbdda99f2bb607a97fe79797f114e505ce0e85 100644 (file)
@@ -142,29 +142,32 @@ class SlotDescriptor(object):
         self.py3 = py3
         self.py2 = py2
 
+    def preprocessor_guard_code(self):
+        ifdef = self.ifdef
+        py2 = self.py2
+        py3 = self.py3
+        guard = None
+        if ifdef:
+            guard = ("#if %s" % ifdef)
+        elif not py3 or py3 == '<RESERVED>':
+            guard = ("#if PY_MAJOR_VERSION < 3")
+        elif not py2:
+            guard = ("#if PY_MAJOR_VERSION >= 3")
+        return guard
+
     def generate(self, scope, code):
         if self.is_initialised_dynamically:
             value = 0
         else:
             value = self.slot_code(scope)
-        py3 = self.py3
-        py2 = self.py2
-        if self.ifdef:
-            code.putln("#if %s" % self.ifdef)
-        else:
-            if not py3:
-                code.putln("#if PY_MAJOR_VERSION < 3")
-            elif not py2:
-                code.putln("#if PY_MAJOR_VERSION >= 3")
-        if py3 == '<RESERVED>':
-            code.putln("#if PY_MAJOR_VERSION >= 3")
-            code.putln("0, /*reserved*/")
-            code.putln("#else")
-
+        preprocessor_guard = self.preprocessor_guard_code()
+        if preprocessor_guard:
+            code.putln(preprocessor_guard)
         code.putln("%s, /*%s*/" % (value, self.slot_name))
-        if py3 == '<RESERVED>':
-            code.putln("#endif")
-        if (not py3 or not py2) or self.ifdef:
+        if self.py3 == '<RESERVED>':
+            code.putln("#else")
+            code.putln("0, /*reserved*/")
+        if preprocessor_guard:
             code.putln("#endif")
 
     # Some C implementations have trouble statically