symbian-qemu-0.9.1-12/python-2.6.1/Python/importdl.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* Support for dynamic loading of extension modules */
       
     3 
       
     4 #include "Python.h"
       
     5 
       
     6 /* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
       
     7    supported on this platform. configure will then compile and link in one
       
     8    of the dynload_*.c files, as appropriate. We will call a function in
       
     9    those modules to get a function pointer to the module's init function.
       
    10 */
       
    11 #ifdef HAVE_DYNAMIC_LOADING
       
    12 
       
    13 #include "importdl.h"
       
    14 
       
    15 extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
       
    16 					   const char *shortname,
       
    17 					   const char *pathname, FILE *fp);
       
    18 
       
    19 
       
    20 
       
    21 PyObject *
       
    22 _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
       
    23 {
       
    24 	PyObject *m;
       
    25 	char *lastdot, *shortname, *packagecontext, *oldcontext;
       
    26 	dl_funcptr p;
       
    27 
       
    28 	if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
       
    29 		Py_INCREF(m);
       
    30 		return m;
       
    31 	}
       
    32 	lastdot = strrchr(name, '.');
       
    33 	if (lastdot == NULL) {
       
    34 		packagecontext = NULL;
       
    35 		shortname = name;
       
    36 	}
       
    37 	else {
       
    38 		packagecontext = name;
       
    39 		shortname = lastdot+1;
       
    40 	}
       
    41 
       
    42 	p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
       
    43 	if (PyErr_Occurred())
       
    44 		return NULL;
       
    45 	if (p == NULL) {
       
    46 		PyErr_Format(PyExc_ImportError,
       
    47 		   "dynamic module does not define init function (init%.200s)",
       
    48 			     shortname);
       
    49 		return NULL;
       
    50 	}
       
    51         oldcontext = _Py_PackageContext;
       
    52 	_Py_PackageContext = packagecontext;
       
    53 	(*p)();
       
    54 	_Py_PackageContext = oldcontext;
       
    55 	if (PyErr_Occurred())
       
    56 		return NULL;
       
    57 
       
    58 	m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
       
    59 	if (m == NULL) {
       
    60 		PyErr_SetString(PyExc_SystemError,
       
    61 				"dynamic module not initialized properly");
       
    62 		return NULL;
       
    63 	}
       
    64 	/* Remember the filename as the __file__ attribute */
       
    65 	if (PyModule_AddStringConstant(m, "__file__", pathname) < 0)
       
    66 		PyErr_Clear(); /* Not important enough to report */
       
    67 
       
    68 	if (_PyImport_FixupExtension(name, pathname) == NULL)
       
    69 		return NULL;
       
    70 	if (Py_VerboseFlag)
       
    71 		PySys_WriteStderr(
       
    72 			"import %s # dynamically loaded from %s\n",
       
    73 			name, pathname);
       
    74 	Py_INCREF(m);
       
    75 	return m;
       
    76 }
       
    77 
       
    78 #endif /* HAVE_DYNAMIC_LOADING */