From 2980931318cd7d4d0f91b70bc56ca2f0dafcb9ed Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Wed, 3 Nov 2010 21:11:54 +0100 Subject: [PATCH] merge getattr() optimisation into builtin function support by overriding its signature --- Cython/Compiler/Builtin.py | 14 ++++++++++++-- Cython/Compiler/Optimize.py | 33 --------------------------------- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/Cython/Compiler/Builtin.py b/Cython/Compiler/Builtin.py index 2f6b2dee..63609c2b 100644 --- a/Cython/Compiler/Builtin.py +++ b/Cython/Compiler/Builtin.py @@ -22,8 +22,8 @@ builtin_function_table = [ #('eval', "", "", ""), #('execfile', "", "", ""), #('filter', "", "", ""), - #('getattr', "OO", "O", "PyObject_GetAttr"), # optimised later on - ('getattr3', "OOO", "O", "__Pyx_GetAttr3", "getattr"), + ('getattr', "OO", "O", "PyObject_GetAttr"), # for 3 arguments, see code further down + ('getattr3', "OOO", "O", "__Pyx_GetAttr3", "getattr"), # Pyrex compatibility ('hasattr', "OO", "b", "PyObject_HasAttr"), ('hash', "O", "l", "PyObject_Hash"), #('hex', "", "", ""), @@ -400,6 +400,16 @@ def init_builtin_funcs(): for desc in builtin_function_table: declare_builtin_func(*desc) + # getattr with 3 args + PyObject_GetAttr3_func_type = PyrexTypes.CFuncType( + PyrexTypes.py_object_type, [ + PyrexTypes.CFuncTypeArg("object", PyrexTypes.py_object_type, None), + PyrexTypes.CFuncTypeArg("attr_name", PyrexTypes.py_object_type, None), + PyrexTypes.CFuncTypeArg("default", PyrexTypes.py_object_type, None), + ]) + builtin_scope.declare_builtin_cfunction('getattr', PyObject_GetAttr3_func_type, + '__Pyx_GetAttr3', 'getattr', getattr3_utility_code) + builtin_types = {} def init_builtin_types(): diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index 04f741f3..e97aea88 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -1819,39 +1819,6 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): ### builtin functions - PyObject_GetAttr2_func_type = PyrexTypes.CFuncType( - PyrexTypes.py_object_type, [ - PyrexTypes.CFuncTypeArg("object", PyrexTypes.py_object_type, None), - PyrexTypes.CFuncTypeArg("attr_name", PyrexTypes.py_object_type, None), - ]) - - PyObject_GetAttr3_func_type = PyrexTypes.CFuncType( - PyrexTypes.py_object_type, [ - PyrexTypes.CFuncTypeArg("object", PyrexTypes.py_object_type, None), - PyrexTypes.CFuncTypeArg("attr_name", PyrexTypes.py_object_type, None), - PyrexTypes.CFuncTypeArg("default", PyrexTypes.py_object_type, None), - ]) - - def _handle_simple_function_getattr(self, node, pos_args): - """Replace 2/3 argument forms of getattr() by C-API calls. - """ - if len(pos_args) == 2: - return ExprNodes.PythonCapiCallNode( - node.pos, "PyObject_GetAttr", self.PyObject_GetAttr2_func_type, - args = pos_args, - may_return_none = True, - is_temp = node.is_temp) - elif len(pos_args) == 3: - return ExprNodes.PythonCapiCallNode( - node.pos, "__Pyx_GetAttr3", self.PyObject_GetAttr3_func_type, - args = pos_args, - may_return_none = True, - is_temp = node.is_temp, - utility_code = Builtin.getattr3_utility_code) - else: - self._error_wrong_arg_count('getattr', node, pos_args, '2 or 3') - return node - Pyx_strlen_func_type = PyrexTypes.CFuncType( PyrexTypes.c_size_t_type, [ PyrexTypes.CFuncTypeArg("bytes", PyrexTypes.c_char_ptr_type, None) -- 2.26.2