diff -Nur Pyrex-0.9.6.4/Pyrex/Compiler/ModuleNode.py patched/Pyrex/Compiler/ModuleNode.py --- Pyrex-0.9.6.4/Pyrex/Compiler/ModuleNode.py 2007-11-26 05:34:26.000000000 -0500 +++ patched/Pyrex/Compiler/ModuleNode.py 2008-01-22 09:33:44.000000000 -0500 @@ -1507,17 +1507,87 @@ """,""" #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule -static PyObject *__Pyx_ImportModule(char *name) { - PyObject *py_name = 0; - - py_name = PyString_FromString(name); - if (!py_name) - goto bad; - return PyImport_Import(py_name); -bad: - Py_XDECREF(py_name); - return 0; -} +static PyObject *__Pyx_UnpackSubmodule(PyObject *module, char *const_name) { + PyObject *tmp = 0; + int i = 0; + int n = strlen(const_name); + int cur_name_component_start = 0; + char saved_char; + char name[1024+1]; + + if (n > 1024) { + PyErr_SetString(PyExc_ValueError,"Module name too long"); + return NULL; + } + + strcpy(name,const_name); + + while (i < n && name[i]!='.') { + i++; + } + + i++; + + if (i < n) cur_name_component_start=i; + + while (i <= n) { + if (name[i]=='.' || (name[i]=='\\0' && cur_name_component_start != 0)) { + saved_char = name[i]; + name[i] = '\\0'; + tmp = module; + module = PyObject_GetAttrString(module,name+cur_name_component_start); + + Py_DECREF(tmp); + + if (PyErr_Occurred()) return NULL; + + assert(module); + + + name[i] = saved_char; + cur_name_component_start = i+1; + } + i = i + 1; + } + return module; +} + +static PyObject *__Pyx_ImportModule(char *name) { + PyObject *__import__ = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *py_name = 0; + PyObject *empty_list = 0; + + py_name = PyString_FromString(name); + if (!py_name) + goto bad; + __import__ = PyObject_GetAttrString(__pyx_b, "__import__"); + if (!__import__) + goto bad; + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + + module = PyObject_CallFunction(__import__, "OOOO", + py_name, global_dict, empty_dict, empty_list); + + module = __Pyx_UnpackSubmodule(module,name); + +bad: + Py_XDECREF(py_name); + Py_XDECREF(empty_list); + Py_XDECREF(__import__); + Py_XDECREF(empty_dict); + return module; +} #endif """]