diff options
| author | arcadia-devtools <[email protected]> | 2022-05-31 21:49:01 +0300 | 
|---|---|---|
| committer | arcadia-devtools <[email protected]> | 2022-05-31 21:49:01 +0300 | 
| commit | ceb13dcc40dd5e11c8e3189b3c15b3bd5897d4ac (patch) | |
| tree | eda501e07fcaba4f64bc3d29725472162f2e4227 /contrib/tools/cython/Cython/Compiler | |
| parent | 5b69557e440e6ac18399a29076fef25602859f17 (diff) | |
intermediate changes
ref:85306a27df0004d13faf777131d0b092370e6b90
Diffstat (limited to 'contrib/tools/cython/Cython/Compiler')
| -rw-r--r-- | contrib/tools/cython/Cython/Compiler/Builtin.py | 15 | ||||
| -rw-r--r-- | contrib/tools/cython/Cython/Compiler/Code.py | 4 | ||||
| -rw-r--r-- | contrib/tools/cython/Cython/Compiler/Nodes.py | 6 | ||||
| -rw-r--r-- | contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py | 26 | ||||
| -rw-r--r-- | contrib/tools/cython/Cython/Compiler/TypeSlots.py | 14 | 
5 files changed, 46 insertions, 19 deletions
diff --git a/contrib/tools/cython/Cython/Compiler/Builtin.py b/contrib/tools/cython/Cython/Compiler/Builtin.py index 5fa717507d8..e0d203ae027 100644 --- a/contrib/tools/cython/Cython/Compiler/Builtin.py +++ b/contrib/tools/cython/Cython/Compiler/Builtin.py @@ -271,12 +271,10 @@ builtin_types_table = [                                      ]),      ("bytearray", "PyByteArray_Type", [                                      ]), -    ("bytes",   "PyBytes_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"), -                                    BuiltinMethod("join",  "TO",   "O", "__Pyx_PyBytes_Join", +    ("bytes",   "PyBytes_Type",    [BuiltinMethod("join",  "TO",   "O", "__Pyx_PyBytes_Join",                                                    utility_code=UtilityCode.load("StringJoin", "StringTools.c")),                                      ]), -    ("str",     "PyString_Type",   [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"), -                                    BuiltinMethod("join",  "TO",   "O", "__Pyx_PyString_Join", +    ("str",     "PyString_Type",   [BuiltinMethod("join",  "TO",   "O", "__Pyx_PyString_Join",                                                    builtin_return_type='basestring',                                                    utility_code=UtilityCode.load("StringJoin", "StringTools.c")),                                      ]), @@ -284,11 +282,9 @@ builtin_types_table = [                                      BuiltinMethod("join",  "TO",   "T", "PyUnicode_Join"),                                      ]), -    ("tuple",   "PyTuple_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"), -                                    ]), +    ("tuple",   "PyTuple_Type",    []), -    ("list",    "PyList_Type",     [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"), -                                    BuiltinMethod("insert",  "TzO",  "r", "PyList_Insert"), +    ("list",    "PyList_Type",     [BuiltinMethod("insert",  "TzO",  "r", "PyList_Insert"),                                      BuiltinMethod("reverse", "T",    "r", "PyList_Reverse"),                                      BuiltinMethod("append",  "TO",   "r", "__Pyx_PyList_Append",                                                    utility_code=UtilityCode.load("ListAppend", "Optimize.c")), @@ -326,8 +322,7 @@ builtin_types_table = [                                      ]),  #    ("file",    "PyFile_Type",     []),  # not in Py3 -    ("set",       "PySet_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"), -                                    BuiltinMethod("clear",   "T",  "r", "PySet_Clear"), +    ("set",       "PySet_Type",    [BuiltinMethod("clear",   "T",  "r", "PySet_Clear"),                                      # discard() and remove() have a special treatment for unhashable values                                      BuiltinMethod("discard", "TO", "r", "__Pyx_PySet_Discard",                                                    utility_code=UtilityCode.load("py_set_discard", "Optimize.c")), diff --git a/contrib/tools/cython/Cython/Compiler/Code.py b/contrib/tools/cython/Cython/Compiler/Code.py index f43c4b2b8e5..45c5a325cf8 100644 --- a/contrib/tools/cython/Cython/Compiler/Code.py +++ b/contrib/tools/cython/Cython/Compiler/Code.py @@ -2233,8 +2233,8 @@ class CCodeWriter(object):          method_flags = entry.signature.method_flags()          if not method_flags:              return -        if entry.is_special: -            from . import TypeSlots +        from . import TypeSlots +        if entry.is_special or TypeSlots.is_reverse_number_slot(entry.name):              method_flags += [TypeSlots.method_coexist]          func_ptr = wrapper_code_writer.put_pymethoddef_wrapper(entry) if wrapper_code_writer else entry.func_cname          # Add required casts, but try not to shadow real warnings. diff --git a/contrib/tools/cython/Cython/Compiler/Nodes.py b/contrib/tools/cython/Cython/Compiler/Nodes.py index 6436c5002d6..c5be70040c8 100644 --- a/contrib/tools/cython/Cython/Compiler/Nodes.py +++ b/contrib/tools/cython/Cython/Compiler/Nodes.py @@ -3461,7 +3461,7 @@ class DefNodeWrapper(FuncDefNode):                      docstr.as_c_string_literal()))              if entry.is_special: -                code.putln('#if CYTHON_COMPILING_IN_CPYTHON') +                code.putln('#if CYTHON_UPDATE_DESCRIPTOR_DOC')                  code.putln(                      "struct wrapperbase %s;" % entry.wrapperbase_cname)                  code.putln('#endif') @@ -4957,7 +4957,7 @@ class CClassDefNode(ClassDefNode):                      preprocessor_guard = slot.preprocessor_guard_code() if slot else None                      if preprocessor_guard:                          code.putln(preprocessor_guard) -                    code.putln('#if CYTHON_COMPILING_IN_CPYTHON') +                    code.putln('#if CYTHON_UPDATE_DESCRIPTOR_DOC')                      code.putln("{")                      code.putln(                          'PyObject *wrapper = PyObject_GetAttrString((PyObject *)&%s, "%s"); %s' % ( @@ -7703,6 +7703,8 @@ class TryFinallyStatNode(StatNode):      def generate_function_definitions(self, env, code):          self.body.generate_function_definitions(env, code)          self.finally_clause.generate_function_definitions(env, code) +        if self.finally_except_clause: +            self.finally_except_clause.generate_function_definitions(env, code)      def put_error_catcher(self, code, temps_to_clean_up, exc_vars,                            exc_lineno_cnames=None, exc_filename_cname=None): diff --git a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py index 0da3670caee..8e0cbc30352 100644 --- a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py +++ b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py @@ -1701,7 +1701,23 @@ if VALUE is not None:                      e.type.create_to_py_utility_code(env)                      e.type.create_from_py_utility_code(env)              all_members_names = sorted([e.name for e in all_members]) -            checksum = '0x%s' % hashlib.md5(' '.join(all_members_names).encode('utf-8')).hexdigest()[:7] + +            # Cython 0.x used MD5 for the checksum, which a few Python installations remove for security reasons. +            # SHA-256 should be ok for years to come, but early Cython 3.0 alpha releases used SHA-1, +            # which may not be. +            checksum_algos = [] +            try: +                checksum_algos.append(hashlib.md5) +            except AttributeError: +                pass +            checksum_algos.append(hashlib.sha256) +            checksum_algos.append(hashlib.sha1) + +            member_names_string = ' '.join(all_members_names).encode('utf-8') +            checksums = [ +                '0x' + mkchecksum(member_names_string).hexdigest()[:7] +                for mkchecksum in checksum_algos +            ]              unpickle_func_name = '__pyx_unpickle_%s' % node.class_name              # TODO(robertwb): Move the state into the third argument @@ -1710,9 +1726,9 @@ if VALUE is not None:                  def %(unpickle_func_name)s(__pyx_type, long __pyx_checksum, __pyx_state):                      cdef object __pyx_PickleError                      cdef object __pyx_result -                    if __pyx_checksum != %(checksum)s: +                    if __pyx_checksum not in %(checksums)s:                          from pickle import PickleError as __pyx_PickleError -                        raise __pyx_PickleError("Incompatible checksums (%%s vs %(checksum)s = (%(members)s))" %% __pyx_checksum) +                        raise __pyx_PickleError("Incompatible checksums (0x%%x vs %(checksums)s = (%(members)s))" %% __pyx_checksum)                      __pyx_result = %(class_name)s.__new__(__pyx_type)                      if __pyx_state is not None:                          %(unpickle_func_name)s__set_state(<%(class_name)s> __pyx_result, __pyx_state) @@ -1724,7 +1740,7 @@ if VALUE is not None:                          __pyx_result.__dict__.update(__pyx_state[%(num_members)d])                  """ % {                      'unpickle_func_name': unpickle_func_name, -                    'checksum': checksum, +                    'checksums': "(%s)" % ', '.join(checksums),                      'members': ', '.join(all_members_names),                      'class_name': node.class_name,                      'assignments': '; '.join( @@ -1757,7 +1773,7 @@ if VALUE is not None:                      %(unpickle_func_name)s__set_state(self, __pyx_state)                  """ % {                      'unpickle_func_name': unpickle_func_name, -                    'checksum': checksum, +                    'checksum': checksums[0],                      'members': ', '.join('self.%s' % v for v in all_members_names) + (',' if len(all_members_names) == 1 else ''),                      # Even better, we could check PyType_IS_GC.                      'any_notnone_members' : ' or '.join(['self.%s is not None' % e.name for e in all_members if e.type.is_pyobject] or ['False']), diff --git a/contrib/tools/cython/Cython/Compiler/TypeSlots.py b/contrib/tools/cython/Cython/Compiler/TypeSlots.py index 0b4ff670425..c6867447d25 100644 --- a/contrib/tools/cython/Cython/Compiler/TypeSlots.py +++ b/contrib/tools/cython/Cython/Compiler/TypeSlots.py @@ -625,6 +625,20 @@ def get_slot_code_by_name(scope, slot_name):      slot = get_slot_by_name(slot_name)      return slot.slot_code(scope) +def is_reverse_number_slot(name): +    """ +    Tries to identify __radd__ and friends (so the METH_COEXIST flag can be applied). + +    There's no great consequence if it inadvertently identifies a few other methods +    so just use a simple rule rather than an exact list. +    """ +    if name.startswith("__r") and name.endswith("__"): +        forward_name = name.replace("r", "", 1) +        for meth in PyNumberMethods: +            if getattr(meth, "method_name", None) == forward_name: +                return True +    return False +  #------------------------------------------------------------------------------------------  #  | 
