From: Stefan Behnel Date: Mon, 8 Nov 2010 07:46:41 +0000 (+0100) Subject: fix ticket #589: bound methods of optimised builtin types X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=521350d4e3115df3c131cb0e9a483197d77cbb71;p=cython.git fix ticket #589: bound methods of optimised builtin types --- diff --git a/Cython/Compiler/Builtin.py b/Cython/Compiler/Builtin.py index c67175bd..0662ef0b 100644 --- a/Cython/Compiler/Builtin.py +++ b/Cython/Compiler/Builtin.py @@ -320,8 +320,8 @@ class BuiltinMethod(_BuiltinOverride): self_arg = PyrexTypes.CFuncTypeArg("", self_type, None) self_arg.not_none = True method_type = sig.function_type(self_arg) - self_type.scope.declare_cfunction(self.py_name, method_type, None, self.cname, - utility_code = self.utility_code) + self_type.scope.declare_builtin_cfunction( + self.py_name, method_type, self.cname, utility_code = self.utility_code) builtin_function_table = [ diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 021435a5..c6062ec1 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -1586,7 +1586,20 @@ class CClassScope(ClassScope): entry.is_cmethod = 1 entry.prev_entry = prev_entry return entry - + + def declare_builtin_cfunction(self, name, type, cname, utility_code = None): + # overridden methods of builtin types still have their Python + # equivalent that must be accessible to support bound methods + name = EncodedString(name) + entry = self.declare_cfunction(name, type, None, cname, visibility='extern', + utility_code = utility_code) + var_entry = Entry(name, name, py_object_type) + var_entry.is_variable = 1 + var_entry.is_builtin = 1 + var_entry.utility_code = utility_code + entry.as_variable = var_entry + return entry + def declare_property(self, name, doc, pos): entry = self.lookup_here(name) if entry is None: diff --git a/tests/bugs.txt b/tests/bugs.txt index 7ed33400..d172b4c6 100644 --- a/tests/bugs.txt +++ b/tests/bugs.txt @@ -16,7 +16,6 @@ with_statement_module_level_T536 function_as_method_T494 closure_inside_cdef_T554 ipow_crash_T562 -bound_builtin_methods_T589 # CPython regression tests that don't current work: diff --git a/tests/run/bound_builtin_methods_T589.pyx b/tests/run/bound_builtin_methods_T589.pyx index 04394892..4e9cff0b 100644 --- a/tests/run/bound_builtin_methods_T589.pyx +++ b/tests/run/bound_builtin_methods_T589.pyx @@ -1,6 +1,8 @@ cimport cython +_set = set # CPython may not define it (in Py2.3), but Cython does :) + def test_set_clear_bound(): """ >>> type(test_set_clear_bound()) is _set