From 6b1c2ef167efb291c44af5b852e593adb8ce68b8 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 5 Apr 2013 09:15:49 +0200 Subject: [PATCH] simplify import-from code a little by moving the name lookup into a utility function --- Cython/Compiler/Nodes.py | 36 ++++++------------------------------ Cython/Utility/ImportExport.c | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index f4b3852..dcbfbf7 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -6764,8 +6764,6 @@ class FromImportStatNode(StatNode): else: coerced_item = self.item.coerce_to(target.type, env) self.interned_items.append((name, target, coerced_item)) - if self.interned_items: - env.use_utility_code(raise_import_error_utility_code) return self def generate_execution_code(self, code): @@ -6778,21 +6776,16 @@ class FromImportStatNode(StatNode): code.error_goto(self.pos))) item_temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True) self.item.set_cname(item_temp) - code.globalstate.use_utility_code( - UtilityCode.load_cached("PyObjectGetAttrStr", "ObjectHandling.c")) + if self.interned_items: + code.globalstate.use_utility_code( + UtilityCode.load_cached("ImportFrom", "ImportExport.c")) for name, target, coerced_item in self.interned_items: - cname = code.intern_identifier(name) code.putln( - '%s = __Pyx_PyObject_GetAttrStr(%s, %s);' % ( + '%s = __Pyx_ImportFrom(%s, %s); %s' % ( item_temp, self.module.py_result(), - cname)) - code.putln('if (%s == NULL) {' % item_temp) - code.putln( - 'if (PyErr_ExceptionMatches(PyExc_AttributeError)) ' - '__Pyx_RaiseImportError(%s);' % cname) - code.putln(code.error_goto_if_null(item_temp, self.pos)) - code.putln('}') + code.intern_identifier(name), + code.error_goto_if_null(item_temp, self.pos))) code.put_gotref(item_temp) if coerced_item is None: target.generate_assignment_code(self.item, code) @@ -8325,20 +8318,3 @@ init=""" a quiet NaN. */ memset(&%(PYX_NAN)s, 0xFF, sizeof(%(PYX_NAN)s)); """ % vars(Naming)) - -#------------------------------------------------------------------------------------ - -raise_import_error_utility_code = UtilityCode( -proto = ''' -static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name); -''', -impl = ''' -static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) { -#if PY_MAJOR_VERSION < 3 - PyErr_Format(PyExc_ImportError, "cannot import name %.230s", - PyString_AsString(name)); -#else - PyErr_Format(PyExc_ImportError, "cannot import name %S", name); -#endif -} -''') diff --git a/Cython/Utility/ImportExport.c b/Cython/Utility/ImportExport.c index 3e863ed..8c74e01 100644 --- a/Cython/Utility/ImportExport.c +++ b/Cython/Utility/ImportExport.c @@ -100,6 +100,32 @@ bad: return module; } + +/////////////// ImportFrom.proto /////////////// + +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /*proto*/ + +/////////////// ImportFrom /////////////// +//@requires: ObjectHandling.c::PyObjectGetAttrStr + +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + + +static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) { +} + + /////////////// ModuleImport.proto /////////////// static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ -- 2.7.4