From d6bc4573aee7f810dcfcfe342c4bff50ec6adb98 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Wed, 9 Dec 2009 09:18:04 +0100 Subject: [PATCH] fix getattr() optimisation --- Cython/Compiler/Optimize.py | 56 +++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index c15985f9..1b1287d8 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -843,33 +843,6 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform): return replace_in(arg) return node - 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): - if len(pos_args) == 2: - self._inject_capi_function( - node, "PyObject_GetAttr", - self.PyObject_GetAttr2_func_type) - elif len(pos_args) == 3: - self._inject_capi_function( - node, "__Pyx_GetAttr3", - self.PyObject_GetAttr3_func_type, - Builtin.getattr3_utility_code) - else: - self._error_wrong_arg_count('getattr', node, pos_args, '2 or 3') - return node - Pyx_Type_func_type = PyrexTypes.CFuncType( Builtin.type_type, [ PyrexTypes.CFuncTypeArg("object", PyrexTypes.py_object_type, None) @@ -1160,6 +1133,35 @@ 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): + if len(pos_args) == 2: + return ExprNodes.PythonCapiCallNode( + node.pos, "PyObject_GetAttr", self.PyObject_GetAttr2_func_type, + args = pos_args, + 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, + 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