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):
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)
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
-}
-''')
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*/