Commit ee65439e authored by Robert Bradshaw's avatar Robert Bradshaw

Use PY_VERSION_HEX rather than sys.version_info for typeslot versioning.

so the generated c files don't depend on the version of python used to run Cython
parent 29126ac3
...@@ -56,3 +56,7 @@ c_api_tab_cname = pyrex_prefix + "c_api_tab" ...@@ -56,3 +56,7 @@ c_api_tab_cname = pyrex_prefix + "c_api_tab"
gilstate_cname = pyrex_prefix + "state" gilstate_cname = pyrex_prefix + "state"
extern_c_macro = pyrex_prefix.upper() + "EXTERN_C" extern_c_macro = pyrex_prefix.upper() + "EXTERN_C"
def py_version_hex(major, minor=0, micro=0, release_level=0, release_serial=0):
return (major << 24) | (minor << 16) | (micro << 8) | (release_level << 4) | (release_serial)
...@@ -105,20 +105,22 @@ class SlotDescriptor: ...@@ -105,20 +105,22 @@ 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, min_version=(2,2), dynamic = 0): def __init__(self, slot_name, min_version=None, dynamic = 0):
self.slot_name = slot_name self.slot_name = slot_name
self.is_initialised_dynamically = dynamic self.is_initialised_dynamically = dynamic
self.min_version = min_version self.min_version = min_version
def generate(self, scope, code): def generate(self, scope, code):
if sys.version_info[0:2] < self.min_version:
return # not supported yet
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_version:
code.putln("#if PY_VERSION_HEX >= 0x%X" % Naming.py_version_hex(*self.min_version))
code.putln("%s, /*%s*/" % (value, self.slot_name)) code.putln("%s, /*%s*/" % (value, self.slot_name))
if self.min_version:
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
...@@ -161,7 +163,7 @@ class GCDependentSlot(SlotDescriptor): ...@@ -161,7 +163,7 @@ class GCDependentSlot(SlotDescriptor):
# the type participates in GC. # the type participates in GC.
def __init__(self, slot_name, no_gc_value, gc_value, dynamic = 0): def __init__(self, slot_name, no_gc_value, gc_value, dynamic = 0):
SlotDescriptor.__init__(self, slot_name, dynamic) SlotDescriptor.__init__(self, slot_name, dynamic = dynamic)
self.no_gc_value = no_gc_value self.no_gc_value = no_gc_value
self.gc_value = gc_value self.gc_value = gc_value
...@@ -179,7 +181,7 @@ class MethodSlot(SlotDescriptor): ...@@ -179,7 +181,7 @@ 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, min_version=(2,2), default = None): def __init__(self, signature, slot_name, method_name, min_version=None, default = None):
SlotDescriptor.__init__(self, slot_name, min_version) SlotDescriptor.__init__(self, slot_name, min_version)
self.signature = signature self.signature = signature
self.slot_name = slot_name self.slot_name = slot_name
......
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