From e9f4217bc1a23cf4e8315b77de23bb21ef3a3841 Mon Sep 17 00:00:00 2001 From: Lisandro Dalcin Date: Wed, 18 Aug 2010 16:28:39 -0300 Subject: [PATCH] conditional compilation for {Py2|Py3}-only special methods --- Cython/Compiler/Nodes.py | 16 ++++++++++++++++ Cython/Compiler/TypeSlots.py | 37 +++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 0d5312c0..fab63c1a 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -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 diff --git a/Cython/Compiler/TypeSlots.py b/Cython/Compiler/TypeSlots.py index b48b5c8d..b4dbdda9 100644 --- a/Cython/Compiler/TypeSlots.py +++ b/Cython/Compiler/TypeSlots.py @@ -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 == '': + 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 == '': - 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 == '': - code.putln("#endif") - if (not py3 or not py2) or self.ifdef: + if self.py3 == '': + code.putln("#else") + code.putln("0, /*reserved*/") + if preprocessor_guard: code.putln("#endif") # Some C implementations have trouble statically -- 2.26.2