Commit e9f4217b authored by Lisandro Dalcin's avatar Lisandro Dalcin

conditional compilation for {Py2|Py3}-only special methods

parent b3a72122
...@@ -1237,6 +1237,18 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -1237,6 +1237,18 @@ class FuncDefNode(StatNode, BlockNode):
self.generate_cached_builtins_decls(lenv, code) self.generate_cached_builtins_decls(lenv, code)
# ----- Function header # ----- Function header
code.putln("") 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) with_pymethdef = self.needs_assignment_synthesis(env, code)
if self.py_func: if self.py_func:
self.py_func.generate_function_header(code, self.py_func.generate_function_header(code,
...@@ -1464,6 +1476,10 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -1464,6 +1476,10 @@ class FuncDefNode(StatNode, BlockNode):
code.putln("return %s;" % Naming.retval_cname) code.putln("return %s;" % Naming.retval_cname)
code.putln("}") code.putln("}")
if preprocessor_guard:
code.putln("#endif /*!(%s)*/" % preprocessor_guard)
# ----- Go back and insert temp variable declarations # ----- Go back and insert temp variable declarations
tempvardecl_code.put_temp_declarations(code.funcstate) tempvardecl_code.put_temp_declarations(code.funcstate)
# ----- Python version # ----- Python version
......
...@@ -142,29 +142,32 @@ class SlotDescriptor(object): ...@@ -142,29 +142,32 @@ class SlotDescriptor(object):
self.py3 = py3 self.py3 = py3
self.py2 = py2 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): def generate(self, scope, code):
if self.is_initialised_dynamically: if self.is_initialised_dynamically:
value = 0 value = 0
else: else:
value = self.slot_code(scope) value = self.slot_code(scope)
py3 = self.py3 preprocessor_guard = self.preprocessor_guard_code()
py2 = self.py2 if preprocessor_guard:
if self.ifdef: code.putln(preprocessor_guard)
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")
code.putln("%s, /*%s*/" % (value, self.slot_name)) code.putln("%s, /*%s*/" % (value, self.slot_name))
if py3 == '<RESERVED>': if self.py3 == '<RESERVED>':
code.putln("#endif") code.putln("#else")
if (not py3 or not py2) or self.ifdef: code.putln("0, /*reserved*/")
if preprocessor_guard:
code.putln("#endif") code.putln("#endif")
# Some C implementations have trouble statically # Some C implementations have trouble statically
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment