Commit a3536927 authored by Stefan Behnel's avatar Stefan Behnel

support method slots specific to a Python version

parent 974520e5
...@@ -88,7 +88,10 @@ class CCodeWriter: ...@@ -88,7 +88,10 @@ class CCodeWriter:
F = open(file).readlines() F = open(file).readlines()
self.input_file_contents[file] = F self.input_file_contents[file] = F
return F return F
def get_py_version_hex(self, pyversion):
return "0x%02X%02X%02X%02X" % (tuple(pyversion) + (0,0,0,0))[:4]
def mark_pos(self, pos): def mark_pos(self, pos):
file, line, col = pos file, line, col = pos
contents = self.file_contents(file) contents = self.file_contents(file)
......
...@@ -104,17 +104,23 @@ class SlotDescriptor: ...@@ -104,17 +104,23 @@ class SlotDescriptor:
# slot_name string Member name of the slot in the type object # slot_name string Member name of the slot in the type object
# is_initialised_dynamically Is initialised by code in the module init function # is_initialised_dynamically Is initialised by code in the module init function
def __init__(self, slot_name, dynamic = 0): def __init__(self, slot_name, dynamic = 0, min_python_version = None):
self.slot_name = slot_name self.slot_name = slot_name
self.is_initialised_dynamically = dynamic self.is_initialised_dynamically = dynamic
self.min_python_version = min_python_version
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)
if self.min_python_version is not None:
code.putln("#if PY_VERSION_HEX >= " +
code.get_py_version_hex(self.min_python_version))
code.putln("%s, /*%s*/" % (value, self.slot_name)) code.putln("%s, /*%s*/" % (value, self.slot_name))
if self.min_python_version is not None:
code.putln("#endif")
# Some C implementations have trouble statically # Some C implementations have trouble statically
# initialising a global with a pointer to an extern # initialising a global with a pointer to an extern
# function, so we initialise some of the type slots # function, so we initialise some of the type slots
...@@ -175,8 +181,10 @@ class MethodSlot(SlotDescriptor): ...@@ -175,8 +181,10 @@ class MethodSlot(SlotDescriptor):
# method_name string The __xxx__ name of the method # method_name string The __xxx__ name of the method
# default string or None Default value of the slot # default string or None Default value of the slot
def __init__(self, signature, slot_name, method_name, default = None): def __init__(self, signature, slot_name, method_name,
SlotDescriptor.__init__(self, slot_name) default = None, min_python_version = None):
SlotDescriptor.__init__(self, slot_name,
min_python_version = min_python_version)
self.signature = signature self.signature = signature
self.slot_name = slot_name self.slot_name = slot_name
self.method_name = method_name self.method_name = method_name
...@@ -493,7 +501,7 @@ PyNumberMethods = ( ...@@ -493,7 +501,7 @@ PyNumberMethods = (
MethodSlot(ibinaryfunc, "nb_inplace_true_divide", "__itruediv__"), MethodSlot(ibinaryfunc, "nb_inplace_true_divide", "__itruediv__"),
# Added in release 2.5 # Added in release 2.5
MethodSlot(unaryfunc, "nb_index", "__index__"), MethodSlot(unaryfunc, "nb_index", "__index__", min_python_version=(2,5)),
) )
PySequenceMethods = ( PySequenceMethods = (
......
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