Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Python/import.c

    r10 r391  
    2020#endif
    2121#ifdef __cplusplus
    22 extern "C" { 
     22extern "C" {
    2323#endif
    2424
     
    2828#endif
    2929
    30 extern time_t PyOS_GetLastModificationTime(char *, FILE *);
    31                                                 /* In getmtime.c */
    3230
    3331/* Magic word to reject .pyc files generated by other Python versions.
     
    7068       Python 2.5b3: 62111 (fix wrong code: x += yield)
    7169       Python 2.5c1: 62121 (fix wrong lnotab with for loops and
    72                             storing constants that should have been removed)
     70                            storing constants that should have been removed)
    7371       Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
    7472       Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
    7573       Python 2.6a1: 62161 (WITH_CLEANUP optimization)
     74       Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND)
     75       Python 2.7a0: 62181 (optimize conditional branches:
     76                introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
     77       Python 2.7a0  62191 (introduce SETUP_WITH)
     78       Python 2.7a0  62201 (introduce BUILD_SET)
     79       Python 2.7a0  62211 (introduce MAP_ADD and SET_ADD)
    7680.
    7781*/
    78 #define MAGIC (62161 | ((long)'\r'<<16) | ((long)'\n'<<24))
     82#define MAGIC (62211 | ((long)'\r'<<16) | ((long)'\n'<<24))
    7983
    8084/* Magic word as global; note that _PyImport_Init() can change the
     
    96100#ifdef RISCOS
    97101static const struct filedescr _PyImport_StandardFiletab[] = {
    98         {"/py", "U", PY_SOURCE},
    99         {"/pyc", "rb", PY_COMPILED},
    100         {0, 0}
     102    {"/py", "U", PY_SOURCE},
     103    {"/pyc", "rb", PY_COMPILED},
     104    {0, 0}
    101105};
    102106#else
    103107static const struct filedescr _PyImport_StandardFiletab[] = {
    104         {".py", "U", PY_SOURCE},
     108    {".py", "U", PY_SOURCE},
    105109#ifdef MS_WINDOWS
    106         {".pyw", "U", PY_SOURCE},
     110    {".pyw", "U", PY_SOURCE},
    107111#endif
    108         {".pyc", "rb", PY_COMPILED},
    109         {0, 0}
     112    {".pyc", "rb", PY_COMPILED},
     113    {0, 0}
    110114};
    111115#endif
    112116
     117#ifdef MS_WINDOWS
     118static int isdir(char *path) {
     119    DWORD rv;
     120    /* see issue1293 and issue3677:
     121     * stat() on Windows doesn't recognise paths like
     122     * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
     123     * Also reference issue6727:
     124     * stat() on Windows is broken and doesn't resolve symlinks properly.
     125     */
     126    rv = GetFileAttributesA(path);
     127    return rv != INVALID_FILE_ATTRIBUTES && rv & FILE_ATTRIBUTE_DIRECTORY;
     128}
     129#else
     130#ifdef HAVE_STAT
     131static int isdir(char *path) {
     132    struct stat statbuf;
     133    return stat(path, &statbuf) == 0 && S_ISDIR(statbuf.st_mode);
     134}
     135#else
     136#ifdef RISCOS
     137/* with RISCOS, isdir is in unixstuff */
     138#else
     139int isdir(char *path) {
     140    return 0;
     141}
     142#endif /* RISCOS */
     143#endif /* HAVE_STAT */
     144#endif /* MS_WINDOWS */
    113145
    114146/* Initialize things */
     
    117149_PyImport_Init(void)
    118150{
    119         const struct filedescr *scan;
    120         struct filedescr *filetab;
    121         int countD = 0;
    122         int countS = 0;
    123 
    124         /* prepare _PyImport_Filetab: copy entries from
    125            _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
    126         */
     151    const struct filedescr *scan;
     152    struct filedescr *filetab;
     153    int countD = 0;
     154    int countS = 0;
     155
     156    /* prepare _PyImport_Filetab: copy entries from
     157       _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
     158    */
    127159#ifdef HAVE_DYNAMIC_LOADING
    128         for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
    129                 ++countD;
     160    for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
     161        ++countD;
    130162#endif
    131         for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
    132                 ++countS;
    133         filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
    134         if (filetab == NULL)
    135                 Py_FatalError("Can't initialize import file table.");
     163    for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
     164        ++countS;
     165    filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
     166    if (filetab == NULL)
     167        Py_FatalError("Can't initialize import file table.");
    136168#ifdef HAVE_DYNAMIC_LOADING
    137         memcpy(filetab, _PyImport_DynLoadFiletab,
    138                countD * sizeof(struct filedescr));
     169    memcpy(filetab, _PyImport_DynLoadFiletab,
     170           countD * sizeof(struct filedescr));
    139171#endif
    140         memcpy(filetab + countD, _PyImport_StandardFiletab,
    141                countS * sizeof(struct filedescr));
    142         filetab[countD + countS].suffix = NULL;
    143 
    144         _PyImport_Filetab = filetab;
    145 
    146         if (Py_OptimizeFlag) {
    147                 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
    148                 for (; filetab->suffix != NULL; filetab++) {
     172    memcpy(filetab + countD, _PyImport_StandardFiletab,
     173           countS * sizeof(struct filedescr));
     174    filetab[countD + countS].suffix = NULL;
     175
     176    _PyImport_Filetab = filetab;
     177
     178    if (Py_OptimizeFlag) {
     179        /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
     180        for (; filetab->suffix != NULL; filetab++) {
    149181#ifndef RISCOS
    150                         if (strcmp(filetab->suffix, ".pyc") == 0)
    151                                 filetab->suffix = ".pyo";
     182            if (strcmp(filetab->suffix, ".pyc") == 0)
     183                filetab->suffix = ".pyo";
    152184#else
    153                         if (strcmp(filetab->suffix, "/pyc") == 0)
    154                                 filetab->suffix = "/pyo";
     185            if (strcmp(filetab->suffix, "/pyc") == 0)
     186                filetab->suffix = "/pyo";
    155187#endif
    156                 }
    157         }
    158 
    159         if (Py_UnicodeFlag) {
    160                 /* Fix the pyc_magic so that byte compiled code created
    161                    using the all-Unicode method doesn't interfere with
    162                    code created in normal operation mode. */
    163                 pyc_magic = MAGIC + 1;
    164         }
     188        }
     189    }
     190
     191    if (Py_UnicodeFlag) {
     192        /* Fix the pyc_magic so that byte compiled code created
     193           using the all-Unicode method doesn't interfere with
     194           code created in normal operation mode. */
     195        pyc_magic = MAGIC + 1;
     196    }
    165197}
    166198
     
    168200_PyImportHooks_Init(void)
    169201{
    170         PyObject *v, *path_hooks = NULL, *zimpimport;
    171         int err = 0;
    172 
    173         /* adding sys.path_hooks and sys.path_importer_cache, setting up
    174            zipimport */
    175         if (PyType_Ready(&PyNullImporter_Type) < 0)
    176                 goto error;
    177 
    178         if (Py_VerboseFlag)
    179                 PySys_WriteStderr("# installing zipimport hook\n");
    180 
    181         v = PyList_New(0);
    182         if (v == NULL)
    183                 goto error;
    184         err = PySys_SetObject("meta_path", v);
    185         Py_DECREF(v);
    186         if (err)
    187                 goto error;
    188         v = PyDict_New();
    189         if (v == NULL)
    190                 goto error;
    191         err = PySys_SetObject("path_importer_cache", v);
    192         Py_DECREF(v);
    193         if (err)
    194                 goto error;
    195         path_hooks = PyList_New(0);
    196         if (path_hooks == NULL)
    197                 goto error;
    198         err = PySys_SetObject("path_hooks", path_hooks);
    199         if (err) {
     202    PyObject *v, *path_hooks = NULL, *zimpimport;
     203    int err = 0;
     204
     205    /* adding sys.path_hooks and sys.path_importer_cache, setting up
     206       zipimport */
     207    if (PyType_Ready(&PyNullImporter_Type) < 0)
     208        goto error;
     209
     210    if (Py_VerboseFlag)
     211        PySys_WriteStderr("# installing zipimport hook\n");
     212
     213    v = PyList_New(0);
     214    if (v == NULL)
     215        goto error;
     216    err = PySys_SetObject("meta_path", v);
     217    Py_DECREF(v);
     218    if (err)
     219        goto error;
     220    v = PyDict_New();
     221    if (v == NULL)
     222        goto error;
     223    err = PySys_SetObject("path_importer_cache", v);
     224    Py_DECREF(v);
     225    if (err)
     226        goto error;
     227    path_hooks = PyList_New(0);
     228    if (path_hooks == NULL)
     229        goto error;
     230    err = PySys_SetObject("path_hooks", path_hooks);
     231    if (err) {
    200232  error:
    201                 PyErr_Print();
    202                 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
    203                               "path_importer_cache, or NullImporter failed"
    204                               );
    205         }
    206 
    207         zimpimport = PyImport_ImportModule("zipimport");
    208         if (zimpimport == NULL) {
    209                 PyErr_Clear(); /* No zip import module -- okay */
    210                 if (Py_VerboseFlag)
    211                         PySys_WriteStderr("# can't import zipimport\n");
    212         }
    213         else {
    214                 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
    215                                                                "zipimporter");
    216                 Py_DECREF(zimpimport);
    217                 if (zipimporter == NULL) {
    218                         PyErr_Clear(); /* No zipimporter object -- okay */
    219                         if (Py_VerboseFlag)
    220                                 PySys_WriteStderr(
    221                                     "# can't import zipimport.zipimporter\n");
    222                 }
    223                 else {
    224                         /* sys.path_hooks.append(zipimporter) */
    225                         err = PyList_Append(path_hooks, zipimporter);
    226                         Py_DECREF(zipimporter);
    227                         if (err)
    228                                 goto error;
    229                         if (Py_VerboseFlag)
    230                                 PySys_WriteStderr(
    231                                         "# installed zipimport hook\n");
    232                 }
    233         }
    234         Py_DECREF(path_hooks);
     233        PyErr_Print();
     234        Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
     235                      "path_importer_cache, or NullImporter failed"
     236                      );
     237    }
     238
     239    zimpimport = PyImport_ImportModule("zipimport");
     240    if (zimpimport == NULL) {
     241        PyErr_Clear(); /* No zip import module -- okay */
     242        if (Py_VerboseFlag)
     243            PySys_WriteStderr("# can't import zipimport\n");
     244    }
     245    else {
     246        PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
     247                                                       "zipimporter");
     248        Py_DECREF(zimpimport);
     249        if (zipimporter == NULL) {
     250            PyErr_Clear(); /* No zipimporter object -- okay */
     251            if (Py_VerboseFlag)
     252                PySys_WriteStderr(
     253                    "# can't import zipimport.zipimporter\n");
     254        }
     255        else {
     256            /* sys.path_hooks.append(zipimporter) */
     257            err = PyList_Append(path_hooks, zipimporter);
     258            Py_DECREF(zipimporter);
     259            if (err)
     260                goto error;
     261            if (Py_VerboseFlag)
     262                PySys_WriteStderr(
     263                    "# installed zipimport hook\n");
     264        }
     265    }
     266    Py_DECREF(path_hooks);
    235267}
    236268
     
    238270_PyImport_Fini(void)
    239271{
    240         Py_XDECREF(extensions);
    241         extensions = NULL;
    242         PyMem_DEL(_PyImport_Filetab);
    243         _PyImport_Filetab = NULL;
     272    Py_XDECREF(extensions);
     273    extensions = NULL;
     274    PyMem_DEL(_PyImport_Filetab);
     275    _PyImport_Filetab = NULL;
    244276}
    245277
     
    260292_PyImport_AcquireLock(void)
    261293{
    262         long me = PyThread_get_thread_ident();
    263         if (me == -1)
    264                 return; /* Too bad */
    265         if (import_lock == NULL) {
    266                 import_lock = PyThread_allocate_lock();
    267                 if (import_lock == NULL)
    268                         return;  /* Nothing much we can do. */
    269         }
    270         if (import_lock_thread == me) {
    271                 import_lock_level++;
    272                 return;
    273         }
    274         if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
    275         {
    276                 PyThreadState *tstate = PyEval_SaveThread();
    277                 PyThread_acquire_lock(import_lock, 1);
    278                 PyEval_RestoreThread(tstate);
    279         }
    280         import_lock_thread = me;
    281         import_lock_level = 1;
     294    long me = PyThread_get_thread_ident();
     295    if (me == -1)
     296        return; /* Too bad */
     297    if (import_lock == NULL) {
     298        import_lock = PyThread_allocate_lock();
     299        if (import_lock == NULL)
     300            return;  /* Nothing much we can do. */
     301    }
     302    if (import_lock_thread == me) {
     303        import_lock_level++;
     304        return;
     305    }
     306    if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
     307    {
     308        PyThreadState *tstate = PyEval_SaveThread();
     309        PyThread_acquire_lock(import_lock, 1);
     310        PyEval_RestoreThread(tstate);
     311    }
     312    import_lock_thread = me;
     313    import_lock_level = 1;
    282314}
    283315
     
    285317_PyImport_ReleaseLock(void)
    286318{
    287         long me = PyThread_get_thread_ident();
    288         if (me == -1 || import_lock == NULL)
    289                 return 0; /* Too bad */
    290         if (import_lock_thread != me)
    291                 return -1;
    292         import_lock_level--;
    293         if (import_lock_level == 0) {
    294                 import_lock_thread = -1;
    295                 PyThread_release_lock(import_lock);
    296         }
    297         return 1;
     319    long me = PyThread_get_thread_ident();
     320    if (me == -1 || import_lock == NULL)
     321        return 0; /* Too bad */
     322    if (import_lock_thread != me)
     323        return -1;
     324    import_lock_level--;
     325    if (import_lock_level == 0) {
     326        import_lock_thread = -1;
     327        PyThread_release_lock(import_lock);
     328    }
     329    return 1;
    298330}
    299331
     
    306338_PyImport_ReInitLock(void)
    307339{
    308         if (import_lock != NULL)
    309                 import_lock = PyThread_allocate_lock();
    310         import_lock_thread = -1;
    311         import_lock_level = 0;
     340    if (import_lock != NULL)
     341        import_lock = PyThread_allocate_lock();
     342    import_lock_thread = -1;
     343    import_lock_level = 0;
    312344}
    313345
     
    318350{
    319351#ifdef WITH_THREAD
    320         return PyBool_FromLong(import_lock_thread != -1);
     352    return PyBool_FromLong(import_lock_thread != -1);
    321353#else
    322         return PyBool_FromLong(0);
     354    return PyBool_FromLong(0);
    323355#endif
    324356}
     
    328360{
    329361#ifdef WITH_THREAD
    330         _PyImport_AcquireLock();
     362    _PyImport_AcquireLock();
    331363#endif
    332         Py_INCREF(Py_None);
    333         return Py_None;
     364    Py_INCREF(Py_None);
     365    return Py_None;
    334366}
    335367
     
    338370{
    339371#ifdef WITH_THREAD
    340         if (_PyImport_ReleaseLock() < 0) {
    341                 PyErr_SetString(PyExc_RuntimeError,
    342                                 "not holding the import lock");
    343                 return NULL;
    344         }
     372    if (_PyImport_ReleaseLock() < 0) {
     373        PyErr_SetString(PyExc_RuntimeError,
     374                        "not holding the import lock");
     375        return NULL;
     376    }
    345377#endif
    346         Py_INCREF(Py_None);
    347         return Py_None;
     378    Py_INCREF(Py_None);
     379    return Py_None;
    348380}
    349381
     
    351383imp_modules_reloading_clear(void)
    352384{
    353         PyInterpreterState *interp = PyThreadState_Get()->interp;
    354         if (interp->modules_reloading != NULL)
    355                 PyDict_Clear(interp->modules_reloading);
     385    PyInterpreterState *interp = PyThreadState_Get()->interp;
     386    if (interp->modules_reloading != NULL)
     387        PyDict_Clear(interp->modules_reloading);
    356388}
    357389
     
    361393PyImport_GetModuleDict(void)
    362394{
    363         PyInterpreterState *interp = PyThreadState_GET()->interp;
    364         if (interp->modules == NULL)
    365                 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
    366         return interp->modules;
     395    PyInterpreterState *interp = PyThreadState_GET()->interp;
     396    if (interp->modules == NULL)
     397        Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
     398    return interp->modules;
    367399}
    368400
     
    370402/* List of names to clear in sys */
    371403static char* sys_deletes[] = {
    372         "path", "argv", "ps1", "ps2", "exitfunc",
    373         "exc_type", "exc_value", "exc_traceback",
    374         "last_type", "last_value", "last_traceback",
    375         "path_hooks", "path_importer_cache", "meta_path",
    376         /* misc stuff */
    377         "flags", "float_info",
    378         NULL
     404    "path", "argv", "ps1", "ps2", "exitfunc",
     405    "exc_type", "exc_value", "exc_traceback",
     406    "last_type", "last_value", "last_traceback",
     407    "path_hooks", "path_importer_cache", "meta_path",
     408    /* misc stuff */
     409    "flags", "float_info",
     410    NULL
    379411};
    380412
    381413static char* sys_files[] = {
    382         "stdin", "__stdin__",
    383         "stdout", "__stdout__",
    384         "stderr", "__stderr__",
    385         NULL
     414    "stdin", "__stdin__",
     415    "stdout", "__stdout__",
     416    "stderr", "__stderr__",
     417    NULL
    386418};
    387419
     
    392424PyImport_Cleanup(void)
    393425{
    394         Py_ssize_t pos, ndone;
    395         char *name;
    396         PyObject *key, *value, *dict;
    397         PyInterpreterState *interp = PyThreadState_GET()->interp;
    398         PyObject *modules = interp->modules;
    399 
    400         if (modules == NULL)
    401                 return; /* Already done */
    402 
    403         /* Delete some special variables first.  These are common
    404            places where user values hide and people complain when their
    405            destructors fail.  Since the modules containing them are
    406            deleted *last* of all, they would come too late in the normal
    407            destruction order.  Sigh. */
    408 
    409         value = PyDict_GetItemString(modules, "__builtin__");
    410         if (value != NULL && PyModule_Check(value)) {
    411                 dict = PyModule_GetDict(value);
    412                 if (Py_VerboseFlag)
    413                         PySys_WriteStderr("# clear __builtin__._\n");
    414                 PyDict_SetItemString(dict, "_", Py_None);
    415         }
    416         value = PyDict_GetItemString(modules, "sys");
    417         if (value != NULL && PyModule_Check(value)) {
    418                 char **p;
    419                 PyObject *v;
    420                 dict = PyModule_GetDict(value);
    421                 for (p = sys_deletes; *p != NULL; p++) {
    422                         if (Py_VerboseFlag)
    423                                 PySys_WriteStderr("# clear sys.%s\n", *p);
    424                         PyDict_SetItemString(dict, *p, Py_None);
    425                 }
    426                 for (p = sys_files; *p != NULL; p+=2) {
    427                         if (Py_VerboseFlag)
    428                                 PySys_WriteStderr("# restore sys.%s\n", *p);
    429                         v = PyDict_GetItemString(dict, *(p+1));
    430                         if (v == NULL)
    431                                 v = Py_None;
    432                         PyDict_SetItemString(dict, *p, v);
    433                 }
    434         }
    435 
    436         /* First, delete __main__ */
    437         value = PyDict_GetItemString(modules, "__main__");
    438         if (value != NULL && PyModule_Check(value)) {
    439                 if (Py_VerboseFlag)
    440                         PySys_WriteStderr("# cleanup __main__\n");
    441                 _PyModule_Clear(value);
    442                 PyDict_SetItemString(modules, "__main__", Py_None);
    443         }
    444 
    445         /* The special treatment of __builtin__ here is because even
    446            when it's not referenced as a module, its dictionary is
    447            referenced by almost every module's __builtins__.  Since
    448            deleting a module clears its dictionary (even if there are
    449            references left to it), we need to delete the __builtin__
    450            module last.  Likewise, we don't delete sys until the very
    451            end because it is implicitly referenced (e.g. by print).
    452 
    453            Also note that we 'delete' modules by replacing their entry
    454            in the modules dict with None, rather than really deleting
    455            them; this avoids a rehash of the modules dictionary and
    456            also marks them as "non existent" so they won't be
    457            re-imported. */
    458 
    459         /* Next, repeatedly delete modules with a reference count of
    460            one (skipping __builtin__ and sys) and delete them */
    461         do {
    462                 ndone = 0;
    463                 pos = 0;
    464                 while (PyDict_Next(modules, &pos, &key, &value)) {
    465                         if (value->ob_refcnt != 1)
    466                                 continue;
    467                         if (PyString_Check(key) && PyModule_Check(value)) {
    468                                 name = PyString_AS_STRING(key);
    469                                 if (strcmp(name, "__builtin__") == 0)
    470                                         continue;
    471                                 if (strcmp(name, "sys") == 0)
    472                                         continue;
    473                                 if (Py_VerboseFlag)
    474                                         PySys_WriteStderr(
    475                                                 "# cleanup[1] %s\n", name);
    476                                 _PyModule_Clear(value);
    477                                 PyDict_SetItem(modules, key, Py_None);
    478                                 ndone++;
    479                         }
    480                 }
    481         } while (ndone > 0);
    482 
    483         /* Next, delete all modules (still skipping __builtin__ and sys) */
    484         pos = 0;
    485         while (PyDict_Next(modules, &pos, &key, &value)) {
    486                 if (PyString_Check(key) && PyModule_Check(value)) {
    487                         name = PyString_AS_STRING(key);
    488                         if (strcmp(name, "__builtin__") == 0)
    489                                 continue;
    490                         if (strcmp(name, "sys") == 0)
    491                                 continue;
    492                         if (Py_VerboseFlag)
    493                                 PySys_WriteStderr("# cleanup[2] %s\n", name);
    494                         _PyModule_Clear(value);
    495                         PyDict_SetItem(modules, key, Py_None);
    496                 }
    497         }
    498 
    499         /* Next, delete sys and __builtin__ (in that order) */
    500         value = PyDict_GetItemString(modules, "sys");
    501         if (value != NULL && PyModule_Check(value)) {
    502                 if (Py_VerboseFlag)
    503                         PySys_WriteStderr("# cleanup sys\n");
    504                 _PyModule_Clear(value);
    505                 PyDict_SetItemString(modules, "sys", Py_None);
    506         }
    507         value = PyDict_GetItemString(modules, "__builtin__");
    508         if (value != NULL && PyModule_Check(value)) {
    509                 if (Py_VerboseFlag)
    510                         PySys_WriteStderr("# cleanup __builtin__\n");
    511                 _PyModule_Clear(value);
    512                 PyDict_SetItemString(modules, "__builtin__", Py_None);
    513         }
    514 
    515         /* Finally, clear and delete the modules directory */
    516         PyDict_Clear(modules);
    517         interp->modules = NULL;
    518         Py_DECREF(modules);
    519         Py_CLEAR(interp->modules_reloading);
     426    Py_ssize_t pos, ndone;
     427    char *name;
     428    PyObject *key, *value, *dict;
     429    PyInterpreterState *interp = PyThreadState_GET()->interp;
     430    PyObject *modules = interp->modules;
     431
     432    if (modules == NULL)
     433        return; /* Already done */
     434
     435    /* Delete some special variables first.  These are common
     436       places where user values hide and people complain when their
     437       destructors fail.  Since the modules containing them are
     438       deleted *last* of all, they would come too late in the normal
     439       destruction order.  Sigh. */
     440
     441    value = PyDict_GetItemString(modules, "__builtin__");
     442    if (value != NULL && PyModule_Check(value)) {
     443        dict = PyModule_GetDict(value);
     444        if (Py_VerboseFlag)
     445            PySys_WriteStderr("# clear __builtin__._\n");
     446        PyDict_SetItemString(dict, "_", Py_None);
     447    }
     448    value = PyDict_GetItemString(modules, "sys");
     449    if (value != NULL && PyModule_Check(value)) {
     450        char **p;
     451        PyObject *v;
     452        dict = PyModule_GetDict(value);
     453        for (p = sys_deletes; *p != NULL; p++) {
     454            if (Py_VerboseFlag)
     455                PySys_WriteStderr("# clear sys.%s\n", *p);
     456            PyDict_SetItemString(dict, *p, Py_None);
     457        }
     458        for (p = sys_files; *p != NULL; p+=2) {
     459            if (Py_VerboseFlag)
     460                PySys_WriteStderr("# restore sys.%s\n", *p);
     461            v = PyDict_GetItemString(dict, *(p+1));
     462            if (v == NULL)
     463                v = Py_None;
     464            PyDict_SetItemString(dict, *p, v);
     465        }
     466    }
     467
     468    /* First, delete __main__ */
     469    value = PyDict_GetItemString(modules, "__main__");
     470    if (value != NULL && PyModule_Check(value)) {
     471        if (Py_VerboseFlag)
     472            PySys_WriteStderr("# cleanup __main__\n");
     473        _PyModule_Clear(value);
     474        PyDict_SetItemString(modules, "__main__", Py_None);
     475    }
     476
     477    /* The special treatment of __builtin__ here is because even
     478       when it's not referenced as a module, its dictionary is
     479       referenced by almost every module's __builtins__.  Since
     480       deleting a module clears its dictionary (even if there are
     481       references left to it), we need to delete the __builtin__
     482       module last.  Likewise, we don't delete sys until the very
     483       end because it is implicitly referenced (e.g. by print).
     484
     485       Also note that we 'delete' modules by replacing their entry
     486       in the modules dict with None, rather than really deleting
     487       them; this avoids a rehash of the modules dictionary and
     488       also marks them as "non existent" so they won't be
     489       re-imported. */
     490
     491    /* Next, repeatedly delete modules with a reference count of
     492       one (skipping __builtin__ and sys) and delete them */
     493    do {
     494        ndone = 0;
     495        pos = 0;
     496        while (PyDict_Next(modules, &pos, &key, &value)) {
     497            if (value->ob_refcnt != 1)
     498                continue;
     499            if (PyString_Check(key) && PyModule_Check(value)) {
     500                name = PyString_AS_STRING(key);
     501                if (strcmp(name, "__builtin__") == 0)
     502                    continue;
     503                if (strcmp(name, "sys") == 0)
     504                    continue;
     505                if (Py_VerboseFlag)
     506                    PySys_WriteStderr(
     507                        "# cleanup[1] %s\n", name);
     508                _PyModule_Clear(value);
     509                PyDict_SetItem(modules, key, Py_None);
     510                ndone++;
     511            }
     512        }
     513    } while (ndone > 0);
     514
     515    /* Next, delete all modules (still skipping __builtin__ and sys) */
     516    pos = 0;
     517    while (PyDict_Next(modules, &pos, &key, &value)) {
     518        if (PyString_Check(key) && PyModule_Check(value)) {
     519            name = PyString_AS_STRING(key);
     520            if (strcmp(name, "__builtin__") == 0)
     521                continue;
     522            if (strcmp(name, "sys") == 0)
     523                continue;
     524            if (Py_VerboseFlag)
     525                PySys_WriteStderr("# cleanup[2] %s\n", name);
     526            _PyModule_Clear(value);
     527            PyDict_SetItem(modules, key, Py_None);
     528        }
     529    }
     530
     531    /* Next, delete sys and __builtin__ (in that order) */
     532    value = PyDict_GetItemString(modules, "sys");
     533    if (value != NULL && PyModule_Check(value)) {
     534        if (Py_VerboseFlag)
     535            PySys_WriteStderr("# cleanup sys\n");
     536        _PyModule_Clear(value);
     537        PyDict_SetItemString(modules, "sys", Py_None);
     538    }
     539    value = PyDict_GetItemString(modules, "__builtin__");
     540    if (value != NULL && PyModule_Check(value)) {
     541        if (Py_VerboseFlag)
     542            PySys_WriteStderr("# cleanup __builtin__\n");
     543        _PyModule_Clear(value);
     544        PyDict_SetItemString(modules, "__builtin__", Py_None);
     545    }
     546
     547    /* Finally, clear and delete the modules directory */
     548    PyDict_Clear(modules);
     549    interp->modules = NULL;
     550    Py_DECREF(modules);
     551    Py_CLEAR(interp->modules_reloading);
    520552}
    521553
     
    526558PyImport_GetMagicNumber(void)
    527559{
    528         return pyc_magic;
     560    return pyc_magic;
    529561}
    530562
     
    543575_PyImport_FixupExtension(char *name, char *filename)
    544576{
    545         PyObject *modules, *mod, *dict, *copy;
    546         if (extensions == NULL) {
    547                 extensions = PyDict_New();
    548                 if (extensions == NULL)
    549                         return NULL;
    550         }
    551         modules = PyImport_GetModuleDict();
    552         mod = PyDict_GetItemString(modules, name);
    553         if (mod == NULL || !PyModule_Check(mod)) {
    554                 PyErr_Format(PyExc_SystemError,
    555                   "_PyImport_FixupExtension: module %.200s not loaded", name);
    556                 return NULL;
    557         }
    558         dict = PyModule_GetDict(mod);
    559         if (dict == NULL)
    560                 return NULL;
    561         copy = PyDict_Copy(dict);
    562         if (copy == NULL)
    563                 return NULL;
    564         PyDict_SetItemString(extensions, filename, copy);
    565         Py_DECREF(copy);
    566         return copy;
     577    PyObject *modules, *mod, *dict, *copy;
     578    if (extensions == NULL) {
     579        extensions = PyDict_New();
     580        if (extensions == NULL)
     581            return NULL;
     582    }
     583    modules = PyImport_GetModuleDict();
     584    mod = PyDict_GetItemString(modules, name);
     585    if (mod == NULL || !PyModule_Check(mod)) {
     586        PyErr_Format(PyExc_SystemError,
     587          "_PyImport_FixupExtension: module %.200s not loaded", name);
     588        return NULL;
     589    }
     590    dict = PyModule_GetDict(mod);
     591    if (dict == NULL)
     592        return NULL;
     593    copy = PyDict_Copy(dict);
     594    if (copy == NULL)
     595        return NULL;
     596    PyDict_SetItemString(extensions, filename, copy);
     597    Py_DECREF(copy);
     598    return copy;
    567599}
    568600
     
    570602_PyImport_FindExtension(char *name, char *filename)
    571603{
    572         PyObject *dict, *mod, *mdict;
    573         if (extensions == NULL)
    574                 return NULL;
    575         dict = PyDict_GetItemString(extensions, filename);
    576         if (dict == NULL)
    577                 return NULL;
    578         mod = PyImport_AddModule(name);
    579         if (mod == NULL)
    580                 return NULL;
    581         mdict = PyModule_GetDict(mod);
    582         if (mdict == NULL)
    583                 return NULL;
    584         if (PyDict_Update(mdict, dict))
    585                 return NULL;
    586         if (Py_VerboseFlag)
    587                 PySys_WriteStderr("import %s # previously loaded (%s)\n",
    588                         name, filename);
    589         return mod;
     604    PyObject *dict, *mod, *mdict;
     605    if (extensions == NULL)
     606        return NULL;
     607    dict = PyDict_GetItemString(extensions, filename);
     608    if (dict == NULL)
     609        return NULL;
     610    mod = PyImport_AddModule(name);
     611    if (mod == NULL)
     612        return NULL;
     613    mdict = PyModule_GetDict(mod);
     614    if (mdict == NULL)
     615        return NULL;
     616    if (PyDict_Update(mdict, dict))
     617        return NULL;
     618    if (Py_VerboseFlag)
     619        PySys_WriteStderr("import %s # previously loaded (%s)\n",
     620            name, filename);
     621    return mod;
    590622}
    591623
     
    600632PyImport_AddModule(const char *name)
    601633{
    602         PyObject *modules = PyImport_GetModuleDict();
    603         PyObject *m;
    604 
    605         if ((m = PyDict_GetItemString(modules, name)) != NULL &&
    606             PyModule_Check(m))
    607                 return m;
    608         m = PyModule_New(name);
    609         if (m == NULL)
    610                 return NULL;
    611         if (PyDict_SetItemString(modules, name, m) != 0) {
    612                 Py_DECREF(m);
    613                 return NULL;
    614         }
    615         Py_DECREF(m); /* Yes, it still exists, in modules! */
    616 
    617         return m;
     634    PyObject *modules = PyImport_GetModuleDict();
     635    PyObject *m;
     636
     637    if ((m = PyDict_GetItemString(modules, name)) != NULL &&
     638        PyModule_Check(m))
     639        return m;
     640    m = PyModule_New(name);
     641    if (m == NULL)
     642        return NULL;
     643    if (PyDict_SetItemString(modules, name, m) != 0) {
     644        Py_DECREF(m);
     645        return NULL;
     646    }
     647    Py_DECREF(m); /* Yes, it still exists, in modules! */
     648
     649    return m;
    618650}
    619651
    620652/* Remove name from sys.modules, if it's there. */
    621653static void
    622 _RemoveModule(const char *name)
    623 {
    624         PyObject *modules = PyImport_GetModuleDict();
    625         if (PyDict_GetItemString(modules, name) == NULL)
    626                 return;
    627         if (PyDict_DelItemString(modules, name) < 0)
    628                 Py_FatalError("import:  deleting existing key in"
    629                               "sys.modules failed");
     654remove_module(const char *name)
     655{
     656    PyObject *modules = PyImport_GetModuleDict();
     657    if (PyDict_GetItemString(modules, name) == NULL)
     658        return;
     659    if (PyDict_DelItemString(modules, name) < 0)
     660        Py_FatalError("import:  deleting existing key in"
     661                      "sys.modules failed");
    630662}
    631663
     
    640672PyImport_ExecCodeModule(char *name, PyObject *co)
    641673{
    642         return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
     674    return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
    643675}
    644676
     
    646678PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
    647679{
    648         PyObject *modules = PyImport_GetModuleDict();
    649         PyObject *m, *d, *v;
    650 
    651         m = PyImport_AddModule(name);
    652         if (m == NULL)
    653                 return NULL;
    654         /* If the module is being reloaded, we get the old module back
    655            and re-use its dict to exec the new code. */
    656         d = PyModule_GetDict(m);
    657         if (PyDict_GetItemString(d, "__builtins__") == NULL) {
    658                 if (PyDict_SetItemString(d, "__builtins__",
    659                                         PyEval_GetBuiltins()) != 0)
    660                         goto error;
    661         }
    662         /* Remember the filename as the __file__ attribute */
    663         v = NULL;
    664         if (pathname != NULL) {
    665                 v = PyString_FromString(pathname);
    666                 if (v == NULL)
    667                         PyErr_Clear();
    668         }
    669         if (v == NULL) {
    670                 v = ((PyCodeObject *)co)->co_filename;
    671                 Py_INCREF(v);
    672         }
    673         if (PyDict_SetItemString(d, "__file__", v) != 0)
    674                 PyErr_Clear(); /* Not important enough to report */
    675         Py_DECREF(v);
    676 
    677         v = PyEval_EvalCode((PyCodeObject *)co, d, d);
    678         if (v == NULL)
    679                 goto error;
    680         Py_DECREF(v);
    681 
    682         if ((m = PyDict_GetItemString(modules, name)) == NULL) {
    683                 PyErr_Format(PyExc_ImportError,
    684                              "Loaded module %.200s not found in sys.modules",
    685                              name);
    686                 return NULL;
    687         }
    688 
    689         Py_INCREF(m);
    690 
    691         return m;
     680    PyObject *modules = PyImport_GetModuleDict();
     681    PyObject *m, *d, *v;
     682
     683    m = PyImport_AddModule(name);
     684    if (m == NULL)
     685        return NULL;
     686    /* If the module is being reloaded, we get the old module back
     687       and re-use its dict to exec the new code. */
     688    d = PyModule_GetDict(m);
     689    if (PyDict_GetItemString(d, "__builtins__") == NULL) {
     690        if (PyDict_SetItemString(d, "__builtins__",
     691                                PyEval_GetBuiltins()) != 0)
     692            goto error;
     693    }
     694    /* Remember the filename as the __file__ attribute */
     695    v = NULL;
     696    if (pathname != NULL) {
     697        v = PyString_FromString(pathname);
     698        if (v == NULL)
     699            PyErr_Clear();
     700    }
     701    if (v == NULL) {
     702        v = ((PyCodeObject *)co)->co_filename;
     703        Py_INCREF(v);
     704    }
     705    if (PyDict_SetItemString(d, "__file__", v) != 0)
     706        PyErr_Clear(); /* Not important enough to report */
     707    Py_DECREF(v);
     708
     709    v = PyEval_EvalCode((PyCodeObject *)co, d, d);
     710    if (v == NULL)
     711        goto error;
     712    Py_DECREF(v);
     713
     714    if ((m = PyDict_GetItemString(modules, name)) == NULL) {
     715        PyErr_Format(PyExc_ImportError,
     716                     "Loaded module %.200s not found in sys.modules",
     717                     name);
     718        return NULL;
     719    }
     720
     721    Py_INCREF(m);
     722
     723    return m;
    692724
    693725  error:
    694         _RemoveModule(name);
    695         return NULL;
     726    remove_module(name);
     727    return NULL;
    696728}
    697729
     
    705737make_compiled_pathname(char *pathname, char *buf, size_t buflen)
    706738{
    707         size_t len = strlen(pathname);
    708         if (len+2 > buflen)
    709                 return NULL;
     739    size_t len = strlen(pathname);
     740    if (len+2 > buflen)
     741        return NULL;
    710742
    711743#ifdef MS_WINDOWS
    712         /* Treat .pyw as if it were .py.  The case of ".pyw" must match
    713            that used in _PyImport_StandardFiletab. */
    714         if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
    715                 --len;  /* pretend 'w' isn't there */
     744    /* Treat .pyw as if it were .py.  The case of ".pyw" must match
     745       that used in _PyImport_StandardFiletab. */
     746    if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
     747        --len;          /* pretend 'w' isn't there */
    716748#endif
    717         memcpy(buf, pathname, len);
    718         buf[len] = Py_OptimizeFlag ? 'o' : 'c';
    719         buf[len+1] = '\0';
    720 
    721         return buf;
     749    memcpy(buf, pathname, len);
     750    buf[len] = Py_OptimizeFlag ? 'o' : 'c';
     751    buf[len+1] = '\0';
     752
     753    return buf;
    722754}
    723755
     
    733765check_compiled_module(char *pathname, time_t mtime, char *cpathname)
    734766{
    735         FILE *fp;
    736         long magic;
    737         long pyc_mtime;
    738 
    739         fp = fopen(cpathname, "rb");
    740         if (fp == NULL)
    741                 return NULL;
    742         magic = PyMarshal_ReadLongFromFile(fp);
    743         if (magic != pyc_magic) {
    744                 if (Py_VerboseFlag)
    745                         PySys_WriteStderr("# %s has bad magic\n", cpathname);
    746                 fclose(fp);
    747                 return NULL;
    748         }
    749         pyc_mtime = PyMarshal_ReadLongFromFile(fp);
    750         if (pyc_mtime != mtime) {
    751                 if (Py_VerboseFlag)
    752                         PySys_WriteStderr("# %s has bad mtime\n", cpathname);
    753                 fclose(fp);
    754                 return NULL;
    755         }
    756         if (Py_VerboseFlag)
    757                 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
    758         return fp;
     767    FILE *fp;
     768    long magic;
     769    long pyc_mtime;
     770
     771    fp = fopen(cpathname, "rb");
     772    if (fp == NULL)
     773        return NULL;
     774    magic = PyMarshal_ReadLongFromFile(fp);
     775    if (magic != pyc_magic) {
     776        if (Py_VerboseFlag)
     777            PySys_WriteStderr("# %s has bad magic\n", cpathname);
     778        fclose(fp);
     779        return NULL;
     780    }
     781    pyc_mtime = PyMarshal_ReadLongFromFile(fp);
     782    if (pyc_mtime != mtime) {
     783        if (Py_VerboseFlag)
     784            PySys_WriteStderr("# %s has bad mtime\n", cpathname);
     785        fclose(fp);
     786        return NULL;
     787    }
     788    if (Py_VerboseFlag)
     789        PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
     790    return fp;
    759791}
    760792
     
    765797read_compiled_module(char *cpathname, FILE *fp)
    766798{
    767         PyObject *co;
    768 
    769         co = PyMarshal_ReadLastObjectFromFile(fp);
    770         if (co == NULL)
    771                 return NULL;
    772         if (!PyCode_Check(co)) {
    773                 PyErr_Format(PyExc_ImportError,
    774                              "Non-code object in %.200s", cpathname);
    775                 Py_DECREF(co);
    776                 return NULL;
    777         }
    778         return (PyCodeObject *)co;
     799    PyObject *co;
     800
     801    co = PyMarshal_ReadLastObjectFromFile(fp);
     802    if (co == NULL)
     803        return NULL;
     804    if (!PyCode_Check(co)) {
     805        PyErr_Format(PyExc_ImportError,
     806                     "Non-code object in %.200s", cpathname);
     807        Py_DECREF(co);
     808        return NULL;
     809    }
     810    return (PyCodeObject *)co;
    779811}
    780812
     
    786818load_compiled_module(char *name, char *cpathname, FILE *fp)
    787819{
    788         long magic;
    789         PyCodeObject *co;
    790         PyObject *m;
    791 
    792         magic = PyMarshal_ReadLongFromFile(fp);
    793         if (magic != pyc_magic) {
    794                 PyErr_Format(PyExc_ImportError,
    795                              "Bad magic number in %.200s", cpathname);
    796                 return NULL;
    797         }
    798         (void) PyMarshal_ReadLongFromFile(fp);
    799         co = read_compiled_module(cpathname, fp);
    800         if (co == NULL)
    801                 return NULL;
    802         if (Py_VerboseFlag)
    803                 PySys_WriteStderr("import %s # precompiled from %s\n",
    804                         name, cpathname);
    805         m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
    806         Py_DECREF(co);
    807 
    808         return m;
     820    long magic;
     821    PyCodeObject *co;
     822    PyObject *m;
     823
     824    magic = PyMarshal_ReadLongFromFile(fp);
     825    if (magic != pyc_magic) {
     826        PyErr_Format(PyExc_ImportError,
     827                     "Bad magic number in %.200s", cpathname);
     828        return NULL;
     829    }
     830    (void) PyMarshal_ReadLongFromFile(fp);
     831    co = read_compiled_module(cpathname, fp);
     832    if (co == NULL)
     833        return NULL;
     834    if (Py_VerboseFlag)
     835        PySys_WriteStderr("import %s # precompiled from %s\n",
     836            name, cpathname);
     837    m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
     838    Py_DECREF(co);
     839
     840    return m;
    809841}
    810842
     
    814846parse_source_module(const char *pathname, FILE *fp)
    815847{
    816         PyCodeObject *co = NULL;
    817         mod_ty mod;
    818         PyCompilerFlags flags;
    819         PyArena *arena = PyArena_New();
    820         if (arena == NULL)
    821                 return NULL;
    822 
    823         flags.cf_flags = 0;
    824 
    825         mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
    826                                    NULL, arena);
    827         if (mod) {
    828                 co = PyAST_Compile(mod, pathname, NULL, arena);
    829         }
    830         PyArena_Free(arena);
    831         return co;
     848    PyCodeObject *co = NULL;
     849    mod_ty mod;
     850    PyCompilerFlags flags;
     851    PyArena *arena = PyArena_New();
     852    if (arena == NULL)
     853        return NULL;
     854
     855    flags.cf_flags = 0;
     856
     857    mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
     858                               NULL, arena);
     859    if (mod) {
     860        co = PyAST_Compile(mod, pathname, NULL, arena);
     861    }
     862    PyArena_Free(arena);
     863    return co;
    832864}
    833865
     
    839871{
    840872#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
    841         /* Use O_EXCL to avoid a race condition when another process tries to
    842            write the same file.  When that happens, our open() call fails,
    843            which is just fine (since it's only a cache).
    844            XXX If the file exists and is writable but the directory is not
    845            writable, the file will never be written.  Oh well.
    846         */
    847         int fd;
    848         (void) unlink(filename);
    849         fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
     873    /* Use O_EXCL to avoid a race condition when another process tries to
     874       write the same file.  When that happens, our open() call fails,
     875       which is just fine (since it's only a cache).
     876       XXX If the file exists and is writable but the directory is not
     877       writable, the file will never be written.  Oh well.
     878    */
     879    int fd;
     880    (void) unlink(filename);
     881    fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
    850882#ifdef O_BINARY
    851                                 |O_BINARY   /* necessary for Windows */
     883                            |O_BINARY   /* necessary for Windows */
    852884#endif
    853885#ifdef __VMS
    854                         , mode, "ctxt=bin", "shr=nil"
     886            , mode, "ctxt=bin", "shr=nil"
    855887#else
    856                         , mode
     888            , mode
    857889#endif
    858                   );
    859         if (fd < 0)
    860                 return NULL;
    861         return fdopen(fd, "wb");
     890          );
     891    if (fd < 0)
     892        return NULL;
     893    return fdopen(fd, "wb");
    862894#else
    863         /* Best we can do -- on Windows this can't happen anyway */
    864         return fopen(filename, "wb");
     895    /* Best we can do -- on Windows this can't happen anyway */
     896    return fopen(filename, "wb");
    865897#endif
    866898}
     
    873905
    874906static void
    875 write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
    876 {
    877         FILE *fp;
    878         time_t mtime = srcstat->st_mtime;
     907write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, time_t mtime)
     908{
     909    FILE *fp;
    879910#ifdef MS_WINDOWS   /* since Windows uses different permissions  */
    880         mode_t mode = srcstat->st_mode & ~S_IEXEC;
     911    mode_t mode = srcstat->st_mode & ~S_IEXEC;
     912    /* Issue #6074: We ensure user write access, so we can delete it later
     913     * when the source file changes. (On POSIX, this only requires write
     914     * access to the directory, on Windows, we need write access to the file
     915     * as well)
     916     */
     917    mode |= _S_IWRITE;
    881918#else
    882         mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
    883 #endif 
    884 
    885         fp = open_exclusive(cpathname, mode);
    886         if (fp == NULL) {
    887                 if (Py_VerboseFlag)
    888                         PySys_WriteStderr(
    889                                 "# can't create %s\n", cpathname);
    890                 return;
    891         }
    892         PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
    893         /* First write a 0 for mtime */
    894         PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
    895         PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
    896         if (fflush(fp) != 0 || ferror(fp)) {
    897                 if (Py_VerboseFlag)
    898                         PySys_WriteStderr("# can't write %s\n", cpathname);
    899                 /* Don't keep partial file */
    900                 fclose(fp);
    901                 (void) unlink(cpathname);
    902                 return;
    903         }
    904         /* Now write the true mtime */
    905         fseek(fp, 4L, 0);
    906         assert(mtime < LONG_MAX);
    907         PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
    908         fflush(fp);
    909         fclose(fp);
    910         if (Py_VerboseFlag)
    911                 PySys_WriteStderr("# wrote %s\n", cpathname);
     919    mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
     920#endif
     921
     922    fp = open_exclusive(cpathname, mode);
     923    if (fp == NULL) {
     924        if (Py_VerboseFlag)
     925            PySys_WriteStderr(
     926                "# can't create %s\n", cpathname);
     927        return;
     928    }
     929    PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
     930    /* First write a 0 for mtime */
     931    PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
     932    PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
     933    if (fflush(fp) != 0 || ferror(fp)) {
     934        if (Py_VerboseFlag)
     935            PySys_WriteStderr("# can't write %s\n", cpathname);
     936        /* Don't keep partial file */
     937        fclose(fp);
     938        (void) unlink(cpathname);
     939        return;
     940    }
     941    /* Now write the true mtime (as a 32-bit field) */
     942    fseek(fp, 4L, 0);
     943    assert(mtime <= 0xFFFFFFFF);
     944    PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
     945    fflush(fp);
     946    fclose(fp);
     947    if (Py_VerboseFlag)
     948        PySys_WriteStderr("# wrote %s\n", cpathname);
    912949}
    913950
     
    915952update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
    916953{
    917         PyObject *constants, *tmp;
    918         Py_ssize_t i, n;
    919 
    920         if (!_PyString_Eq(co->co_filename, oldname))
    921                 return;
    922 
    923         tmp = co->co_filename;
    924         co->co_filename = newname;
    925         Py_INCREF(co->co_filename);
    926         Py_DECREF(tmp);
    927 
    928         constants = co->co_consts;
    929         n = PyTuple_GET_SIZE(constants);
    930         for (i = 0; i < n; i++) {
    931                 tmp = PyTuple_GET_ITEM(constants, i);
    932                 if (PyCode_Check(tmp))
    933                         update_code_filenames((PyCodeObject *)tmp,
    934                                               oldname, newname);
    935         }
     954    PyObject *constants, *tmp;
     955    Py_ssize_t i, n;
     956
     957    if (!_PyString_Eq(co->co_filename, oldname))
     958        return;
     959
     960    tmp = co->co_filename;
     961    co->co_filename = newname;
     962    Py_INCREF(co->co_filename);
     963    Py_DECREF(tmp);
     964
     965    constants = co->co_consts;
     966    n = PyTuple_GET_SIZE(constants);
     967    for (i = 0; i < n; i++) {
     968        tmp = PyTuple_GET_ITEM(constants, i);
     969        if (PyCode_Check(tmp))
     970            update_code_filenames((PyCodeObject *)tmp,
     971                                  oldname, newname);
     972    }
    936973}
    937974
     
    939976update_compiled_module(PyCodeObject *co, char *pathname)
    940977{
    941         PyObject *oldname, *newname;
    942 
    943         if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
    944                 return 0;
    945 
    946         newname = PyString_FromString(pathname);
    947         if (newname == NULL)
    948                 return -1;
    949 
    950         oldname = co->co_filename;
    951         Py_INCREF(oldname);
    952         update_code_filenames(co, oldname, newname);
    953         Py_DECREF(oldname);
    954         Py_DECREF(newname);
    955         return 1;
    956 }
     978    PyObject *oldname, *newname;
     979
     980    if (strcmp(PyString_AsString(co->co_filename), pathname) == 0)
     981        return 0;
     982
     983    newname = PyString_FromString(pathname);
     984    if (newname == NULL)
     985        return -1;
     986
     987    oldname = co->co_filename;
     988    Py_INCREF(oldname);
     989    update_code_filenames(co, oldname, newname);
     990    Py_DECREF(oldname);
     991    Py_DECREF(newname);
     992    return 1;
     993}
     994
     995#ifdef MS_WINDOWS
     996
     997/* Seconds between 1.1.1601 and 1.1.1970 */
     998static __int64 secs_between_epochs = 11644473600;
     999
     1000/* Get mtime from file pointer. */
     1001
     1002static time_t
     1003win32_mtime(FILE *fp, char *pathname)
     1004{
     1005    __int64 filetime;
     1006    HANDLE fh;
     1007    BY_HANDLE_FILE_INFORMATION file_information;
     1008
     1009    fh = (HANDLE)_get_osfhandle(fileno(fp));
     1010    if (fh == INVALID_HANDLE_VALUE ||
     1011        !GetFileInformationByHandle(fh, &file_information)) {
     1012        PyErr_Format(PyExc_RuntimeError,
     1013                     "unable to get file status from '%s'",
     1014                     pathname);
     1015        return -1;
     1016    }
     1017    /* filetime represents the number of 100ns intervals since
     1018       1.1.1601 (UTC).  Convert to seconds since 1.1.1970 (UTC). */
     1019    filetime = (__int64)file_information.ftLastWriteTime.dwHighDateTime << 32 |
     1020               file_information.ftLastWriteTime.dwLowDateTime;
     1021    return filetime / 10000000 - secs_between_epochs;
     1022}
     1023
     1024#endif  /* #ifdef MS_WINDOWS */
     1025
    9571026
    9581027/* Load a source module from a given file and return its module
     
    9631032load_source_module(char *name, char *pathname, FILE *fp)
    9641033{
    965         struct stat st;
    966         FILE *fpc;
    967         char buf[MAXPATHLEN+1];
    968         char *cpathname;
    969         PyCodeObject *co;
    970         PyObject *m;
    971        
    972         if (fstat(fileno(fp), &st) != 0) {
    973                 PyErr_Format(PyExc_RuntimeError,
    974                              "unable to get file status from '%s'",
    975                              pathname);
    976                 return NULL;
    977         }
    978 #if SIZEOF_TIME_T > 4
    979         /* Python's .pyc timestamp handling presumes that the timestamp fits
    980            in 4 bytes. This will be fine until sometime in the year 2038,
    981            when a 4-byte signed time_t will overflow.
    982          */
    983         if (st.st_mtime >> 32) {
    984                 PyErr_SetString(PyExc_OverflowError,
    985                         "modification time overflows a 4 byte field");
    986                 return NULL;
    987         }
     1034    struct stat st;
     1035    FILE *fpc;
     1036    char *buf;
     1037    char *cpathname;
     1038    PyCodeObject *co = NULL;
     1039    PyObject *m;
     1040    time_t mtime;
     1041
     1042    if (fstat(fileno(fp), &st) != 0) {
     1043        PyErr_Format(PyExc_RuntimeError,
     1044                     "unable to get file status from '%s'",
     1045                     pathname);
     1046        return NULL;
     1047    }
     1048
     1049#ifdef MS_WINDOWS
     1050    mtime = win32_mtime(fp, pathname);
     1051    if (mtime == (time_t)-1 && PyErr_Occurred())
     1052        return NULL;
     1053#else
     1054    mtime = st.st_mtime;
    9881055#endif
    989         cpathname = make_compiled_pathname(pathname, buf,
    990                                            (size_t)MAXPATHLEN + 1);
    991         if (cpathname != NULL &&
    992             (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
    993                 co = read_compiled_module(cpathname, fpc);
    994                 fclose(fpc);
    995                 if (co == NULL)
    996                         return NULL;
    997                 if (update_compiled_module(co, pathname) < 0)
    998                         return NULL;
    999                 if (Py_VerboseFlag)
    1000                         PySys_WriteStderr("import %s # precompiled from %s\n",
    1001                                 name, cpathname);
    1002                 pathname = cpathname;
    1003         }
    1004         else {
    1005                 co = parse_source_module(pathname, fp);
    1006                 if (co == NULL)
    1007                         return NULL;
    1008                 if (Py_VerboseFlag)
    1009                         PySys_WriteStderr("import %s # from %s\n",
    1010                                 name, pathname);
    1011                 if (cpathname) {
    1012                         PyObject *ro = PySys_GetObject("dont_write_bytecode");
    1013                         if (ro == NULL || !PyObject_IsTrue(ro))
    1014                                 write_compiled_module(co, cpathname, &st);
    1015                 }
    1016         }
    1017         m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
    1018         Py_DECREF(co);
    1019 
    1020         return m;
     1056    if (sizeof mtime > 4) {
     1057        /* Python's .pyc timestamp handling presumes that the timestamp fits
     1058           in 4 bytes. Since the code only does an equality comparison,
     1059           ordering is not important and we can safely ignore the higher bits
     1060           (collisions are extremely unlikely).
     1061         */
     1062        mtime &= 0xFFFFFFFF;
     1063    }
     1064    buf = PyMem_MALLOC(MAXPATHLEN+1);
     1065    if (buf == NULL) {
     1066        return PyErr_NoMemory();
     1067    }
     1068    cpathname = make_compiled_pathname(pathname, buf,
     1069                                       (size_t)MAXPATHLEN + 1);
     1070    if (cpathname != NULL &&
     1071        (fpc = check_compiled_module(pathname, mtime, cpathname))) {
     1072        co = read_compiled_module(cpathname, fpc);
     1073        fclose(fpc);
     1074        if (co == NULL)
     1075            goto error_exit;
     1076        if (update_compiled_module(co, pathname) < 0)
     1077            goto error_exit;
     1078        if (Py_VerboseFlag)
     1079            PySys_WriteStderr("import %s # precompiled from %s\n",
     1080                name, cpathname);
     1081        pathname = cpathname;
     1082    }
     1083    else {
     1084        co = parse_source_module(pathname, fp);
     1085        if (co == NULL)
     1086            goto error_exit;
     1087        if (Py_VerboseFlag)
     1088            PySys_WriteStderr("import %s # from %s\n",
     1089                name, pathname);
     1090        if (cpathname) {
     1091            PyObject *ro = PySys_GetObject("dont_write_bytecode");
     1092            int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro);
     1093            if (b < 0)
     1094                goto error_exit;
     1095            if (!b)
     1096                write_compiled_module(co, cpathname, &st, mtime);
     1097        }
     1098    }
     1099    m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
     1100    Py_DECREF(co);
     1101
     1102    PyMem_FREE(buf);
     1103    return m;
     1104
     1105error_exit:
     1106    Py_XDECREF(co);
     1107    PyMem_FREE(buf);
     1108    return NULL;
    10211109}
    10221110
     
    10251113static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
    10261114static struct filedescr *find_module(char *, char *, PyObject *,
    1027                                      char *, size_t, FILE **, PyObject **);
     1115                                     char *, size_t, FILE **, PyObject **);
    10281116static struct _frozen *find_frozen(char *name);
    10291117
     
    10341122load_package(char *name, char *pathname)
    10351123{
    1036         PyObject *m, *d;
    1037         PyObject *file = NULL;
    1038         PyObject *path = NULL;
    1039         int err;
    1040         char buf[MAXPATHLEN+1];
    1041         FILE *fp = NULL;
    1042         struct filedescr *fdp;
    1043 
    1044         m = PyImport_AddModule(name);
    1045         if (m == NULL)
    1046                 return NULL;
    1047         if (Py_VerboseFlag)
    1048                 PySys_WriteStderr("import %s # directory %s\n",
    1049                         name, pathname);
    1050         d = PyModule_GetDict(m);
    1051         file = PyString_FromString(pathname);
    1052         if (file == NULL)
    1053                 goto error;
    1054         path = Py_BuildValue("[O]", file);
    1055         if (path == NULL)
    1056                 goto error;
    1057         err = PyDict_SetItemString(d, "__file__", file);
    1058         if (err == 0)
    1059                 err = PyDict_SetItemString(d, "__path__", path);
    1060         if (err != 0)
    1061                 goto error;
    1062         buf[0] = '\0';
    1063         fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
    1064         if (fdp == NULL) {
    1065                 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
    1066                         PyErr_Clear();
    1067                         Py_INCREF(m);
    1068                 }
    1069                 else
    1070                         m = NULL;
    1071                 goto cleanup;
    1072         }
    1073         m = load_module(name, fp, buf, fdp->type, NULL);
    1074         if (fp != NULL)
    1075                 fclose(fp);
    1076         goto cleanup;
     1124    PyObject *m, *d;
     1125    PyObject *file = NULL;
     1126    PyObject *path = NULL;
     1127    int err;
     1128    char *buf = NULL;
     1129    FILE *fp = NULL;
     1130    struct filedescr *fdp;
     1131
     1132    m = PyImport_AddModule(name);
     1133    if (m == NULL)
     1134        return NULL;
     1135    if (Py_VerboseFlag)
     1136        PySys_WriteStderr("import %s # directory %s\n",
     1137            name, pathname);
     1138    d = PyModule_GetDict(m);
     1139    file = PyString_FromString(pathname);
     1140    if (file == NULL)
     1141        goto error;
     1142    path = Py_BuildValue("[O]", file);
     1143    if (path == NULL)
     1144        goto error;
     1145    err = PyDict_SetItemString(d, "__file__", file);
     1146    if (err == 0)
     1147        err = PyDict_SetItemString(d, "__path__", path);
     1148    if (err != 0)
     1149        goto error;
     1150    buf = PyMem_MALLOC(MAXPATHLEN+1);
     1151    if (buf == NULL) {
     1152        PyErr_NoMemory();
     1153        goto error;
     1154    }
     1155    buf[0] = '\0';
     1156    fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL);
     1157    if (fdp == NULL) {
     1158        if (PyErr_ExceptionMatches(PyExc_ImportError)) {
     1159            PyErr_Clear();
     1160            Py_INCREF(m);
     1161        }
     1162        else
     1163            m = NULL;
     1164        goto cleanup;
     1165    }
     1166    m = load_module(name, fp, buf, fdp->type, NULL);
     1167    if (fp != NULL)
     1168        fclose(fp);
     1169    goto cleanup;
    10771170
    10781171  error:
    1079         m = NULL;
     1172    m = NULL;
    10801173  cleanup:
    1081         Py_XDECREF(path);
    1082         Py_XDECREF(file);
    1083         return m;
     1174    if (buf)
     1175        PyMem_FREE(buf);
     1176    Py_XDECREF(path);
     1177    Py_XDECREF(file);
     1178    return m;
    10841179}
    10851180
     
    10901185is_builtin(char *name)
    10911186{
    1092         int i;
    1093         for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
    1094                 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
    1095                         if (PyImport_Inittab[i].initfunc == NULL)
    1096                                 return -1;
    1097                         else
    1098                                 return 1;
    1099                 }
    1100         }
    1101         return 0;
     1187    int i;
     1188    for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
     1189        if (strcmp(name, PyImport_Inittab[i].name) == 0) {
     1190            if (PyImport_Inittab[i].initfunc == NULL)
     1191                return -1;
     1192            else
     1193                return 1;
     1194        }
     1195    }
     1196    return 0;
    11021197}
    11031198
     
    11131208static PyObject *
    11141209get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
    1115                   PyObject *p)
    1116 {
    1117         PyObject *importer;
    1118         Py_ssize_t j, nhooks;
    1119 
    1120         /* These conditions are the caller's responsibility: */
    1121         assert(PyList_Check(path_hooks));
    1122         assert(PyDict_Check(path_importer_cache));
    1123 
    1124         nhooks = PyList_Size(path_hooks);
    1125         if (nhooks < 0)
    1126                 return NULL; /* Shouldn't happen */
    1127 
    1128         importer = PyDict_GetItem(path_importer_cache, p);
    1129         if (importer != NULL)
    1130                 return importer;
    1131 
    1132         /* set path_importer_cache[p] to None to avoid recursion */
    1133         if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
    1134                 return NULL;
    1135 
    1136         for (j = 0; j < nhooks; j++) {
    1137                 PyObject *hook = PyList_GetItem(path_hooks, j);
    1138                 if (hook == NULL)
    1139                         return NULL;
    1140                 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
    1141                 if (importer != NULL)
    1142                         break;
    1143 
    1144                 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
    1145                         return NULL;
    1146                 }
    1147                 PyErr_Clear();
    1148         }
    1149         if (importer == NULL) {
    1150                 importer = PyObject_CallFunctionObjArgs(
    1151                         (PyObject *)&PyNullImporter_Type, p, NULL
    1152                 );
    1153                 if (importer == NULL) {
    1154                         if (PyErr_ExceptionMatches(PyExc_ImportError)) {
    1155                                 PyErr_Clear();
    1156                                 return Py_None;
    1157                         }
    1158                 }
    1159         }
    1160         if (importer != NULL) {
    1161                 int err = PyDict_SetItem(path_importer_cache, p, importer);
    1162                 Py_DECREF(importer);
    1163                 if (err != 0)
    1164                         return NULL;
    1165         }
    1166         return importer;
     1210                  PyObject *p)
     1211{
     1212    PyObject *importer;
     1213    Py_ssize_t j, nhooks;
     1214
     1215    /* These conditions are the caller's responsibility: */
     1216    assert(PyList_Check(path_hooks));
     1217    assert(PyDict_Check(path_importer_cache));
     1218
     1219    nhooks = PyList_Size(path_hooks);
     1220    if (nhooks < 0)
     1221        return NULL; /* Shouldn't happen */
     1222
     1223    importer = PyDict_GetItem(path_importer_cache, p);
     1224    if (importer != NULL)
     1225        return importer;
     1226
     1227    /* set path_importer_cache[p] to None to avoid recursion */
     1228    if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
     1229        return NULL;
     1230
     1231    for (j = 0; j < nhooks; j++) {
     1232        PyObject *hook = PyList_GetItem(path_hooks, j);
     1233        if (hook == NULL)
     1234            return NULL;
     1235        importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
     1236        if (importer != NULL)
     1237            break;
     1238
     1239        if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
     1240            return NULL;
     1241        }
     1242        PyErr_Clear();
     1243    }
     1244    if (importer == NULL) {
     1245        importer = PyObject_CallFunctionObjArgs(
     1246            (PyObject *)&PyNullImporter_Type, p, NULL
     1247        );
     1248        if (importer == NULL) {
     1249            if (PyErr_ExceptionMatches(PyExc_ImportError)) {
     1250                PyErr_Clear();
     1251                return Py_None;
     1252            }
     1253        }
     1254    }
     1255    if (importer != NULL) {
     1256        int err = PyDict_SetItem(path_importer_cache, p, importer);
     1257        Py_DECREF(importer);
     1258        if (err != 0)
     1259            return NULL;
     1260    }
     1261    return importer;
    11671262}
    11681263
    11691264PyAPI_FUNC(PyObject *)
    11701265PyImport_GetImporter(PyObject *path) {
    1171         PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
    1172 
    1173         if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
    1174                 if ((path_hooks = PySys_GetObject("path_hooks"))) {
    1175                         importer = get_path_importer(path_importer_cache,
    1176                                                      path_hooks, path);
    1177                 }
    1178         }
    1179         Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
    1180         return importer;
     1266    PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
     1267
     1268    if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
     1269        if ((path_hooks = PySys_GetObject("path_hooks"))) {
     1270            importer = get_path_importer(path_importer_cache,
     1271                                         path_hooks, path);
     1272        }
     1273    }
     1274    Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
     1275    return importer;
    11811276}
    11821277
     
    11871282#ifdef MS_COREDLL
    11881283extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
    1189                                         char *, Py_ssize_t);
     1284                                        char *, Py_ssize_t);
    11901285#endif
    11911286
     
    11961291static struct filedescr *
    11971292find_module(char *fullname, char *subname, PyObject *path, char *buf,
    1198             size_t buflen, FILE **p_fp, PyObject **p_loader)
    1199 {
    1200         Py_ssize_t i, npath;
    1201         size_t len, namelen;
    1202         struct filedescr *fdp = NULL;
    1203         char *filemode;
    1204         FILE *fp = NULL;
    1205         PyObject *path_hooks, *path_importer_cache;
    1206 #ifndef RISCOS
    1207         struct stat statbuf;
     1293            size_t buflen, FILE **p_fp, PyObject **p_loader)
     1294{
     1295    Py_ssize_t i, npath;
     1296    size_t len, namelen;
     1297    struct filedescr *fdp = NULL;
     1298    char *filemode;
     1299    FILE *fp = NULL;
     1300    PyObject *path_hooks, *path_importer_cache;
     1301    static struct filedescr fd_frozen = {"", "", PY_FROZEN};
     1302    static struct filedescr fd_builtin = {"", "", C_BUILTIN};
     1303    static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
     1304    char *name;
     1305#if defined(PYOS_OS2)
     1306    size_t saved_len;
     1307    size_t saved_namelen;
     1308    char *saved_buf = NULL;
    12081309#endif
    1209         static struct filedescr fd_frozen = {"", "", PY_FROZEN};
    1210         static struct filedescr fd_builtin = {"", "", C_BUILTIN};
    1211         static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
    1212         char name[MAXPATHLEN+1];
     1310    if (p_loader != NULL)
     1311        *p_loader = NULL;
     1312
     1313    if (strlen(subname) > MAXPATHLEN) {
     1314        PyErr_SetString(PyExc_OverflowError,
     1315                        "module name is too long");
     1316        return NULL;
     1317    }
     1318    name = PyMem_MALLOC(MAXPATHLEN+1);
     1319    if (name == NULL) {
     1320        PyErr_NoMemory();
     1321        return NULL;
     1322    }
     1323    strcpy(name, subname);
     1324
     1325    /* sys.meta_path import hook */
     1326    if (p_loader != NULL) {
     1327        PyObject *meta_path;
     1328
     1329        meta_path = PySys_GetObject("meta_path");
     1330        if (meta_path == NULL || !PyList_Check(meta_path)) {
     1331            PyErr_SetString(PyExc_RuntimeError,
     1332                            "sys.meta_path must be a list of "
     1333                            "import hooks");
     1334            goto error_exit;
     1335        }
     1336        Py_INCREF(meta_path);  /* zap guard */
     1337        npath = PyList_Size(meta_path);
     1338        for (i = 0; i < npath; i++) {
     1339            PyObject *loader;
     1340            PyObject *hook = PyList_GetItem(meta_path, i);
     1341            loader = PyObject_CallMethod(hook, "find_module",
     1342                                         "sO", fullname,
     1343                                         path != NULL ?
     1344                                         path : Py_None);
     1345            if (loader == NULL) {
     1346                Py_DECREF(meta_path);
     1347                goto error_exit;  /* true error */
     1348            }
     1349            if (loader != Py_None) {
     1350                /* a loader was found */
     1351                *p_loader = loader;
     1352                Py_DECREF(meta_path);
     1353                PyMem_FREE(name);
     1354                return &importhookdescr;
     1355            }
     1356            Py_DECREF(loader);
     1357        }
     1358        Py_DECREF(meta_path);
     1359    }
     1360
     1361    if (path != NULL && PyString_Check(path)) {
     1362        /* The only type of submodule allowed inside a "frozen"
     1363           package are other frozen modules or packages. */
     1364        if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
     1365            PyErr_SetString(PyExc_ImportError,
     1366                            "full frozen module name too long");
     1367            goto error_exit;
     1368        }
     1369        strcpy(buf, PyString_AsString(path));
     1370        strcat(buf, ".");
     1371        strcat(buf, name);
     1372        strcpy(name, buf);
     1373        if (find_frozen(name) != NULL) {
     1374            strcpy(buf, name);
     1375            PyMem_FREE(name);
     1376            return &fd_frozen;
     1377        }
     1378        PyErr_Format(PyExc_ImportError,
     1379                     "No frozen submodule named %.200s", name);
     1380        goto error_exit;
     1381    }
     1382    if (path == NULL) {
     1383        if (is_builtin(name)) {
     1384            strcpy(buf, name);
     1385            PyMem_FREE(name);
     1386            return &fd_builtin;
     1387        }
     1388        if ((find_frozen(name)) != NULL) {
     1389            strcpy(buf, name);
     1390            PyMem_FREE(name);
     1391            return &fd_frozen;
     1392        }
     1393
     1394#ifdef MS_COREDLL
     1395        fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
     1396        if (fp != NULL) {
     1397            *p_fp = fp;
     1398            PyMem_FREE(name);
     1399            return fdp;
     1400        }
     1401#endif
     1402        path = PySys_GetObject("path");
     1403    }
     1404    if (path == NULL || !PyList_Check(path)) {
     1405        PyErr_SetString(PyExc_RuntimeError,
     1406                        "sys.path must be a list of directory names");
     1407        goto error_exit;
     1408    }
     1409
     1410    path_hooks = PySys_GetObject("path_hooks");
     1411    if (path_hooks == NULL || !PyList_Check(path_hooks)) {
     1412        PyErr_SetString(PyExc_RuntimeError,
     1413                        "sys.path_hooks must be a list of "
     1414                        "import hooks");
     1415        goto error_exit;
     1416    }
     1417    path_importer_cache = PySys_GetObject("path_importer_cache");
     1418    if (path_importer_cache == NULL ||
     1419        !PyDict_Check(path_importer_cache)) {
     1420        PyErr_SetString(PyExc_RuntimeError,
     1421                        "sys.path_importer_cache must be a dict");
     1422        goto error_exit;
     1423    }
     1424
     1425    npath = PyList_Size(path);
     1426    namelen = strlen(name);
     1427    for (i = 0; i < npath; i++) {
     1428        PyObject *copy = NULL;
     1429        PyObject *v = PyList_GetItem(path, i);
     1430        if (!v)
     1431            goto error_exit;
     1432#ifdef Py_USING_UNICODE
     1433        if (PyUnicode_Check(v)) {
     1434            copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
     1435                PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
     1436            if (copy == NULL)
     1437                goto error_exit;
     1438            v = copy;
     1439        }
     1440        else
     1441#endif
     1442        if (!PyString_Check(v))
     1443            continue;
     1444        len = PyString_GET_SIZE(v);
     1445        if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
     1446            Py_XDECREF(copy);
     1447            continue; /* Too long */
     1448        }
     1449        strcpy(buf, PyString_AS_STRING(v));
     1450        if (strlen(buf) != len) {
     1451            Py_XDECREF(copy);
     1452            continue; /* v contains '\0' */
     1453        }
     1454
     1455        /* sys.path_hooks import hook */
     1456        if (p_loader != NULL) {
     1457            PyObject *importer;
     1458
     1459            importer = get_path_importer(path_importer_cache,
     1460                                         path_hooks, v);
     1461            if (importer == NULL) {
     1462                Py_XDECREF(copy);
     1463                goto error_exit;
     1464            }
     1465            /* Note: importer is a borrowed reference */
     1466            if (importer != Py_None) {
     1467                PyObject *loader;
     1468                loader = PyObject_CallMethod(importer,
     1469                                             "find_module",
     1470                                             "s", fullname);
     1471                Py_XDECREF(copy);
     1472                if (loader == NULL)
     1473                    goto error_exit;  /* error */
     1474                if (loader != Py_None) {
     1475                    /* a loader was found */
     1476                    *p_loader = loader;
     1477                    PyMem_FREE(name);
     1478                    return &importhookdescr;
     1479                }
     1480                Py_DECREF(loader);
     1481                continue;
     1482            }
     1483        }
     1484        /* no hook was found, use builtin import */
     1485
     1486        if (len > 0 && buf[len-1] != SEP
     1487#ifdef ALTSEP
     1488            && buf[len-1] != ALTSEP
     1489#endif
     1490            )
     1491            buf[len++] = SEP;
     1492        strcpy(buf+len, name);
     1493        len += namelen;
     1494
     1495        /* Check for package import (buf holds a directory name,
     1496           and there's an __init__ module in that directory */
     1497        if (isdir(buf) &&         /* it's an existing directory */
     1498            case_ok(buf, len, namelen, name)) { /* case matches */
     1499            if (find_init_module(buf)) { /* and has __init__.py */
     1500                Py_XDECREF(copy);
     1501                PyMem_FREE(name);
     1502                return &fd_package;
     1503            }
     1504            else {
     1505                char warnstr[MAXPATHLEN+80];
     1506                sprintf(warnstr, "Not importing directory "
     1507                    "'%.*s': missing __init__.py",
     1508                    MAXPATHLEN, buf);
     1509                if (PyErr_Warn(PyExc_ImportWarning,
     1510                               warnstr)) {
     1511                    Py_XDECREF(copy);
     1512                    goto error_exit;
     1513                }
     1514            }
     1515        }
    12131516#if defined(PYOS_OS2)
    1214         size_t saved_len;
    1215         size_t saved_namelen;
    1216         char *saved_buf = NULL;
     1517        /* take a snapshot of the module spec for restoration
     1518         * after the 8 character DLL hackery
     1519         */
     1520        saved_buf = strdup(buf);
     1521        saved_len = len;
     1522        saved_namelen = namelen;
     1523#endif /* PYOS_OS2 */
     1524        for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
     1525#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
     1526            /* OS/2 limits DLLs to 8 character names (w/o
     1527               extension)
     1528             * so if the name is longer than that and its a
     1529             * dynamically loaded module we're going to try,
     1530             * truncate the name before trying
     1531             */
     1532            if (strlen(subname) > 8) {
     1533                /* is this an attempt to load a C extension? */
     1534                const struct filedescr *scan;
     1535                scan = _PyImport_DynLoadFiletab;
     1536                while (scan->suffix != NULL) {
     1537                    if (!strcmp(scan->suffix, fdp->suffix))
     1538                        break;
     1539                    else
     1540                        scan++;
     1541                }
     1542                if (scan->suffix != NULL) {
     1543                    /* yes, so truncate the name */
     1544                    namelen = 8;
     1545                    len -= strlen(subname) - namelen;
     1546                    buf[len] = '\0';
     1547                }
     1548            }
     1549#endif /* PYOS_OS2 */
     1550            strcpy(buf+len, fdp->suffix);
     1551            if (Py_VerboseFlag > 1)
     1552                PySys_WriteStderr("# trying %s\n", buf);
     1553            filemode = fdp->mode;
     1554            if (filemode[0] == 'U')
     1555                filemode = "r" PY_STDIOTEXTMODE;
     1556            fp = fopen(buf, filemode);
     1557            if (fp != NULL) {
     1558                if (case_ok(buf, len, namelen, name))
     1559                    break;
     1560                else {                   /* continue search */
     1561                    fclose(fp);
     1562                    fp = NULL;
     1563                }
     1564            }
     1565#if defined(PYOS_OS2)
     1566            /* restore the saved snapshot */
     1567            strcpy(buf, saved_buf);
     1568            len = saved_len;
     1569            namelen = saved_namelen;
    12171570#endif
    1218         if (p_loader != NULL)
    1219                 *p_loader = NULL;
    1220 
    1221         if (strlen(subname) > MAXPATHLEN) {
    1222                 PyErr_SetString(PyExc_OverflowError,
    1223                                 "module name is too long");
    1224                 return NULL;
    1225         }
    1226         strcpy(name, subname);
    1227 
    1228         /* sys.meta_path import hook */
    1229         if (p_loader != NULL) {
    1230                 PyObject *meta_path;
    1231 
    1232                 meta_path = PySys_GetObject("meta_path");
    1233                 if (meta_path == NULL || !PyList_Check(meta_path)) {
    1234                         PyErr_SetString(PyExc_ImportError,
    1235                                         "sys.meta_path must be a list of "
    1236                                         "import hooks");
    1237                         return NULL;
    1238                 }
    1239                 Py_INCREF(meta_path);  /* zap guard */
    1240                 npath = PyList_Size(meta_path);
    1241                 for (i = 0; i < npath; i++) {
    1242                         PyObject *loader;
    1243                         PyObject *hook = PyList_GetItem(meta_path, i);
    1244                         loader = PyObject_CallMethod(hook, "find_module",
    1245                                                      "sO", fullname,
    1246                                                      path != NULL ?
    1247                                                      path : Py_None);
    1248                         if (loader == NULL) {
    1249                                 Py_DECREF(meta_path);
    1250                                 return NULL;  /* true error */
    1251                         }
    1252                         if (loader != Py_None) {
    1253                                 /* a loader was found */
    1254                                 *p_loader = loader;
    1255                                 Py_DECREF(meta_path);
    1256                                 return &importhookdescr;
    1257                         }
    1258                         Py_DECREF(loader);
    1259                 }
    1260                 Py_DECREF(meta_path);
    1261         }
    1262 
    1263         if (path != NULL && PyString_Check(path)) {
    1264                 /* The only type of submodule allowed inside a "frozen"
    1265                    package are other frozen modules or packages. */
    1266                 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
    1267                         PyErr_SetString(PyExc_ImportError,
    1268                                         "full frozen module name too long");
    1269                         return NULL;
    1270                 }
    1271                 strcpy(buf, PyString_AsString(path));
    1272                 strcat(buf, ".");
    1273                 strcat(buf, name);
    1274                 strcpy(name, buf);
    1275                 if (find_frozen(name) != NULL) {
    1276                         strcpy(buf, name);
    1277                         return &fd_frozen;
    1278                 }
    1279                 PyErr_Format(PyExc_ImportError,
    1280                              "No frozen submodule named %.200s", name);
    1281                 return NULL;
    1282         }
    1283         if (path == NULL) {
    1284                 if (is_builtin(name)) {
    1285                         strcpy(buf, name);
    1286                         return &fd_builtin;
    1287                 }
    1288                 if ((find_frozen(name)) != NULL) {
    1289                         strcpy(buf, name);
    1290                         return &fd_frozen;
    1291                 }
    1292 
    1293 #ifdef MS_COREDLL
    1294                 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
    1295                 if (fp != NULL) {
    1296                         *p_fp = fp;
    1297                         return fdp;
    1298                 }
     1571        }
     1572#if defined(PYOS_OS2)
     1573        /* don't need/want the module name snapshot anymore */
     1574        if (saved_buf)
     1575        {
     1576            free(saved_buf);
     1577            saved_buf = NULL;
     1578        }
    12991579#endif
    1300                 path = PySys_GetObject("path");
    1301         }
    1302         if (path == NULL || !PyList_Check(path)) {
    1303                 PyErr_SetString(PyExc_ImportError,
    1304                                 "sys.path must be a list of directory names");
    1305                 return NULL;
    1306         }
    1307 
    1308         path_hooks = PySys_GetObject("path_hooks");
    1309         if (path_hooks == NULL || !PyList_Check(path_hooks)) {
    1310                 PyErr_SetString(PyExc_ImportError,
    1311                                 "sys.path_hooks must be a list of "
    1312                                 "import hooks");
    1313                 return NULL;
    1314         }
    1315         path_importer_cache = PySys_GetObject("path_importer_cache");
    1316         if (path_importer_cache == NULL ||
    1317             !PyDict_Check(path_importer_cache)) {
    1318                 PyErr_SetString(PyExc_ImportError,
    1319                                 "sys.path_importer_cache must be a dict");
    1320                 return NULL;
    1321         }
    1322 
    1323         npath = PyList_Size(path);
    1324         namelen = strlen(name);
    1325         for (i = 0; i < npath; i++) {
    1326                 PyObject *copy = NULL;
    1327                 PyObject *v = PyList_GetItem(path, i);
    1328                 if (!v)
    1329                         return NULL;
    1330 #ifdef Py_USING_UNICODE
    1331                 if (PyUnicode_Check(v)) {
    1332                         copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
    1333                                 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
    1334                         if (copy == NULL)
    1335                                 return NULL;
    1336                         v = copy;
    1337                 }
    1338                 else
    1339 #endif
    1340                 if (!PyString_Check(v))
    1341                         continue;
    1342                 len = PyString_GET_SIZE(v);
    1343                 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
    1344                         Py_XDECREF(copy);
    1345                         continue; /* Too long */
    1346                 }
    1347                 strcpy(buf, PyString_AS_STRING(v));
    1348                 if (strlen(buf) != len) {
    1349                         Py_XDECREF(copy);
    1350                         continue; /* v contains '\0' */
    1351                 }
    1352 
    1353                 /* sys.path_hooks import hook */
    1354                 if (p_loader != NULL) {
    1355                         PyObject *importer;
    1356 
    1357                         importer = get_path_importer(path_importer_cache,
    1358                                                      path_hooks, v);
    1359                         if (importer == NULL) {
    1360                                 Py_XDECREF(copy);
    1361                                 return NULL;
    1362                         }
    1363                         /* Note: importer is a borrowed reference */
    1364                         if (importer != Py_None) {
    1365                                 PyObject *loader;
    1366                                 loader = PyObject_CallMethod(importer,
    1367                                                              "find_module",
    1368                                                              "s", fullname);
    1369                                 Py_XDECREF(copy);
    1370                                 if (loader == NULL)
    1371                                         return NULL;  /* error */
    1372                                 if (loader != Py_None) {
    1373                                         /* a loader was found */
    1374                                         *p_loader = loader;
    1375                                         return &importhookdescr;
    1376                                 }
    1377                                 Py_DECREF(loader);
    1378                                 continue;
    1379                         }
    1380                 }
    1381                 /* no hook was found, use builtin import */
    1382 
    1383                 if (len > 0 && buf[len-1] != SEP
    1384 #ifdef ALTSEP
    1385                     && buf[len-1] != ALTSEP
    1386 #endif
    1387                     )
    1388                         buf[len++] = SEP;
    1389                 strcpy(buf+len, name);
    1390                 len += namelen;
    1391 
    1392                 /* Check for package import (buf holds a directory name,
    1393                    and there's an __init__ module in that directory */
    1394 #ifdef HAVE_STAT
    1395                 if (stat(buf, &statbuf) == 0 &&         /* it exists */
    1396                     S_ISDIR(statbuf.st_mode) &&         /* it's a directory */
    1397                     case_ok(buf, len, namelen, name)) { /* case matches */
    1398                         if (find_init_module(buf)) { /* and has __init__.py */
    1399                                 Py_XDECREF(copy);
    1400                                 return &fd_package;
    1401                         }
    1402                         else {
    1403                                 char warnstr[MAXPATHLEN+80];
    1404                                 sprintf(warnstr, "Not importing directory "
    1405                                         "'%.*s': missing __init__.py",
    1406                                         MAXPATHLEN, buf);
    1407                                 if (PyErr_Warn(PyExc_ImportWarning,
    1408                                                warnstr)) {
    1409                                         Py_XDECREF(copy);
    1410                                         return NULL;
    1411                                 }
    1412                         }
    1413                 }
    1414 #else
    1415                 /* XXX How are you going to test for directories? */
    1416 #ifdef RISCOS
    1417                 if (isdir(buf) &&
    1418                     case_ok(buf, len, namelen, name)) {
    1419                         if (find_init_module(buf)) {
    1420                                 Py_XDECREF(copy);
    1421                                 return &fd_package;
    1422                         }
    1423                         else {
    1424                                 char warnstr[MAXPATHLEN+80];
    1425                                 sprintf(warnstr, "Not importing directory "
    1426                                         "'%.*s': missing __init__.py",
    1427                                         MAXPATHLEN, buf);
    1428                                 if (PyErr_Warn(PyExc_ImportWarning,
    1429                                                warnstr)) {
    1430                                         Py_XDECREF(copy);
    1431                                         return NULL;
    1432                                 }
    1433                 }
    1434 #endif
    1435 #endif
    1436 #if defined(PYOS_OS2)
    1437                 /* take a snapshot of the module spec for restoration
    1438                  * after the 8 character DLL hackery
    1439                  */
    1440                 saved_buf = strdup(buf);
    1441                 saved_len = len;
    1442                 saved_namelen = namelen;
    1443 #endif /* PYOS_OS2 */
    1444                 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
    1445 #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
    1446                         /* OS/2 limits DLLs to 8 character names (w/o
    1447                            extension)
    1448                          * so if the name is longer than that and its a
    1449                          * dynamically loaded module we're going to try,
    1450                          * truncate the name before trying
    1451                          */
    1452                         if (strlen(subname) > 8) {
    1453                                 /* is this an attempt to load a C extension? */
    1454                                 const struct filedescr *scan;
    1455                                 scan = _PyImport_DynLoadFiletab;
    1456                                 while (scan->suffix != NULL) {
    1457                                         if (!strcmp(scan->suffix, fdp->suffix))
    1458                                                 break;
    1459                                         else
    1460                                                 scan++;
    1461                                 }
    1462                                 if (scan->suffix != NULL) {
    1463                                         /* yes, so truncate the name */
    1464                                         namelen = 8;
    1465                                         len -= strlen(subname) - namelen;
    1466                                         buf[len] = '\0';
    1467                                 }
    1468                         }
    1469 #endif /* PYOS_OS2 */
    1470                         strcpy(buf+len, fdp->suffix);
    1471                         if (Py_VerboseFlag > 1)
    1472                                 PySys_WriteStderr("# trying %s\n", buf);
    1473                         filemode = fdp->mode;
    1474                         if (filemode[0] == 'U')
    1475                                 filemode = "r" PY_STDIOTEXTMODE;
    1476                         fp = fopen(buf, filemode);
    1477                         if (fp != NULL) {
    1478                                 if (case_ok(buf, len, namelen, name))
    1479                                         break;
    1480                                 else {   /* continue search */
    1481                                         fclose(fp);
    1482                                         fp = NULL;
    1483                                 }
    1484                         }
    1485 #if defined(PYOS_OS2)
    1486                         /* restore the saved snapshot */
    1487                         strcpy(buf, saved_buf);
    1488                         len = saved_len;
    1489                         namelen = saved_namelen;
    1490 #endif
    1491                 }
    1492 #if defined(PYOS_OS2)
    1493                 /* don't need/want the module name snapshot anymore */
    1494                 if (saved_buf)
    1495                 {
    1496                         free(saved_buf);
    1497                         saved_buf = NULL;
    1498                 }
    1499 #endif
    1500                 Py_XDECREF(copy);
    1501                 if (fp != NULL)
    1502                         break;
    1503         }
    1504         if (fp == NULL) {
    1505                 PyErr_Format(PyExc_ImportError,
    1506                              "No module named %.200s", name);
    1507                 return NULL;
    1508         }
    1509         *p_fp = fp;
    1510         return fdp;
     1580        Py_XDECREF(copy);
     1581        if (fp != NULL)
     1582            break;
     1583    }
     1584    if (fp == NULL) {
     1585        PyErr_Format(PyExc_ImportError,
     1586                     "No module named %.200s", name);
     1587        goto error_exit;
     1588    }
     1589    *p_fp = fp;
     1590    PyMem_FREE(name);
     1591    return fdp;
     1592
     1593error_exit:
     1594    PyMem_FREE(name);
     1595    return NULL;
    15111596}
    15121597
     
    15161601struct filedescr *
    15171602_PyImport_FindModule(const char *name, PyObject *path, char *buf,
    1518             size_t buflen, FILE **p_fp, PyObject **p_loader)
    1519 {
    1520         return find_module((char *) name, (char *) name, path,
    1521                            buf, buflen, p_fp, p_loader);
     1603            size_t buflen, FILE **p_fp, PyObject **p_loader)
     1604{
     1605    return find_module((char *) name, (char *) name, path,
     1606                       buf, buflen, p_fp, p_loader);
    15221607}
    15231608
    15241609PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
    15251610{
    1526         return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
     1611    return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
    15271612}
    15281613
     
    15861671/* MS_WINDOWS */
    15871672#if defined(MS_WINDOWS)
    1588         WIN32_FIND_DATA data;
    1589         HANDLE h;
    1590 
    1591         if (Py_GETENV("PYTHONCASEOK") != NULL)
    1592                 return 1;
    1593 
    1594         h = FindFirstFile(buf, &data);
    1595         if (h == INVALID_HANDLE_VALUE) {
    1596                 PyErr_Format(PyExc_NameError,
    1597                   "Can't find file for module %.100s\n(filename %.300s)",
    1598                   name, buf);
    1599                 return 0;
    1600         }
    1601         FindClose(h);
    1602         return strncmp(data.cFileName, name, namelen) == 0;
     1673    WIN32_FIND_DATA data;
     1674    HANDLE h;
     1675
     1676    if (Py_GETENV("PYTHONCASEOK") != NULL)
     1677        return 1;
     1678
     1679    h = FindFirstFile(buf, &data);
     1680    if (h == INVALID_HANDLE_VALUE) {
     1681        PyErr_Format(PyExc_NameError,
     1682          "Can't find file for module %.100s\n(filename %.300s)",
     1683          name, buf);
     1684        return 0;
     1685    }
     1686    FindClose(h);
     1687    return strncmp(data.cFileName, name, namelen) == 0;
    16031688
    16041689/* DJGPP */
    16051690#elif defined(DJGPP)
    1606         struct ffblk ffblk;
    1607         int done;
    1608 
    1609         if (Py_GETENV("PYTHONCASEOK") != NULL)
    1610                 return 1;
    1611 
    1612         done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
    1613         if (done) {
    1614                 PyErr_Format(PyExc_NameError,
    1615                   "Can't find file for module %.100s\n(filename %.300s)",
    1616                   name, buf);
    1617                 return 0;
    1618         }
    1619         return strncmp(ffblk.ff_name, name, namelen) == 0;
     1691    struct ffblk ffblk;
     1692    int done;
     1693
     1694    if (Py_GETENV("PYTHONCASEOK") != NULL)
     1695        return 1;
     1696
     1697    done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
     1698    if (done) {
     1699        PyErr_Format(PyExc_NameError,
     1700          "Can't find file for module %.100s\n(filename %.300s)",
     1701          name, buf);
     1702        return 0;
     1703    }
     1704    return strncmp(ffblk.ff_name, name, namelen) == 0;
    16201705
    16211706/* new-fangled macintosh (macosx) or Cygwin */
    16221707#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
    1623         DIR *dirp;
    1624         struct dirent *dp;
    1625         char dirname[MAXPATHLEN + 1];
    1626         const int dirlen = len - namelen - 1; /* don't want trailing SEP */
    1627 
    1628         if (Py_GETENV("PYTHONCASEOK") != NULL)
    1629                 return 1;
    1630 
    1631         /* Copy the dir component into dirname; substitute "." if empty */
    1632         if (dirlen <= 0) {
    1633                 dirname[0] = '.';
    1634                 dirname[1] = '\0';
    1635         }
    1636         else {
    1637                 assert(dirlen <= MAXPATHLEN);
    1638                 memcpy(dirname, buf, dirlen);
    1639                 dirname[dirlen] = '\0';
    1640         }
    1641         /* Open the directory and search the entries for an exact match. */
    1642         dirp = opendir(dirname);
    1643         if (dirp) {
    1644                 char *nameWithExt = buf + len - namelen;
    1645                 while ((dp = readdir(dirp)) != NULL) {
    1646                         const int thislen =
     1708    DIR *dirp;
     1709    struct dirent *dp;
     1710    char dirname[MAXPATHLEN + 1];
     1711    const int dirlen = len - namelen - 1; /* don't want trailing SEP */
     1712
     1713    if (Py_GETENV("PYTHONCASEOK") != NULL)
     1714        return 1;
     1715
     1716    /* Copy the dir component into dirname; substitute "." if empty */
     1717    if (dirlen <= 0) {
     1718        dirname[0] = '.';
     1719        dirname[1] = '\0';
     1720    }
     1721    else {
     1722        assert(dirlen <= MAXPATHLEN);
     1723        memcpy(dirname, buf, dirlen);
     1724        dirname[dirlen] = '\0';
     1725    }
     1726    /* Open the directory and search the entries for an exact match. */
     1727    dirp = opendir(dirname);
     1728    if (dirp) {
     1729        char *nameWithExt = buf + len - namelen;
     1730        while ((dp = readdir(dirp)) != NULL) {
     1731            const int thislen =
    16471732#ifdef _DIRENT_HAVE_D_NAMELEN
    1648                                                 dp->d_namlen;
     1733                                    dp->d_namlen;
    16491734#else
    1650                                                 strlen(dp->d_name);
     1735                                    strlen(dp->d_name);
    16511736#endif
    1652                         if (thislen >= namelen &&
    1653                             strcmp(dp->d_name, nameWithExt) == 0) {
    1654                                 (void)closedir(dirp);
    1655                                 return 1; /* Found */
    1656                         }
    1657                 }
    1658                 (void)closedir(dirp);
    1659         }
    1660         return 0 ; /* Not found */
     1737            if (thislen >= namelen &&
     1738                strcmp(dp->d_name, nameWithExt) == 0) {
     1739                (void)closedir(dirp);
     1740                return 1; /* Found */
     1741            }
     1742        }
     1743        (void)closedir(dirp);
     1744    }
     1745    return 0 ; /* Not found */
    16611746
    16621747/* RISC OS */
    16631748#elif defined(RISCOS)
    1664         char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
    1665         char buf2[MAXPATHLEN+2];
    1666         char *nameWithExt = buf+len-namelen;
    1667         int canonlen;
    1668         os_error *e;
    1669 
    1670         if (Py_GETENV("PYTHONCASEOK") != NULL)
    1671                 return 1;
    1672 
    1673         /* workaround:
    1674            append wildcard, otherwise case of filename wouldn't be touched */
    1675         strcpy(buf2, buf);
    1676         strcat(buf2, "*");
    1677 
    1678         e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
    1679         canonlen = MAXPATHLEN+1-canonlen;
    1680         if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
    1681                 return 0;
    1682         if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
    1683                 return 1; /* match */
    1684 
    1685         return 0;
     1749    char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
     1750    char buf2[MAXPATHLEN+2];
     1751    char *nameWithExt = buf+len-namelen;
     1752    int canonlen;
     1753    os_error *e;
     1754
     1755    if (Py_GETENV("PYTHONCASEOK") != NULL)
     1756        return 1;
     1757
     1758    /* workaround:
     1759       append wildcard, otherwise case of filename wouldn't be touched */
     1760    strcpy(buf2, buf);
     1761    strcat(buf2, "*");
     1762
     1763    e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
     1764    canonlen = MAXPATHLEN+1-canonlen;
     1765    if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
     1766        return 0;
     1767    if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
     1768        return 1; /* match */
     1769
     1770    return 0;
    16861771
    16871772/* OS/2 */
     
    17101795
    17111796#elif defined(PYOS_OS2)
    1712         HDIR hdir = 1;
    1713         ULONG srchcnt = 1;
    1714         FILEFINDBUF3 ffbuf;
    1715         APIRET rc;
    1716 
    1717         if (Py_GETENV("PYTHONCASEOK") != NULL)
    1718                 return 1;
    1719 
    1720         rc = DosFindFirst(buf,
    1721                           &hdir,
    1722                           FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
    1723                           &ffbuf, sizeof(ffbuf),
    1724                           &srchcnt,
    1725                           FIL_STANDARD);
    1726         if (rc != NO_ERROR)
    1727                 return 0;
    1728         return strncmp(ffbuf.achName, name, namelen) == 0;
     1797    HDIR hdir = 1;
     1798    ULONG srchcnt = 1;
     1799    FILEFINDBUF3 ffbuf;
     1800    APIRET rc;
     1801
     1802    if (Py_GETENV("PYTHONCASEOK") != NULL)
     1803        return 1;
     1804
     1805    rc = DosFindFirst(buf,
     1806                      &hdir,
     1807                      FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
     1808                      &ffbuf, sizeof(ffbuf),
     1809                      &srchcnt,
     1810                      FIL_STANDARD);
     1811    if (rc != NO_ERROR)
     1812        return 0;
     1813    return strncmp(ffbuf.achName, name, namelen) == 0;
    17291814
    17301815/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
    17311816#else
    1732         return 1;
     1817    return 1;
    17331818
    17341819#endif
     
    17411826find_init_module(char *buf)
    17421827{
    1743         const size_t save_len = strlen(buf);
    1744         size_t i = save_len;
    1745         char *pname;  /* pointer to start of __init__ */
    1746         struct stat statbuf;
    1747 
    1748 /*      For calling case_ok(buf, len, namelen, name):
    1749  *      /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
    1750  *      ^                      ^                   ^    ^
    1751  *      |--------------------- buf ---------------------|
    1752  *      |------------------- len ------------------|
    1753  *                             |------ name -------|
    1754  *                             |----- namelen -----|
     1828    const size_t save_len = strlen(buf);
     1829    size_t i = save_len;
     1830    char *pname;  /* pointer to start of __init__ */
     1831    struct stat statbuf;
     1832
     1833/*      For calling case_ok(buf, len, namelen, name):
     1834 *      /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
     1835 *      ^                      ^                   ^    ^
     1836 *      |--------------------- buf ---------------------|
     1837 *      |------------------- len ------------------|
     1838 *                             |------ name -------|
     1839 *                             |----- namelen -----|
    17551840 */
    1756         if (save_len + 13 >= MAXPATHLEN)
    1757                 return 0;
    1758         buf[i++] = SEP;
    1759         pname = buf + i;
    1760         strcpy(pname, "__init__.py");
    1761         if (stat(buf, &statbuf) == 0) {
    1762                 if (case_ok(buf,
    1763                             save_len + 9,       /* len("/__init__") */
    1764                             8,                  /* len("__init__") */
    1765                             pname)) {
    1766                         buf[save_len] = '\0';
    1767                         return 1;
    1768                 }
    1769         }
    1770         i += strlen(pname);
    1771         strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
    1772         if (stat(buf, &statbuf) == 0) {
    1773                 if (case_ok(buf,
    1774                             save_len + 9,       /* len("/__init__") */
    1775                             8,                  /* len("__init__") */
    1776                             pname)) {
    1777                         buf[save_len] = '\0';
    1778                         return 1;
    1779                 }
    1780         }
    1781         buf[save_len] = '\0';
    1782         return 0;
     1841    if (save_len + 13 >= MAXPATHLEN)
     1842        return 0;
     1843    buf[i++] = SEP;
     1844    pname = buf + i;
     1845    strcpy(pname, "__init__.py");
     1846    if (stat(buf, &statbuf) == 0) {
     1847        if (case_ok(buf,
     1848                    save_len + 9,               /* len("/__init__") */
     1849                8,                              /* len("__init__") */
     1850                pname)) {
     1851            buf[save_len] = '\0';
     1852            return 1;
     1853        }
     1854    }
     1855    i += strlen(pname);
     1856    strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
     1857    if (stat(buf, &statbuf) == 0) {
     1858        if (case_ok(buf,
     1859                    save_len + 9,               /* len("/__init__") */
     1860                8,                              /* len("__init__") */
     1861                pname)) {
     1862            buf[save_len] = '\0';
     1863            return 1;
     1864        }
     1865    }
     1866    buf[save_len] = '\0';
     1867    return 0;
    17831868}
    17841869
     
    17881873static int
    17891874find_init_module(buf)
    1790         char *buf;
    1791 {
    1792         int save_len = strlen(buf);
    1793         int i = save_len;
    1794 
    1795         if (save_len + 13 >= MAXPATHLEN)
    1796                 return 0;
    1797         buf[i++] = SEP;
    1798         strcpy(buf+i, "__init__/py");
    1799         if (isfile(buf)) {
    1800                 buf[save_len] = '\0';
    1801                 return 1;
    1802         }
    1803 
    1804         if (Py_OptimizeFlag)
    1805                 strcpy(buf+i, "o");
    1806         else
    1807                 strcpy(buf+i, "c");
    1808         if (isfile(buf)) {
    1809                 buf[save_len] = '\0';
    1810                 return 1;
    1811         }
    1812         buf[save_len] = '\0';
    1813         return 0;
     1875    char *buf;
     1876{
     1877    int save_len = strlen(buf);
     1878    int i = save_len;
     1879
     1880    if (save_len + 13 >= MAXPATHLEN)
     1881        return 0;
     1882    buf[i++] = SEP;
     1883    strcpy(buf+i, "__init__/py");
     1884    if (isfile(buf)) {
     1885        buf[save_len] = '\0';
     1886        return 1;
     1887    }
     1888
     1889    if (Py_OptimizeFlag)
     1890        strcpy(buf+i, "o");
     1891    else
     1892        strcpy(buf+i, "c");
     1893    if (isfile(buf)) {
     1894        buf[save_len] = '\0';
     1895        return 1;
     1896    }
     1897    buf[save_len] = '\0';
     1898    return 0;
    18141899}
    18151900#endif /*RISCOS*/
     
    18241909
    18251910static PyObject *
    1826 load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
    1827 {
    1828         PyObject *modules;
    1829         PyObject *m;
    1830         int err;
    1831 
    1832         /* First check that there's an open file (if we need one)  */
    1833         switch (type) {
    1834         case PY_SOURCE:
    1835         case PY_COMPILED:
    1836                 if (fp == NULL) {
    1837                         PyErr_Format(PyExc_ValueError,
    1838                            "file object required for import (type code %d)",
    1839                                      type);
    1840                         return NULL;
    1841                 }
    1842         }
    1843 
    1844         switch (type) {
    1845 
    1846         case PY_SOURCE:
    1847                 m = load_source_module(name, buf, fp);
    1848                 break;
    1849 
    1850         case PY_COMPILED:
    1851                 m = load_compiled_module(name, buf, fp);
    1852                 break;
     1911load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
     1912{
     1913    PyObject *modules;
     1914    PyObject *m;
     1915    int err;
     1916
     1917    /* First check that there's an open file (if we need one)  */
     1918    switch (type) {
     1919    case PY_SOURCE:
     1920    case PY_COMPILED:
     1921        if (fp == NULL) {
     1922            PyErr_Format(PyExc_ValueError,
     1923               "file object required for import (type code %d)",
     1924                         type);
     1925            return NULL;
     1926        }
     1927    }
     1928
     1929    switch (type) {
     1930
     1931    case PY_SOURCE:
     1932        m = load_source_module(name, pathname, fp);
     1933        break;
     1934
     1935    case PY_COMPILED:
     1936        m = load_compiled_module(name, pathname, fp);
     1937        break;
    18531938
    18541939#ifdef HAVE_DYNAMIC_LOADING
    1855         case C_EXTENSION:
    1856                 m = _PyImport_LoadDynamicModule(name, buf, fp);
    1857                 break;
     1940    case C_EXTENSION:
     1941        m = _PyImport_LoadDynamicModule(name, pathname, fp);
     1942        break;
    18581943#endif
    18591944
    1860         case PKG_DIRECTORY:
    1861                 m = load_package(name, buf);
    1862                 break;
    1863 
    1864         case C_BUILTIN:
    1865         case PY_FROZEN:
    1866                 if (buf != NULL && buf[0] != '\0')
    1867                         name = buf;
    1868                 if (type == C_BUILTIN)
    1869                         err = init_builtin(name);
    1870                 else
    1871                         err = PyImport_ImportFrozenModule(name);
    1872                 if (err < 0)
    1873                         return NULL;
    1874                 if (err == 0) {
    1875                         PyErr_Format(PyExc_ImportError,
    1876                                      "Purported %s module %.200s not found",
    1877                                      type == C_BUILTIN ?
    1878                                                 "builtin" : "frozen",
    1879                                      name);
    1880                         return NULL;
    1881                 }
    1882                 modules = PyImport_GetModuleDict();
    1883                 m = PyDict_GetItemString(modules, name);
    1884                 if (m == NULL) {
    1885                         PyErr_Format(
    1886                                 PyExc_ImportError,
    1887                                 "%s module %.200s not properly initialized",
    1888                                 type == C_BUILTIN ?
    1889                                         "builtin" : "frozen",
    1890                                 name);
    1891                         return NULL;
    1892                 }
    1893                 Py_INCREF(m);
    1894                 break;
    1895 
    1896         case IMP_HOOK: {
    1897                 if (loader == NULL) {
    1898                         PyErr_SetString(PyExc_ImportError,
    1899                                         "import hook without loader");
    1900                         return NULL;
    1901                 }
    1902                 m = PyObject_CallMethod(loader, "load_module", "s", name);
    1903                 break;
    1904         }
    1905 
    1906         default:
    1907                 PyErr_Format(PyExc_ImportError,
    1908                              "Don't know how to import %.200s (type code %d)",
    1909                               name, type);
    1910                 m = NULL;
    1911 
    1912         }
    1913 
    1914         return m;
     1945    case PKG_DIRECTORY:
     1946        m = load_package(name, pathname);
     1947        break;
     1948
     1949    case C_BUILTIN:
     1950    case PY_FROZEN:
     1951        if (pathname != NULL && pathname[0] != '\0')
     1952            name = pathname;
     1953        if (type == C_BUILTIN)
     1954            err = init_builtin(name);
     1955        else
     1956            err = PyImport_ImportFrozenModule(name);
     1957        if (err < 0)
     1958            return NULL;
     1959        if (err == 0) {
     1960            PyErr_Format(PyExc_ImportError,
     1961                         "Purported %s module %.200s not found",
     1962                         type == C_BUILTIN ?
     1963                                    "builtin" : "frozen",
     1964                         name);
     1965            return NULL;
     1966        }
     1967        modules = PyImport_GetModuleDict();
     1968        m = PyDict_GetItemString(modules, name);
     1969        if (m == NULL) {
     1970            PyErr_Format(
     1971                PyExc_ImportError,
     1972                "%s module %.200s not properly initialized",
     1973                type == C_BUILTIN ?
     1974                    "builtin" : "frozen",
     1975                name);
     1976            return NULL;
     1977        }
     1978        Py_INCREF(m);
     1979        break;
     1980
     1981    case IMP_HOOK: {
     1982        if (loader == NULL) {
     1983            PyErr_SetString(PyExc_ImportError,
     1984                            "import hook without loader");
     1985            return NULL;
     1986        }
     1987        m = PyObject_CallMethod(loader, "load_module", "s", name);
     1988        break;
     1989    }
     1990
     1991    default:
     1992        PyErr_Format(PyExc_ImportError,
     1993                     "Don't know how to import %.200s (type code %d)",
     1994                      name, type);
     1995        m = NULL;
     1996
     1997    }
     1998
     1999    return m;
    19152000}
    19162001
     
    19232008init_builtin(char *name)
    19242009{
    1925         struct _inittab *p;
    1926 
    1927         if (_PyImport_FindExtension(name, name) != NULL)
    1928                 return 1;
    1929 
    1930         for (p = PyImport_Inittab; p->name != NULL; p++) {
    1931                 if (strcmp(name, p->name) == 0) {
    1932                         if (p->initfunc == NULL) {
    1933                                 PyErr_Format(PyExc_ImportError,
    1934                                     "Cannot re-init internal module %.200s",
    1935                                     name);
    1936                                 return -1;
    1937                         }
    1938                         if (Py_VerboseFlag)
    1939                                 PySys_WriteStderr("import %s # builtin\n", name);
    1940                         (*p->initfunc)();
    1941                         if (PyErr_Occurred())
    1942                                 return -1;
    1943                         if (_PyImport_FixupExtension(name, name) == NULL)
    1944                                 return -1;
    1945                         return 1;
    1946                 }
    1947         }
    1948         return 0;
     2010    struct _inittab *p;
     2011
     2012    if (_PyImport_FindExtension(name, name) != NULL)
     2013        return 1;
     2014
     2015    for (p = PyImport_Inittab; p->name != NULL; p++) {
     2016        if (strcmp(name, p->name) == 0) {
     2017            if (p->initfunc == NULL) {
     2018                PyErr_Format(PyExc_ImportError,
     2019                    "Cannot re-init internal module %.200s",
     2020                    name);
     2021                return -1;
     2022            }
     2023            if (Py_VerboseFlag)
     2024                PySys_WriteStderr("import %s # builtin\n", name);
     2025            (*p->initfunc)();
     2026            if (PyErr_Occurred())
     2027                return -1;
     2028            if (_PyImport_FixupExtension(name, name) == NULL)
     2029                return -1;
     2030            return 1;
     2031        }
     2032    }
     2033    return 0;
    19492034}
    19502035
     
    19552040find_frozen(char *name)
    19562041{
    1957         struct _frozen *p;
    1958 
    1959         for (p = PyImport_FrozenModules; ; p++) {
    1960                 if (p->name == NULL)
    1961                         return NULL;
    1962                 if (strcmp(p->name, name) == 0)
    1963                         break;
    1964         }
    1965         return p;
     2042    struct _frozen *p;
     2043
     2044    for (p = PyImport_FrozenModules; ; p++) {
     2045        if (p->name == NULL)
     2046            return NULL;
     2047        if (strcmp(p->name, name) == 0)
     2048            break;
     2049    }
     2050    return p;
    19662051}
    19672052
     
    19692054get_frozen_object(char *name)
    19702055{
    1971         struct _frozen *p = find_frozen(name);
    1972         int size;
    1973 
    1974         if (p == NULL) {
    1975                 PyErr_Format(PyExc_ImportError,
    1976                              "No such frozen object named %.200s",
    1977                              name);
    1978                 return NULL;
    1979         }
    1980         if (p->code == NULL) {
    1981                 PyErr_Format(PyExc_ImportError,
    1982                              "Excluded frozen object named %.200s",
    1983                              name);
    1984                 return NULL;
    1985         }
    1986         size = p->size;
    1987         if (size < 0)
    1988                 size = -size;
    1989         return PyMarshal_ReadObjectFromString((char *)p->code, size);
     2056    struct _frozen *p = find_frozen(name);
     2057    int size;
     2058
     2059    if (p == NULL) {
     2060        PyErr_Format(PyExc_ImportError,
     2061                     "No such frozen object named %.200s",
     2062                     name);
     2063        return NULL;
     2064    }
     2065    if (p->code == NULL) {
     2066        PyErr_Format(PyExc_ImportError,
     2067                     "Excluded frozen object named %.200s",
     2068                     name);
     2069        return NULL;
     2070    }
     2071    size = p->size;
     2072    if (size < 0)
     2073        size = -size;
     2074    return PyMarshal_ReadObjectFromString((char *)p->code, size);
    19902075}
    19912076
     
    19982083PyImport_ImportFrozenModule(char *name)
    19992084{
    2000         struct _frozen *p = find_frozen(name);
    2001         PyObject *co;
    2002         PyObject *m;
    2003         int ispackage;
    2004         int size;
    2005 
    2006         if (p == NULL)
    2007                 return 0;
    2008         if (p->code == NULL) {
    2009                 PyErr_Format(PyExc_ImportError,
    2010                              "Excluded frozen object named %.200s",
    2011                              name);
    2012                 return -1;
    2013         }
    2014         size = p->size;
    2015         ispackage = (size < 0);
    2016         if (ispackage)
    2017                 size = -size;
    2018         if (Py_VerboseFlag)
    2019                 PySys_WriteStderr("import %s # frozen%s\n",
    2020                         name, ispackage ? " package" : "");
    2021         co = PyMarshal_ReadObjectFromString((char *)p->code, size);
    2022         if (co == NULL)
    2023                 return -1;
    2024         if (!PyCode_Check(co)) {
    2025                 PyErr_Format(PyExc_TypeError,
    2026                              "frozen object %.200s is not a code object",
    2027                              name);
    2028                 goto err_return;
    2029         }
    2030         if (ispackage) {
    2031                 /* Set __path__ to the package name */
    2032                 PyObject *d, *s;
    2033                 int err;
    2034                 m = PyImport_AddModule(name);
    2035                 if (m == NULL)
    2036                         goto err_return;
    2037                 d = PyModule_GetDict(m);
    2038                 s = PyString_InternFromString(name);
    2039                 if (s == NULL)
    2040                         goto err_return;
    2041                 err = PyDict_SetItemString(d, "__path__", s);
    2042                 Py_DECREF(s);
    2043                 if (err != 0)
    2044                         goto err_return;
    2045         }
    2046         m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
    2047         if (m == NULL)
    2048                 goto err_return;
    2049         Py_DECREF(co);
    2050         Py_DECREF(m);
    2051         return 1;
     2085    struct _frozen *p = find_frozen(name);
     2086    PyObject *co;
     2087    PyObject *m;
     2088    int ispackage;
     2089    int size;
     2090
     2091    if (p == NULL)
     2092        return 0;
     2093    if (p->code == NULL) {
     2094        PyErr_Format(PyExc_ImportError,
     2095                     "Excluded frozen object named %.200s",
     2096                     name);
     2097        return -1;
     2098    }
     2099    size = p->size;
     2100    ispackage = (size < 0);
     2101    if (ispackage)
     2102        size = -size;
     2103    if (Py_VerboseFlag)
     2104        PySys_WriteStderr("import %s # frozen%s\n",
     2105            name, ispackage ? " package" : "");
     2106    co = PyMarshal_ReadObjectFromString((char *)p->code, size);
     2107    if (co == NULL)
     2108        return -1;
     2109    if (!PyCode_Check(co)) {
     2110        PyErr_Format(PyExc_TypeError,
     2111                     "frozen object %.200s is not a code object",
     2112                     name);
     2113        goto err_return;
     2114    }
     2115    if (ispackage) {
     2116        /* Set __path__ to the package name */
     2117        PyObject *d, *s;
     2118        int err;
     2119        m = PyImport_AddModule(name);
     2120        if (m == NULL)
     2121            goto err_return;
     2122        d = PyModule_GetDict(m);
     2123        s = PyString_InternFromString(name);
     2124        if (s == NULL)
     2125            goto err_return;
     2126        err = PyDict_SetItemString(d, "__path__", s);
     2127        Py_DECREF(s);
     2128        if (err != 0)
     2129            goto err_return;
     2130    }
     2131    m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
     2132    if (m == NULL)
     2133        goto err_return;
     2134    Py_DECREF(co);
     2135    Py_DECREF(m);
     2136    return 1;
    20522137err_return:
    2053         Py_DECREF(co);
    2054         return -1;
     2138    Py_DECREF(co);
     2139    return -1;
    20552140}
    20562141
     
    20622147PyImport_ImportModule(const char *name)
    20632148{
    2064         PyObject *pname;
    2065         PyObject *result;
    2066 
    2067         pname = PyString_FromString(name);
    2068         if (pname == NULL)
    2069                 return NULL;
    2070         result = PyImport_Import(pname);
    2071         Py_DECREF(pname);
    2072         return result;
     2149    PyObject *pname;
     2150    PyObject *result;
     2151
     2152    pname = PyString_FromString(name);
     2153    if (pname == NULL)
     2154        return NULL;
     2155    result = PyImport_Import(pname);
     2156    Py_DECREF(pname);
     2157    return result;
    20732158}
    20742159
     
    20852170PyImport_ImportModuleNoBlock(const char *name)
    20862171{
    2087         PyObject *result;
    2088         PyObject *modules;
    2089         long me;
    2090 
    2091         /* Try to get the module from sys.modules[name] */
    2092         modules = PyImport_GetModuleDict();
    2093         if (modules == NULL)
    2094                 return NULL;
    2095 
    2096         result = PyDict_GetItemString(modules, name);
    2097         if (result != NULL) {
    2098                 Py_INCREF(result);
    2099                 return result;
    2100         }
    2101         else {
    2102                 PyErr_Clear();
    2103         }
     2172    PyObject *result;
     2173    PyObject *modules;
    21042174#ifdef WITH_THREAD
    2105         /* check the import lock
    2106          * me might be -1 but I ignore the error here, the lock function
    2107          * takes care of the problem */
    2108         me = PyThread_get_thread_ident();
    2109         if (import_lock_thread == -1 || import_lock_thread == me) {
    2110                 /* no thread or me is holding the lock */
    2111                 return PyImport_ImportModule(name);
    2112         }
    2113         else {
    2114                 PyErr_Format(PyExc_ImportError,
    2115                              "Failed to import %.200s because the import lock"
    2116                              "is held by another thread.",
    2117                              name);
    2118                 return NULL;
    2119         }
     2175    long me;
     2176#endif
     2177
     2178    /* Try to get the module from sys.modules[name] */
     2179    modules = PyImport_GetModuleDict();
     2180    if (modules == NULL)
     2181        return NULL;
     2182
     2183    result = PyDict_GetItemString(modules, name);
     2184    if (result != NULL) {
     2185        Py_INCREF(result);
     2186        return result;
     2187    }
     2188    else {
     2189        PyErr_Clear();
     2190    }
     2191#ifdef WITH_THREAD
     2192    /* check the import lock
     2193     * me might be -1 but I ignore the error here, the lock function
     2194     * takes care of the problem */
     2195    me = PyThread_get_thread_ident();
     2196    if (import_lock_thread == -1 || import_lock_thread == me) {
     2197        /* no thread or me is holding the lock */
     2198        return PyImport_ImportModule(name);
     2199    }
     2200    else {
     2201        PyErr_Format(PyExc_ImportError,
     2202                     "Failed to import %.200s because the import lock"
     2203                     "is held by another thread.",
     2204                     name);
     2205        return NULL;
     2206    }
    21202207#else
    2121         return PyImport_ImportModule(name);
     2208    return PyImport_ImportModule(name);
    21222209#endif
    21232210}
     
    21252212/* Forward declarations for helper routines */
    21262213static PyObject *get_parent(PyObject *globals, char *buf,
    2127                             Py_ssize_t *p_buflen, int level);
     2214                            Py_ssize_t *p_buflen, int level);
    21282215static PyObject *load_next(PyObject *mod, PyObject *altmod,
    2129                            char **p_name, char *buf, Py_ssize_t *p_buflen);
     2216                           char **p_name, char *buf, Py_ssize_t *p_buflen);
    21302217static int mark_miss(char *name);
    21312218static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
    2132                            char *buf, Py_ssize_t buflen, int recursive);
     2219                           char *buf, Py_ssize_t buflen, int recursive);
    21332220static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
    21342221
     
    21372224static PyObject *
    21382225import_module_level(char *name, PyObject *globals, PyObject *locals,
    2139                     PyObject *fromlist, int level)
    2140 {
    2141         char buf[MAXPATHLEN+1];
    2142         Py_ssize_t buflen = 0;
    2143         PyObject *parent, *head, *next, *tail;
    2144 
    2145         if (strchr(name, '/') != NULL
     2226                    PyObject *fromlist, int level)
     2227{
     2228    char *buf;
     2229    Py_ssize_t buflen = 0;
     2230    PyObject *parent, *head, *next, *tail;
     2231
     2232    if (strchr(name, '/') != NULL
    21462233#ifdef MS_WINDOWS
    2147             || strchr(name, '\\') != NULL
     2234        || strchr(name, '\\') != NULL
    21482235#endif
    2149                 ) {
    2150                 PyErr_SetString(PyExc_ImportError,
    2151                                 "Import by filename is not supported.");
    2152                 return NULL;
    2153         }
    2154 
    2155         parent = get_parent(globals, buf, &buflen, level);
    2156         if (parent == NULL)
    2157                 return NULL;
    2158 
    2159         head = load_next(parent, Py_None, &name, buf, &buflen);
    2160         if (head == NULL)
    2161                 return NULL;
    2162 
    2163         tail = head;
    2164         Py_INCREF(tail);
    2165         while (name) {
    2166                 next = load_next(tail, tail, &name, buf, &buflen);
    2167                 Py_DECREF(tail);
    2168                 if (next == NULL) {
    2169                         Py_DECREF(head);
    2170                         return NULL;
    2171                 }
    2172                 tail = next;
    2173         }
    2174         if (tail == Py_None) {
    2175                 /* If tail is Py_None, both get_parent and load_next found
    2176                    an empty module name: someone called __import__("") or
    2177                    doctored faulty bytecode */
    2178                 Py_DECREF(tail);
    2179                 Py_DECREF(head);
    2180                 PyErr_SetString(PyExc_ValueError,
    2181                                 "Empty module name");
    2182                 return NULL;
    2183         }
    2184 
    2185         if (fromlist != NULL) {
    2186                 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
    2187                         fromlist = NULL;
    2188         }
    2189 
    2190         if (fromlist == NULL) {
    2191                 Py_DECREF(tail);
    2192                 return head;
    2193         }
    2194 
    2195         Py_DECREF(head);
    2196         if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
    2197                 Py_DECREF(tail);
    2198                 return NULL;
    2199         }
    2200 
    2201         return tail;
     2236        ) {
     2237        PyErr_SetString(PyExc_ImportError,
     2238                        "Import by filename is not supported.");
     2239        return NULL;
     2240    }
     2241
     2242    buf = PyMem_MALLOC(MAXPATHLEN+1);
     2243    if (buf == NULL) {
     2244        return PyErr_NoMemory();
     2245    }
     2246    parent = get_parent(globals, buf, &buflen, level);
     2247    if (parent == NULL)
     2248        goto error_exit;
     2249
     2250    head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
     2251                        &buflen);
     2252    if (head == NULL)
     2253        goto error_exit;
     2254
     2255    tail = head;
     2256    Py_INCREF(tail);
     2257    while (name) {
     2258        next = load_next(tail, tail, &name, buf, &buflen);
     2259        Py_DECREF(tail);
     2260        if (next == NULL) {
     2261            Py_DECREF(head);
     2262            goto error_exit;
     2263        }
     2264        tail = next;
     2265    }
     2266    if (tail == Py_None) {
     2267        /* If tail is Py_None, both get_parent and load_next found
     2268           an empty module name: someone called __import__("") or
     2269           doctored faulty bytecode */
     2270        Py_DECREF(tail);
     2271        Py_DECREF(head);
     2272        PyErr_SetString(PyExc_ValueError,
     2273                        "Empty module name");
     2274        goto error_exit;
     2275    }
     2276
     2277    if (fromlist != NULL) {
     2278        int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist);
     2279        if (b < 0) {
     2280            Py_DECREF(tail);
     2281            Py_DECREF(head);
     2282            goto error_exit;
     2283        }
     2284        if (!b)
     2285            fromlist = NULL;
     2286    }
     2287
     2288    if (fromlist == NULL) {
     2289        Py_DECREF(tail);
     2290        PyMem_FREE(buf);
     2291        return head;
     2292    }
     2293
     2294    Py_DECREF(head);
     2295    if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
     2296        Py_DECREF(tail);
     2297        goto error_exit;
     2298    }
     2299
     2300    PyMem_FREE(buf);
     2301    return tail;
     2302
     2303error_exit:
     2304    PyMem_FREE(buf);
     2305    return NULL;
    22022306}
    22032307
    22042308PyObject *
    22052309PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
    2206                         PyObject *fromlist, int level)
    2207 {
    2208         PyObject *result;
    2209         _PyImport_AcquireLock();
    2210         result = import_module_level(name, globals, locals, fromlist, level);
    2211         if (_PyImport_ReleaseLock() < 0) {
    2212                 Py_XDECREF(result);
    2213                 PyErr_SetString(PyExc_RuntimeError,
    2214                                 "not holding the import lock");
    2215                 return NULL;
    2216         }
    2217         return result;
     2310                        PyObject *fromlist, int level)
     2311{
     2312    PyObject *result;
     2313    _PyImport_AcquireLock();
     2314    result = import_module_level(name, globals, locals, fromlist, level);
     2315    if (_PyImport_ReleaseLock() < 0) {
     2316        Py_XDECREF(result);
     2317        PyErr_SetString(PyExc_RuntimeError,
     2318                        "not holding the import lock");
     2319        return NULL;
     2320    }
     2321    return result;
    22182322}
    22192323
     
    22322336get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
    22332337{
    2234         static PyObject *namestr = NULL;
    2235         static PyObject *pathstr = NULL;
    2236         static PyObject *pkgstr = NULL;
    2237         PyObject *pkgname, *modname, *modpath, *modules, *parent;
    2238         int orig_level = level;
    2239 
    2240         if (globals == NULL || !PyDict_Check(globals) || !level)
    2241                 return Py_None;
    2242 
    2243         if (namestr == NULL) {
    2244                 namestr = PyString_InternFromString("__name__");
    2245                 if (namestr == NULL)
    2246                         return NULL;
    2247         }
    2248         if (pathstr == NULL) {
    2249                 pathstr = PyString_InternFromString("__path__");
    2250                 if (pathstr == NULL)
    2251                         return NULL;
    2252         }
    2253         if (pkgstr == NULL) {
    2254                 pkgstr = PyString_InternFromString("__package__");
    2255                 if (pkgstr == NULL)
    2256                         return NULL;
    2257         }
    2258 
    2259         *buf = '\0';
    2260         *p_buflen = 0;
    2261         pkgname = PyDict_GetItem(globals, pkgstr);
    2262 
    2263         if ((pkgname != NULL) && (pkgname != Py_None)) {
    2264                 /* __package__ is set, so use it */
    2265                 Py_ssize_t len;
    2266                 if (!PyString_Check(pkgname)) {
    2267                         PyErr_SetString(PyExc_ValueError,
    2268                                         "__package__ set to non-string");
    2269                         return NULL;
    2270                 }
    2271                 len = PyString_GET_SIZE(pkgname);
    2272                 if (len == 0) {
    2273                         if (level > 0) {
    2274                                 PyErr_SetString(PyExc_ValueError,
    2275                                         "Attempted relative import in non-package");
    2276                                 return NULL;
    2277                         }
    2278                         return Py_None;
    2279                 }
    2280                 if (len > MAXPATHLEN) {
    2281                         PyErr_SetString(PyExc_ValueError,
    2282                                         "Package name too long");
    2283                         return NULL;
    2284                 }
    2285                 strcpy(buf, PyString_AS_STRING(pkgname));
    2286         } else {
    2287                 /* __package__ not set, so figure it out and set it */
    2288                 modname = PyDict_GetItem(globals, namestr);
    2289                 if (modname == NULL || !PyString_Check(modname))
    2290                         return Py_None;
    2291        
    2292                 modpath = PyDict_GetItem(globals, pathstr);
    2293                 if (modpath != NULL) {
    2294                         /* __path__ is set, so modname is already the package name */
    2295                         Py_ssize_t len = PyString_GET_SIZE(modname);
    2296                         int error;
    2297                         if (len > MAXPATHLEN) {
    2298                                 PyErr_SetString(PyExc_ValueError,
    2299                                                 "Module name too long");
    2300                                 return NULL;
    2301                         }
    2302                         strcpy(buf, PyString_AS_STRING(modname));
    2303                         error = PyDict_SetItem(globals, pkgstr, modname);
    2304                         if (error) {
    2305                                 PyErr_SetString(PyExc_ValueError,
    2306                                                 "Could not set __package__");
    2307                                 return NULL;
    2308                         }
    2309                 } else {
    2310                         /* Normal module, so work out the package name if any */
    2311                         char *start = PyString_AS_STRING(modname);
    2312                         char *lastdot = strrchr(start, '.');
    2313                         size_t len;
    2314                         int error;
    2315                         if (lastdot == NULL && level > 0) {
    2316                                 PyErr_SetString(PyExc_ValueError,
    2317                                         "Attempted relative import in non-package");
    2318                                 return NULL;
    2319                         }
    2320                         if (lastdot == NULL) {
    2321                                 error = PyDict_SetItem(globals, pkgstr, Py_None);
    2322                                 if (error) {
    2323                                         PyErr_SetString(PyExc_ValueError,
    2324                                                 "Could not set __package__");
    2325                                         return NULL;
    2326                                 }
    2327                                 return Py_None;
    2328                         }
    2329                         len = lastdot - start;
    2330                         if (len >= MAXPATHLEN) {
    2331                                 PyErr_SetString(PyExc_ValueError,
    2332                                                 "Module name too long");
    2333                                 return NULL;
    2334                         }
    2335                         strncpy(buf, start, len);
    2336                         buf[len] = '\0';
    2337                         pkgname = PyString_FromString(buf);
    2338                         if (pkgname == NULL) {
    2339                                 return NULL;
    2340                         }
    2341                         error = PyDict_SetItem(globals, pkgstr, pkgname);
    2342                         Py_DECREF(pkgname);
    2343                         if (error) {
    2344                                 PyErr_SetString(PyExc_ValueError,
    2345                                                 "Could not set __package__");
    2346                                 return NULL;
    2347                         }
    2348                 }
    2349         }
    2350         while (--level > 0) {
    2351                 char *dot = strrchr(buf, '.');
    2352                 if (dot == NULL) {
    2353                         PyErr_SetString(PyExc_ValueError,
    2354                                 "Attempted relative import beyond "
    2355                                 "toplevel package");
    2356                         return NULL;
    2357                 }
    2358                 *dot = '\0';
    2359         }
    2360         *p_buflen = strlen(buf);
    2361 
    2362         modules = PyImport_GetModuleDict();
    2363         parent = PyDict_GetItemString(modules, buf);
    2364         if (parent == NULL) {
    2365                 if (orig_level < 1) {
    2366                         PyObject *err_msg = PyString_FromFormat(
    2367                                 "Parent module '%.200s' not found "
    2368                                 "while handling absolute import", buf);
    2369                         if (err_msg == NULL) {
    2370                                 return NULL;
    2371                         }
    2372                         if (!PyErr_WarnEx(PyExc_RuntimeWarning,
    2373                                         PyString_AsString(err_msg), 1)) {
    2374                                 *buf = '\0';
    2375                                 *p_buflen = 0;
    2376                                 parent = Py_None;
    2377                         }
    2378                         Py_DECREF(err_msg);
    2379                 } else {
    2380                         PyErr_Format(PyExc_SystemError,
    2381                                 "Parent module '%.200s' not loaded, "
    2382                                 "cannot perform relative import", buf);
    2383                 }
    2384         }
    2385         return parent;
    2386         /* We expect, but can't guarantee, if parent != None, that:
    2387            - parent.__name__ == buf
    2388            - parent.__dict__ is globals
    2389            If this is violated...  Who cares? */
     2338    static PyObject *namestr = NULL;
     2339    static PyObject *pathstr = NULL;
     2340    static PyObject *pkgstr = NULL;
     2341    PyObject *pkgname, *modname, *modpath, *modules, *parent;
     2342    int orig_level = level;
     2343
     2344    if (globals == NULL || !PyDict_Check(globals) || !level)
     2345        return Py_None;
     2346
     2347    if (namestr == NULL) {
     2348        namestr = PyString_InternFromString("__name__");
     2349        if (namestr == NULL)
     2350            return NULL;
     2351    }
     2352    if (pathstr == NULL) {
     2353        pathstr = PyString_InternFromString("__path__");
     2354        if (pathstr == NULL)
     2355            return NULL;
     2356    }
     2357    if (pkgstr == NULL) {
     2358        pkgstr = PyString_InternFromString("__package__");
     2359        if (pkgstr == NULL)
     2360            return NULL;
     2361    }
     2362
     2363    *buf = '\0';
     2364    *p_buflen = 0;
     2365    pkgname = PyDict_GetItem(globals, pkgstr);
     2366
     2367    if ((pkgname != NULL) && (pkgname != Py_None)) {
     2368        /* __package__ is set, so use it */
     2369        Py_ssize_t len;
     2370        if (!PyString_Check(pkgname)) {
     2371            PyErr_SetString(PyExc_ValueError,
     2372                            "__package__ set to non-string");
     2373            return NULL;
     2374        }
     2375        len = PyString_GET_SIZE(pkgname);
     2376        if (len == 0) {
     2377            if (level > 0) {
     2378                PyErr_SetString(PyExc_ValueError,
     2379                    "Attempted relative import in non-package");
     2380                return NULL;
     2381            }
     2382            return Py_None;
     2383        }
     2384        if (len > MAXPATHLEN) {
     2385            PyErr_SetString(PyExc_ValueError,
     2386                            "Package name too long");
     2387            return NULL;
     2388        }
     2389        strcpy(buf, PyString_AS_STRING(pkgname));
     2390    } else {
     2391        /* __package__ not set, so figure it out and set it */
     2392        modname = PyDict_GetItem(globals, namestr);
     2393        if (modname == NULL || !PyString_Check(modname))
     2394            return Py_None;
     2395
     2396        modpath = PyDict_GetItem(globals, pathstr);
     2397        if (modpath != NULL) {
     2398            /* __path__ is set, so modname is already the package name */
     2399            Py_ssize_t len = PyString_GET_SIZE(modname);
     2400            int error;
     2401            if (len > MAXPATHLEN) {
     2402                PyErr_SetString(PyExc_ValueError,
     2403                                "Module name too long");
     2404                return NULL;
     2405            }
     2406            strcpy(buf, PyString_AS_STRING(modname));
     2407            error = PyDict_SetItem(globals, pkgstr, modname);
     2408            if (error) {
     2409                PyErr_SetString(PyExc_ValueError,
     2410                                "Could not set __package__");
     2411                return NULL;
     2412            }
     2413        } else {
     2414            /* Normal module, so work out the package name if any */
     2415            char *start = PyString_AS_STRING(modname);
     2416            char *lastdot = strrchr(start, '.');
     2417            size_t len;
     2418            int error;
     2419            if (lastdot == NULL && level > 0) {
     2420                PyErr_SetString(PyExc_ValueError,
     2421                    "Attempted relative import in non-package");
     2422                return NULL;
     2423            }
     2424            if (lastdot == NULL) {
     2425                error = PyDict_SetItem(globals, pkgstr, Py_None);
     2426                if (error) {
     2427                    PyErr_SetString(PyExc_ValueError,
     2428                        "Could not set __package__");
     2429                    return NULL;
     2430                }
     2431                return Py_None;
     2432            }
     2433            len = lastdot - start;
     2434            if (len >= MAXPATHLEN) {
     2435                PyErr_SetString(PyExc_ValueError,
     2436                                "Module name too long");
     2437                return NULL;
     2438            }
     2439            strncpy(buf, start, len);
     2440            buf[len] = '\0';
     2441            pkgname = PyString_FromString(buf);
     2442            if (pkgname == NULL) {
     2443                return NULL;
     2444            }
     2445            error = PyDict_SetItem(globals, pkgstr, pkgname);
     2446            Py_DECREF(pkgname);
     2447            if (error) {
     2448                PyErr_SetString(PyExc_ValueError,
     2449                                "Could not set __package__");
     2450                return NULL;
     2451            }
     2452        }
     2453    }
     2454    while (--level > 0) {
     2455        char *dot = strrchr(buf, '.');
     2456        if (dot == NULL) {
     2457            PyErr_SetString(PyExc_ValueError,
     2458                "Attempted relative import beyond "
     2459                "toplevel package");
     2460            return NULL;
     2461        }
     2462        *dot = '\0';
     2463    }
     2464    *p_buflen = strlen(buf);
     2465
     2466    modules = PyImport_GetModuleDict();
     2467    parent = PyDict_GetItemString(modules, buf);
     2468    if (parent == NULL) {
     2469        if (orig_level < 1) {
     2470            PyObject *err_msg = PyString_FromFormat(
     2471                "Parent module '%.200s' not found "
     2472                "while handling absolute import", buf);
     2473            if (err_msg == NULL) {
     2474                return NULL;
     2475            }
     2476            if (!PyErr_WarnEx(PyExc_RuntimeWarning,
     2477                            PyString_AsString(err_msg), 1)) {
     2478                *buf = '\0';
     2479                *p_buflen = 0;
     2480                parent = Py_None;
     2481            }
     2482            Py_DECREF(err_msg);
     2483        } else {
     2484            PyErr_Format(PyExc_SystemError,
     2485                "Parent module '%.200s' not loaded, "
     2486                "cannot perform relative import", buf);
     2487        }
     2488    }
     2489    return parent;
     2490    /* We expect, but can't guarantee, if parent != None, that:
     2491       - parent.__name__ == buf
     2492       - parent.__dict__ is globals
     2493       If this is violated...  Who cares? */
    23902494}
    23912495
     
    23932497static PyObject *
    23942498load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
    2395           Py_ssize_t *p_buflen)
    2396 {
    2397         char *name = *p_name;
    2398         char *dot = strchr(name, '.');
    2399         size_t len;
    2400         char *p;
    2401         PyObject *result;
    2402 
    2403         if (strlen(name) == 0) {
    2404                 /* completely empty module name should only happen in
    2405                    'from . import' (or '__import__("")')*/
    2406                 Py_INCREF(mod);
    2407                 *p_name = NULL;
    2408                 return mod;
    2409         }
    2410 
    2411         if (dot == NULL) {
    2412                 *p_name = NULL;
    2413                 len = strlen(name);
    2414         }
    2415         else {
    2416                 *p_name = dot+1;
    2417                 len = dot-name;
    2418         }
    2419         if (len == 0) {
    2420                 PyErr_SetString(PyExc_ValueError,
    2421                                 "Empty module name");
    2422                 return NULL;
    2423         }
    2424 
    2425         p = buf + *p_buflen;
    2426         if (p != buf)
    2427                 *p++ = '.';
    2428         if (p+len-buf >= MAXPATHLEN) {
    2429                 PyErr_SetString(PyExc_ValueError,
    2430                                 "Module name too long");
    2431                 return NULL;
    2432         }
    2433         strncpy(p, name, len);
    2434         p[len] = '\0';
    2435         *p_buflen = p+len-buf;
    2436 
    2437         result = import_submodule(mod, p, buf);
    2438         if (result == Py_None && altmod != mod) {
    2439                 Py_DECREF(result);
    2440                 /* Here, altmod must be None and mod must not be None */
    2441                 result = import_submodule(altmod, p, p);
    2442                 if (result != NULL && result != Py_None) {
    2443                         if (mark_miss(buf) != 0) {
    2444                                 Py_DECREF(result);
    2445                                 return NULL;
    2446                         }
    2447                         strncpy(buf, name, len);
    2448                         buf[len] = '\0';
    2449                         *p_buflen = len;
    2450                 }
    2451         }
    2452         if (result == NULL)
    2453                 return NULL;
    2454 
    2455         if (result == Py_None) {
    2456                 Py_DECREF(result);
    2457                 PyErr_Format(PyExc_ImportError,
    2458                              "No module named %.200s", name);
    2459                 return NULL;
    2460         }
    2461 
    2462         return result;
     2499          Py_ssize_t *p_buflen)
     2500{
     2501    char *name = *p_name;
     2502    char *dot = strchr(name, '.');
     2503    size_t len;
     2504    char *p;
     2505    PyObject *result;
     2506
     2507    if (strlen(name) == 0) {
     2508        /* completely empty module name should only happen in
     2509           'from . import' (or '__import__("")')*/
     2510        Py_INCREF(mod);
     2511        *p_name = NULL;
     2512        return mod;
     2513    }
     2514
     2515    if (dot == NULL) {
     2516        *p_name = NULL;
     2517        len = strlen(name);
     2518    }
     2519    else {
     2520        *p_name = dot+1;
     2521        len = dot-name;
     2522    }
     2523    if (len == 0) {
     2524        PyErr_SetString(PyExc_ValueError,
     2525                        "Empty module name");
     2526        return NULL;
     2527    }
     2528
     2529    p = buf + *p_buflen;
     2530    if (p != buf)
     2531        *p++ = '.';
     2532    if (p+len-buf >= MAXPATHLEN) {
     2533        PyErr_SetString(PyExc_ValueError,
     2534                        "Module name too long");
     2535        return NULL;
     2536    }
     2537    strncpy(p, name, len);
     2538    p[len] = '\0';
     2539    *p_buflen = p+len-buf;
     2540
     2541    result = import_submodule(mod, p, buf);
     2542    if (result == Py_None && altmod != mod) {
     2543        Py_DECREF(result);
     2544        /* Here, altmod must be None and mod must not be None */
     2545        result = import_submodule(altmod, p, p);
     2546        if (result != NULL && result != Py_None) {
     2547            if (mark_miss(buf) != 0) {
     2548                Py_DECREF(result);
     2549                return NULL;
     2550            }
     2551            strncpy(buf, name, len);
     2552            buf[len] = '\0';
     2553            *p_buflen = len;
     2554        }
     2555    }
     2556    if (result == NULL)
     2557        return NULL;
     2558
     2559    if (result == Py_None) {
     2560        Py_DECREF(result);
     2561        PyErr_Format(PyExc_ImportError,
     2562                     "No module named %.200s", name);
     2563        return NULL;
     2564    }
     2565
     2566    return result;
    24632567}
    24642568
     
    24662570mark_miss(char *name)
    24672571{
    2468         PyObject *modules = PyImport_GetModuleDict();
    2469         return PyDict_SetItemString(modules, name, Py_None);
     2572    PyObject *modules = PyImport_GetModuleDict();
     2573    return PyDict_SetItemString(modules, name, Py_None);
    24702574}
    24712575
    24722576static int
    24732577ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
    2474                 int recursive)
    2475 {
    2476         int i;
    2477 
    2478         if (!PyObject_HasAttrString(mod, "__path__"))
    2479                 return 1;
    2480 
    2481         for (i = 0; ; i++) {
    2482                 PyObject *item = PySequence_GetItem(fromlist, i);
    2483                 int hasit;
    2484                 if (item == NULL) {
    2485                         if (PyErr_ExceptionMatches(PyExc_IndexError)) {
    2486                                 PyErr_Clear();
    2487                                 return 1;
    2488                         }
    2489                         return 0;
    2490                 }
    2491                 if (!PyString_Check(item)) {
    2492                         PyErr_SetString(PyExc_TypeError,
    2493                                         "Item in ``from list'' not a string");
    2494                         Py_DECREF(item);
    2495                         return 0;
    2496                 }
    2497                 if (PyString_AS_STRING(item)[0] == '*') {
    2498                         PyObject *all;
    2499                         Py_DECREF(item);
    2500                         /* See if the package defines __all__ */
    2501                         if (recursive)
    2502                                 continue; /* Avoid endless recursion */
    2503                         all = PyObject_GetAttrString(mod, "__all__");
    2504                         if (all == NULL)
    2505                                 PyErr_Clear();
    2506                         else {
    2507                                 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
    2508                                 Py_DECREF(all);
    2509                                 if (!ret)
    2510                                         return 0;
    2511                         }
    2512                         continue;
    2513                 }
    2514                 hasit = PyObject_HasAttr(mod, item);
    2515                 if (!hasit) {
    2516                         char *subname = PyString_AS_STRING(item);
    2517                         PyObject *submod;
    2518                         char *p;
    2519                         if (buflen + strlen(subname) >= MAXPATHLEN) {
    2520                                 PyErr_SetString(PyExc_ValueError,
    2521                                                 "Module name too long");
    2522                                 Py_DECREF(item);
    2523                                 return 0;
    2524                         }
    2525                         p = buf + buflen;
    2526                         *p++ = '.';
    2527                         strcpy(p, subname);
    2528                         submod = import_submodule(mod, subname, buf);
    2529                         Py_XDECREF(submod);
    2530                         if (submod == NULL) {
    2531                                 Py_DECREF(item);
    2532                                 return 0;
    2533                         }
    2534                 }
    2535                 Py_DECREF(item);
    2536         }
    2537 
    2538         /* NOTREACHED */
     2578                int recursive)
     2579{
     2580    int i;
     2581
     2582    if (!PyObject_HasAttrString(mod, "__path__"))
     2583        return 1;
     2584
     2585    for (i = 0; ; i++) {
     2586        PyObject *item = PySequence_GetItem(fromlist, i);
     2587        int hasit;
     2588        if (item == NULL) {
     2589            if (PyErr_ExceptionMatches(PyExc_IndexError)) {
     2590                PyErr_Clear();
     2591                return 1;
     2592            }
     2593            return 0;
     2594        }
     2595        if (!PyString_Check(item)) {
     2596            PyErr_SetString(PyExc_TypeError,
     2597                            "Item in ``from list'' not a string");
     2598            Py_DECREF(item);
     2599            return 0;
     2600        }
     2601        if (PyString_AS_STRING(item)[0] == '*') {
     2602            PyObject *all;
     2603            Py_DECREF(item);
     2604            /* See if the package defines __all__ */
     2605            if (recursive)
     2606                continue; /* Avoid endless recursion */
     2607            all = PyObject_GetAttrString(mod, "__all__");
     2608            if (all == NULL)
     2609                PyErr_Clear();
     2610            else {
     2611                int ret = ensure_fromlist(mod, all, buf, buflen, 1);
     2612                Py_DECREF(all);
     2613                if (!ret)
     2614                    return 0;
     2615            }
     2616            continue;
     2617        }
     2618        hasit = PyObject_HasAttr(mod, item);
     2619        if (!hasit) {
     2620            char *subname = PyString_AS_STRING(item);
     2621            PyObject *submod;
     2622            char *p;
     2623            if (buflen + strlen(subname) >= MAXPATHLEN) {
     2624                PyErr_SetString(PyExc_ValueError,
     2625                                "Module name too long");
     2626                Py_DECREF(item);
     2627                return 0;
     2628            }
     2629            p = buf + buflen;
     2630            *p++ = '.';
     2631            strcpy(p, subname);
     2632            submod = import_submodule(mod, subname, buf);
     2633            Py_XDECREF(submod);
     2634            if (submod == NULL) {
     2635                Py_DECREF(item);
     2636                return 0;
     2637            }
     2638        }
     2639        Py_DECREF(item);
     2640    }
     2641
     2642    /* NOTREACHED */
    25392643}
    25402644
    25412645static int
    25422646add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
    2543               PyObject *modules)
    2544 {
    2545         if (mod == Py_None)
    2546                 return 1;
    2547         /* Irrespective of the success of this load, make a
    2548            reference to it in the parent package module.  A copy gets
    2549            saved in the modules dictionary under the full name, so get a
    2550            reference from there, if need be.  (The exception is when the
    2551            load failed with a SyntaxError -- then there's no trace in
    2552            sys.modules.  In that case, of course, do nothing extra.) */
    2553         if (submod == NULL) {
    2554                 submod = PyDict_GetItemString(modules, fullname);
    2555                 if (submod == NULL)
    2556                         return 1;
    2557         }
    2558         if (PyModule_Check(mod)) {
    2559                 /* We can't use setattr here since it can give a
    2560                 * spurious warning if the submodule name shadows a
    2561                 * builtin name */
    2562                 PyObject *dict = PyModule_GetDict(mod);
    2563                 if (!dict)
    2564                         return 0;
    2565                 if (PyDict_SetItemString(dict, subname, submod) < 0)
    2566                         return 0;
    2567         }
    2568         else {
    2569                 if (PyObject_SetAttrString(mod, subname, submod) < 0)
    2570                         return 0;
    2571         }
    2572         return 1;
     2647              PyObject *modules)
     2648{
     2649    if (mod == Py_None)
     2650        return 1;
     2651    /* Irrespective of the success of this load, make a
     2652       reference to it in the parent package module.  A copy gets
     2653       saved in the modules dictionary under the full name, so get a
     2654       reference from there, if need be.  (The exception is when the
     2655       load failed with a SyntaxError -- then there's no trace in
     2656       sys.modules.  In that case, of course, do nothing extra.) */
     2657    if (submod == NULL) {
     2658        submod = PyDict_GetItemString(modules, fullname);
     2659        if (submod == NULL)
     2660            return 1;
     2661    }
     2662    if (PyModule_Check(mod)) {
     2663        /* We can't use setattr here since it can give a
     2664        * spurious warning if the submodule name shadows a
     2665        * builtin name */
     2666        PyObject *dict = PyModule_GetDict(mod);
     2667        if (!dict)
     2668            return 0;
     2669        if (PyDict_SetItemString(dict, subname, submod) < 0)
     2670            return 0;
     2671    }
     2672    else {
     2673        if (PyObject_SetAttrString(mod, subname, submod) < 0)
     2674            return 0;
     2675    }
     2676    return 1;
    25732677}
    25742678
     
    25762680import_submodule(PyObject *mod, char *subname, char *fullname)
    25772681{
    2578         PyObject *modules = PyImport_GetModuleDict();
    2579         PyObject *m = NULL;
    2580 
    2581         /* Require:
    2582            if mod == None: subname == fullname
    2583            else: mod.__name__ + "." + subname == fullname
    2584         */
    2585 
    2586         if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
    2587                 Py_INCREF(m);
    2588         }
    2589         else {
    2590                 PyObject *path, *loader = NULL;
    2591                 char buf[MAXPATHLEN+1];
    2592                 struct filedescr *fdp;
    2593                 FILE *fp = NULL;
    2594 
    2595                 if (mod == Py_None)
    2596                         path = NULL;
    2597                 else {
    2598                         path = PyObject_GetAttrString(mod, "__path__");
    2599                         if (path == NULL) {
    2600                                 PyErr_Clear();
    2601                                 Py_INCREF(Py_None);
    2602                                 return Py_None;
    2603                         }
    2604                 }
    2605 
    2606                 buf[0] = '\0';
    2607                 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
    2608                                   &fp, &loader);
    2609                 Py_XDECREF(path);
    2610                 if (fdp == NULL) {
    2611                         if (!PyErr_ExceptionMatches(PyExc_ImportError))
    2612                                 return NULL;
    2613                         PyErr_Clear();
    2614                         Py_INCREF(Py_None);
    2615                         return Py_None;
    2616                 }
    2617                 m = load_module(fullname, fp, buf, fdp->type, loader);
    2618                 Py_XDECREF(loader);
    2619                 if (fp)
    2620                         fclose(fp);
    2621                 if (!add_submodule(mod, m, fullname, subname, modules)) {
    2622                         Py_XDECREF(m);
    2623                         m = NULL;
    2624                 }
    2625         }
    2626 
    2627         return m;
     2682    PyObject *modules = PyImport_GetModuleDict();
     2683    PyObject *m = NULL;
     2684
     2685    /* Require:
     2686       if mod == None: subname == fullname
     2687       else: mod.__name__ + "." + subname == fullname
     2688    */
     2689
     2690    if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
     2691        Py_INCREF(m);
     2692    }
     2693    else {
     2694        PyObject *path, *loader = NULL;
     2695        char *buf;
     2696        struct filedescr *fdp;
     2697        FILE *fp = NULL;
     2698
     2699        if (mod == Py_None)
     2700            path = NULL;
     2701        else {
     2702            path = PyObject_GetAttrString(mod, "__path__");
     2703            if (path == NULL) {
     2704                PyErr_Clear();
     2705                Py_INCREF(Py_None);
     2706                return Py_None;
     2707            }
     2708        }
     2709
     2710        buf = PyMem_MALLOC(MAXPATHLEN+1);
     2711        if (buf == NULL) {
     2712            return PyErr_NoMemory();
     2713        }
     2714        buf[0] = '\0';
     2715        fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
     2716                          &fp, &loader);
     2717        Py_XDECREF(path);
     2718        if (fdp == NULL) {
     2719            PyMem_FREE(buf);
     2720            if (!PyErr_ExceptionMatches(PyExc_ImportError))
     2721                return NULL;
     2722            PyErr_Clear();
     2723            Py_INCREF(Py_None);
     2724            return Py_None;
     2725        }
     2726        m = load_module(fullname, fp, buf, fdp->type, loader);
     2727        Py_XDECREF(loader);
     2728        if (fp)
     2729            fclose(fp);
     2730        if (!add_submodule(mod, m, fullname, subname, modules)) {
     2731            Py_XDECREF(m);
     2732            m = NULL;
     2733        }
     2734        PyMem_FREE(buf);
     2735    }
     2736
     2737    return m;
    26282738}
    26292739
     
    26352745PyImport_ReloadModule(PyObject *m)
    26362746{
    2637         PyInterpreterState *interp = PyThreadState_Get()->interp;
    2638         PyObject *modules_reloading = interp->modules_reloading;
    2639         PyObject *modules = PyImport_GetModuleDict();
    2640         PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
    2641         char *name, *subname;
    2642         char buf[MAXPATHLEN+1];
    2643         struct filedescr *fdp;
    2644         FILE *fp = NULL;
    2645         PyObject *newm;
    2646    
    2647         if (modules_reloading == NULL) {
    2648                 Py_FatalError("PyImport_ReloadModule: "
    2649                               "no modules_reloading dictionary!");
    2650                 return NULL;
    2651         }
    2652 
    2653         if (m == NULL || !PyModule_Check(m)) {
    2654                 PyErr_SetString(PyExc_TypeError,
    2655                                 "reload() argument must be module");
    2656                 return NULL;
    2657         }
    2658         name = PyModule_GetName(m);
    2659         if (name == NULL)
    2660                 return NULL;
    2661         if (m != PyDict_GetItemString(modules, name)) {
    2662                 PyErr_Format(PyExc_ImportError,
    2663                              "reload(): module %.200s not in sys.modules",
    2664                              name);
    2665                 return NULL;
    2666         }
    2667         existing_m = PyDict_GetItemString(modules_reloading, name);
    2668         if (existing_m != NULL) {
    2669                 /* Due to a recursive reload, this module is already
    2670                    being reloaded. */
    2671                 Py_INCREF(existing_m);
    2672                 return existing_m;
    2673         }
    2674         if (PyDict_SetItemString(modules_reloading, name, m) < 0)
    2675                 return NULL;
    2676 
    2677         subname = strrchr(name, '.');
    2678         if (subname == NULL)
    2679                 subname = name;
    2680         else {
    2681                 PyObject *parentname, *parent;
    2682                 parentname = PyString_FromStringAndSize(name, (subname-name));
    2683                 if (parentname == NULL) {
    2684                         imp_modules_reloading_clear();
    2685                         return NULL;
    2686                 }
    2687                 parent = PyDict_GetItem(modules, parentname);
    2688                 if (parent == NULL) {
    2689                         PyErr_Format(PyExc_ImportError,
    2690                             "reload(): parent %.200s not in sys.modules",
    2691                             PyString_AS_STRING(parentname));
    2692                         Py_DECREF(parentname);
    2693                         imp_modules_reloading_clear();
    2694                         return NULL;
    2695                 }
    2696                 Py_DECREF(parentname);
    2697                 subname++;
    2698                 path = PyObject_GetAttrString(parent, "__path__");
    2699                 if (path == NULL)
    2700                         PyErr_Clear();
    2701         }
    2702         buf[0] = '\0';
    2703         fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
    2704         Py_XDECREF(path);
    2705 
    2706         if (fdp == NULL) {
    2707                 Py_XDECREF(loader);
    2708                 imp_modules_reloading_clear();
    2709                 return NULL;
    2710         }
    2711 
    2712         newm = load_module(name, fp, buf, fdp->type, loader);
    2713         Py_XDECREF(loader);
    2714 
    2715         if (fp)
    2716                 fclose(fp);
    2717         if (newm == NULL) {
    2718                 /* load_module probably removed name from modules because of
    2719                  * the error.  Put back the original module object.  We're
    2720                  * going to return NULL in this case regardless of whether
    2721                  * replacing name succeeds, so the return value is ignored.
    2722                  */
    2723                 PyDict_SetItemString(modules, name, m);
    2724         }
    2725         imp_modules_reloading_clear();
    2726         return newm;
     2747    PyInterpreterState *interp = PyThreadState_Get()->interp;
     2748    PyObject *modules_reloading = interp->modules_reloading;
     2749    PyObject *modules = PyImport_GetModuleDict();
     2750    PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
     2751    char *name, *subname;
     2752    char *buf;
     2753    struct filedescr *fdp;
     2754    FILE *fp = NULL;
     2755    PyObject *newm;
     2756
     2757    if (modules_reloading == NULL) {
     2758        Py_FatalError("PyImport_ReloadModule: "
     2759                      "no modules_reloading dictionary!");
     2760        return NULL;
     2761    }
     2762
     2763    if (m == NULL || !PyModule_Check(m)) {
     2764        PyErr_SetString(PyExc_TypeError,
     2765                        "reload() argument must be module");
     2766        return NULL;
     2767    }
     2768    name = PyModule_GetName(m);
     2769    if (name == NULL)
     2770        return NULL;
     2771    if (m != PyDict_GetItemString(modules, name)) {
     2772        PyErr_Format(PyExc_ImportError,
     2773                     "reload(): module %.200s not in sys.modules",
     2774                     name);
     2775        return NULL;
     2776    }
     2777    existing_m = PyDict_GetItemString(modules_reloading, name);
     2778    if (existing_m != NULL) {
     2779        /* Due to a recursive reload, this module is already
     2780           being reloaded. */
     2781        Py_INCREF(existing_m);
     2782        return existing_m;
     2783    }
     2784    if (PyDict_SetItemString(modules_reloading, name, m) < 0)
     2785        return NULL;
     2786
     2787    subname = strrchr(name, '.');
     2788    if (subname == NULL)
     2789        subname = name;
     2790    else {
     2791        PyObject *parentname, *parent;
     2792        parentname = PyString_FromStringAndSize(name, (subname-name));
     2793        if (parentname == NULL) {
     2794            imp_modules_reloading_clear();
     2795            return NULL;
     2796        }
     2797        parent = PyDict_GetItem(modules, parentname);
     2798        if (parent == NULL) {
     2799            PyErr_Format(PyExc_ImportError,
     2800                "reload(): parent %.200s not in sys.modules",
     2801                PyString_AS_STRING(parentname));
     2802            Py_DECREF(parentname);
     2803            imp_modules_reloading_clear();
     2804            return NULL;
     2805        }
     2806        Py_DECREF(parentname);
     2807        subname++;
     2808        path = PyObject_GetAttrString(parent, "__path__");
     2809        if (path == NULL)
     2810            PyErr_Clear();
     2811    }
     2812    buf = PyMem_MALLOC(MAXPATHLEN+1);
     2813    if (buf == NULL) {
     2814        Py_XDECREF(path);
     2815        return PyErr_NoMemory();
     2816    }
     2817    buf[0] = '\0';
     2818    fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
     2819    Py_XDECREF(path);
     2820
     2821    if (fdp == NULL) {
     2822        Py_XDECREF(loader);
     2823        imp_modules_reloading_clear();
     2824        PyMem_FREE(buf);
     2825        return NULL;
     2826    }
     2827
     2828    newm = load_module(name, fp, buf, fdp->type, loader);
     2829    Py_XDECREF(loader);
     2830
     2831    if (fp)
     2832        fclose(fp);
     2833    if (newm == NULL) {
     2834        /* load_module probably removed name from modules because of
     2835         * the error.  Put back the original module object.  We're
     2836         * going to return NULL in this case regardless of whether
     2837         * replacing name succeeds, so the return value is ignored.
     2838         */
     2839        PyDict_SetItemString(modules, name, m);
     2840    }
     2841    imp_modules_reloading_clear();
     2842    PyMem_FREE(buf);
     2843    return newm;
    27272844}
    27282845
     
    27402857PyImport_Import(PyObject *module_name)
    27412858{
    2742         static PyObject *silly_list = NULL;
    2743         static PyObject *builtins_str = NULL;
    2744         static PyObject *import_str = NULL;
    2745         PyObject *globals = NULL;
    2746         PyObject *import = NULL;
    2747         PyObject *builtins = NULL;
    2748         PyObject *r = NULL;
    2749 
    2750         /* Initialize constant string objects */
    2751         if (silly_list == NULL) {
    2752                 import_str = PyString_InternFromString("__import__");
    2753                 if (import_str == NULL)
    2754                         return NULL;
    2755                 builtins_str = PyString_InternFromString("__builtins__");
    2756                 if (builtins_str == NULL)
    2757                         return NULL;
    2758                 silly_list = Py_BuildValue("[s]", "__doc__");
    2759                 if (silly_list == NULL)
    2760                         return NULL;
    2761         }
    2762 
    2763         /* Get the builtins from current globals */
    2764         globals = PyEval_GetGlobals();
    2765         if (globals != NULL) {
    2766                 Py_INCREF(globals);
    2767                 builtins = PyObject_GetItem(globals, builtins_str);
    2768                 if (builtins == NULL)
    2769                         goto err;
    2770         }
    2771         else {
    2772                 /* No globals -- use standard builtins, and fake globals */
    2773                 PyErr_Clear();
    2774 
    2775                 builtins = PyImport_ImportModuleLevel("__builtin__",
    2776                                                       NULL, NULL, NULL, 0);
    2777                 if (builtins == NULL)
    2778                         return NULL;
    2779                 globals = Py_BuildValue("{OO}", builtins_str, builtins);
    2780                 if (globals == NULL)
    2781                         goto err;
    2782         }
    2783 
    2784         /* Get the __import__ function from the builtins */
    2785         if (PyDict_Check(builtins)) {
    2786                 import = PyObject_GetItem(builtins, import_str);
    2787                 if (import == NULL)
    2788                         PyErr_SetObject(PyExc_KeyError, import_str);
    2789         }
    2790         else
    2791                 import = PyObject_GetAttr(builtins, import_str);
    2792         if (import == NULL)
    2793                 goto err;
    2794 
    2795         /* Call the __import__ function with the proper argument list
    2796          * Always use absolute import here. */
    2797         r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
    2798                                   globals, silly_list, 0, NULL);
     2859    static PyObject *silly_list = NULL;
     2860    static PyObject *builtins_str = NULL;
     2861    static PyObject *import_str = NULL;
     2862    PyObject *globals = NULL;
     2863    PyObject *import = NULL;
     2864    PyObject *builtins = NULL;
     2865    PyObject *r = NULL;
     2866
     2867    /* Initialize constant string objects */
     2868    if (silly_list == NULL) {
     2869        import_str = PyString_InternFromString("__import__");
     2870        if (import_str == NULL)
     2871            return NULL;
     2872        builtins_str = PyString_InternFromString("__builtins__");
     2873        if (builtins_str == NULL)
     2874            return NULL;
     2875        silly_list = Py_BuildValue("[s]", "__doc__");
     2876        if (silly_list == NULL)
     2877            return NULL;
     2878    }
     2879
     2880    /* Get the builtins from current globals */
     2881    globals = PyEval_GetGlobals();
     2882    if (globals != NULL) {
     2883        Py_INCREF(globals);
     2884        builtins = PyObject_GetItem(globals, builtins_str);
     2885        if (builtins == NULL)
     2886            goto err;
     2887    }
     2888    else {
     2889        /* No globals -- use standard builtins, and fake globals */
     2890        builtins = PyImport_ImportModuleLevel("__builtin__",
     2891                                              NULL, NULL, NULL, 0);
     2892        if (builtins == NULL)
     2893            return NULL;
     2894        globals = Py_BuildValue("{OO}", builtins_str, builtins);
     2895        if (globals == NULL)
     2896            goto err;
     2897    }
     2898
     2899    /* Get the __import__ function from the builtins */
     2900    if (PyDict_Check(builtins)) {
     2901        import = PyObject_GetItem(builtins, import_str);
     2902        if (import == NULL)
     2903            PyErr_SetObject(PyExc_KeyError, import_str);
     2904    }
     2905    else
     2906        import = PyObject_GetAttr(builtins, import_str);
     2907    if (import == NULL)
     2908        goto err;
     2909
     2910    /* Call the __import__ function with the proper argument list
     2911     * Always use absolute import here. */
     2912    r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
     2913                              globals, silly_list, 0, NULL);
    27992914
    28002915  err:
    2801         Py_XDECREF(globals);
    2802         Py_XDECREF(builtins);
    2803         Py_XDECREF(import);
    2804 
    2805         return r;
     2916    Py_XDECREF(globals);
     2917    Py_XDECREF(builtins);
     2918    Py_XDECREF(import);
     2919
     2920    return r;
    28062921}
    28072922
     
    28142929imp_get_magic(PyObject *self, PyObject *noargs)
    28152930{
    2816         char buf[4];
    2817 
    2818         buf[0] = (char) ((pyc_magic >>  0) & 0xff);
    2819         buf[1] = (char) ((pyc_magic >>  8) & 0xff);
    2820         buf[2] = (char) ((pyc_magic >> 16) & 0xff);
    2821         buf[3] = (char) ((pyc_magic >> 24) & 0xff);
    2822 
    2823         return PyString_FromStringAndSize(buf, 4);
     2931    char buf[4];
     2932
     2933    buf[0] = (char) ((pyc_magic >>  0) & 0xff);
     2934    buf[1] = (char) ((pyc_magic >>  8) & 0xff);
     2935    buf[2] = (char) ((pyc_magic >> 16) & 0xff);
     2936    buf[3] = (char) ((pyc_magic >> 24) & 0xff);
     2937
     2938    return PyString_FromStringAndSize(buf, 4);
    28242939}
    28252940
     
    28272942imp_get_suffixes(PyObject *self, PyObject *noargs)
    28282943{
    2829         PyObject *list;
    2830         struct filedescr *fdp;
    2831 
    2832         list = PyList_New(0);
    2833         if (list == NULL)
    2834                 return NULL;
    2835         for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
    2836                 PyObject *item = Py_BuildValue("ssi",
    2837                                        fdp->suffix, fdp->mode, fdp->type);
    2838                 if (item == NULL) {
    2839                         Py_DECREF(list);
    2840                         return NULL;
    2841                 }
    2842                 if (PyList_Append(list, item) < 0) {
    2843                         Py_DECREF(list);
    2844                         Py_DECREF(item);
    2845                         return NULL;
    2846                 }
    2847                 Py_DECREF(item);
    2848         }
    2849         return list;
     2944    PyObject *list;
     2945    struct filedescr *fdp;
     2946
     2947    list = PyList_New(0);
     2948    if (list == NULL)
     2949        return NULL;
     2950    for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
     2951        PyObject *item = Py_BuildValue("ssi",
     2952                               fdp->suffix, fdp->mode, fdp->type);
     2953        if (item == NULL) {
     2954            Py_DECREF(list);
     2955            return NULL;
     2956        }
     2957        if (PyList_Append(list, item) < 0) {
     2958            Py_DECREF(list);
     2959            Py_DECREF(item);
     2960            return NULL;
     2961        }
     2962        Py_DECREF(item);
     2963    }
     2964    return list;
    28502965}
    28512966
     
    28532968call_find_module(char *name, PyObject *path)
    28542969{
    2855         extern int fclose(FILE *);
    2856         PyObject *fob, *ret;
    2857         struct filedescr *fdp;
    2858         char pathname[MAXPATHLEN+1];
    2859         FILE *fp = NULL;
    2860 
    2861         pathname[0] = '\0';
    2862         if (path == Py_None)
    2863                 path = NULL;
    2864         fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
    2865         if (fdp == NULL)
    2866                 return NULL;
    2867         if (fp != NULL) {
    2868                 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
    2869                 if (fob == NULL) {
    2870                         fclose(fp);
    2871                         return NULL;
    2872                 }
    2873         }
    2874         else {
    2875                 fob = Py_None;
    2876                 Py_INCREF(fob);
    2877         }
    2878         ret = Py_BuildValue("Os(ssi)",
    2879                       fob, pathname, fdp->suffix, fdp->mode, fdp->type);
    2880         Py_DECREF(fob);
    2881         return ret;
     2970    extern int fclose(FILE *);
     2971    PyObject *fob, *ret;
     2972    struct filedescr *fdp;
     2973    char *pathname;
     2974    FILE *fp = NULL;
     2975
     2976    pathname = PyMem_MALLOC(MAXPATHLEN+1);
     2977    if (pathname == NULL) {
     2978        return PyErr_NoMemory();
     2979    }
     2980    pathname[0] = '\0';
     2981    if (path == Py_None)
     2982        path = NULL;
     2983    fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
     2984    if (fdp == NULL) {
     2985        PyMem_FREE(pathname);
     2986        return NULL;
     2987    }
     2988    if (fp != NULL) {
     2989        fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
     2990        if (fob == NULL) {
     2991            PyMem_FREE(pathname);
     2992            return NULL;
     2993        }
     2994    }
     2995    else {
     2996        fob = Py_None;
     2997        Py_INCREF(fob);
     2998    }
     2999    ret = Py_BuildValue("Os(ssi)",
     3000                  fob, pathname, fdp->suffix, fdp->mode, fdp->type);
     3001    Py_DECREF(fob);
     3002    PyMem_FREE(pathname);
     3003    return ret;
    28823004}
    28833005
     
    28853007imp_find_module(PyObject *self, PyObject *args)
    28863008{
    2887         char *name;
    2888         PyObject *path = NULL;
    2889         if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
    2890                 return NULL;
    2891         return call_find_module(name, path);
     3009    char *name;
     3010    PyObject *path = NULL;
     3011    if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
     3012        return NULL;
     3013    return call_find_module(name, path);
    28923014}
    28933015
     
    28953017imp_init_builtin(PyObject *self, PyObject *args)
    28963018{
    2897         char *name;
    2898         int ret;
    2899         PyObject *m;
    2900         if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
    2901                 return NULL;
    2902         ret = init_builtin(name);
    2903         if (ret < 0)
    2904                 return NULL;
    2905         if (ret == 0) {
    2906                 Py_INCREF(Py_None);
    2907                 return Py_None;
    2908         }
    2909         m = PyImport_AddModule(name);
    2910         Py_XINCREF(m);
    2911         return m;
     3019    char *name;
     3020    int ret;
     3021    PyObject *m;
     3022    if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
     3023        return NULL;
     3024    ret = init_builtin(name);
     3025    if (ret < 0)
     3026        return NULL;
     3027    if (ret == 0) {
     3028        Py_INCREF(Py_None);
     3029        return Py_None;
     3030    }
     3031    m = PyImport_AddModule(name);
     3032    Py_XINCREF(m);
     3033    return m;
    29123034}
    29133035
     
    29153037imp_init_frozen(PyObject *self, PyObject *args)
    29163038{
    2917         char *name;
    2918         int ret;
    2919         PyObject *m;
    2920         if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
    2921                 return NULL;
    2922         ret = PyImport_ImportFrozenModule(name);
    2923         if (ret < 0)
    2924                 return NULL;
    2925         if (ret == 0) {
    2926                 Py_INCREF(Py_None);
    2927                 return Py_None;
    2928         }
    2929         m = PyImport_AddModule(name);
    2930         Py_XINCREF(m);
    2931         return m;
     3039    char *name;
     3040    int ret;
     3041    PyObject *m;
     3042    if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
     3043        return NULL;
     3044    ret = PyImport_ImportFrozenModule(name);
     3045    if (ret < 0)
     3046        return NULL;
     3047    if (ret == 0) {
     3048        Py_INCREF(Py_None);
     3049        return Py_None;
     3050    }
     3051    m = PyImport_AddModule(name);
     3052    Py_XINCREF(m);
     3053    return m;
    29323054}
    29333055
     
    29353057imp_get_frozen_object(PyObject *self, PyObject *args)
    29363058{
    2937         char *name;
    2938 
    2939         if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
    2940                 return NULL;
    2941         return get_frozen_object(name);
     3059    char *name;
     3060
     3061    if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
     3062        return NULL;
     3063    return get_frozen_object(name);
    29423064}
    29433065
     
    29453067imp_is_builtin(PyObject *self, PyObject *args)
    29463068{
    2947         char *name;
    2948         if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
    2949                 return NULL;
    2950         return PyInt_FromLong(is_builtin(name));
     3069    char *name;
     3070    if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
     3071        return NULL;
     3072    return PyInt_FromLong(is_builtin(name));
    29513073}
    29523074
     
    29543076imp_is_frozen(PyObject *self, PyObject *args)
    29553077{
    2956         char *name;
    2957         struct _frozen *p;
    2958         if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
    2959                 return NULL;
    2960         p = find_frozen(name);
    2961         return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
     3078    char *name;
     3079    struct _frozen *p;
     3080    if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
     3081        return NULL;
     3082    p = find_frozen(name);
     3083    return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
    29623084}
    29633085
     
    29653087get_file(char *pathname, PyObject *fob, char *mode)
    29663088{
    2967         FILE *fp;
    2968         if (fob == NULL) {
    2969                 if (mode[0] == 'U')
    2970                         mode = "r" PY_STDIOTEXTMODE;
    2971                 fp = fopen(pathname, mode);
    2972                 if (fp == NULL)
    2973                         PyErr_SetFromErrno(PyExc_IOError);
    2974         }
    2975         else {
    2976                 fp = PyFile_AsFile(fob);
    2977                 if (fp == NULL)
    2978                         PyErr_SetString(PyExc_ValueError,
    2979                                         "bad/closed file object");
    2980         }
    2981         return fp;
     3089    FILE *fp;
     3090    if (fob == NULL) {
     3091        if (mode[0] == 'U')
     3092            mode = "r" PY_STDIOTEXTMODE;
     3093        fp = fopen(pathname, mode);
     3094        if (fp == NULL)
     3095            PyErr_SetFromErrno(PyExc_IOError);
     3096    }
     3097    else {
     3098        fp = PyFile_AsFile(fob);
     3099        if (fp == NULL)
     3100            PyErr_SetString(PyExc_ValueError,
     3101                            "bad/closed file object");
     3102    }
     3103    return fp;
    29823104}
    29833105
     
    29853107imp_load_compiled(PyObject *self, PyObject *args)
    29863108{
    2987         char *name;
    2988         char *pathname;
    2989         PyObject *fob = NULL;
    2990         PyObject *m;
    2991         FILE *fp;
    2992         if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
    2993                               &PyFile_Type, &fob))
    2994                 return NULL;
    2995         fp = get_file(pathname, fob, "rb");
    2996         if (fp == NULL)
    2997                 return NULL;
    2998         m = load_compiled_module(name, pathname, fp);
    2999         if (fob == NULL)
    3000                 fclose(fp);
    3001         return m;
     3109    char *name;
     3110    char *pathname;
     3111    PyObject *fob = NULL;
     3112    PyObject *m;
     3113    FILE *fp;
     3114    if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
     3115                          &PyFile_Type, &fob))
     3116        return NULL;
     3117    fp = get_file(pathname, fob, "rb");
     3118    if (fp == NULL)
     3119        return NULL;
     3120    m = load_compiled_module(name, pathname, fp);
     3121    if (fob == NULL)
     3122        fclose(fp);
     3123    return m;
    30023124}
    30033125
     
    30073129imp_load_dynamic(PyObject *self, PyObject *args)
    30083130{
    3009         char *name;
    3010         char *pathname;
    3011         PyObject *fob = NULL;
    3012         PyObject *m;
    3013         FILE *fp = NULL;
    3014         if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
    3015                               &PyFile_Type, &fob))
    3016                 return NULL;
    3017         if (fob) {
    3018                 fp = get_file(pathname, fob, "r");
    3019                 if (fp == NULL)
    3020                         return NULL;
    3021         }
    3022         m = _PyImport_LoadDynamicModule(name, pathname, fp);
    3023         return m;
     3131    char *name;
     3132    char *pathname;
     3133    PyObject *fob = NULL;
     3134    PyObject *m;
     3135    FILE *fp = NULL;
     3136    if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
     3137                          &PyFile_Type, &fob))
     3138        return NULL;
     3139    if (fob) {
     3140        fp = get_file(pathname, fob, "r");
     3141        if (fp == NULL)
     3142            return NULL;
     3143    }
     3144    m = _PyImport_LoadDynamicModule(name, pathname, fp);
     3145    return m;
    30243146}
    30253147
     
    30293151imp_load_source(PyObject *self, PyObject *args)
    30303152{
    3031         char *name;
    3032         char *pathname;
    3033         PyObject *fob = NULL;
    3034         PyObject *m;
    3035         FILE *fp;
    3036         if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
    3037                               &PyFile_Type, &fob))
    3038                 return NULL;
    3039         fp = get_file(pathname, fob, "r");
    3040         if (fp == NULL)
    3041                 return NULL;
    3042         m = load_source_module(name, pathname, fp);
    3043         if (fob == NULL)
    3044                 fclose(fp);
    3045         return m;
     3153    char *name;
     3154    char *pathname;
     3155    PyObject *fob = NULL;
     3156    PyObject *m;
     3157    FILE *fp;
     3158    if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
     3159                          &PyFile_Type, &fob))
     3160        return NULL;
     3161    fp = get_file(pathname, fob, "r");
     3162    if (fp == NULL)
     3163        return NULL;
     3164    m = load_source_module(name, pathname, fp);
     3165    if (fob == NULL)
     3166        fclose(fp);
     3167    return m;
    30463168}
    30473169
     
    30493171imp_load_module(PyObject *self, PyObject *args)
    30503172{
    3051         char *name;
    3052         PyObject *fob;
    3053         char *pathname;
    3054         char *suffix; /* Unused */
    3055         char *mode;
    3056         int type;
    3057         FILE *fp;
    3058 
    3059         if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
    3060                               &name, &fob, &pathname,
    3061                               &suffix, &mode, &type))
    3062                 return NULL;
    3063         if (*mode) {
    3064                 /* Mode must start with 'r' or 'U' and must not contain '+'.
    3065                    Implicit in this test is the assumption that the mode
    3066                    may contain other modifiers like 'b' or 't'. */
    3067 
    3068                 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
    3069                         PyErr_Format(PyExc_ValueError,
    3070                                      "invalid file open mode %.200s", mode);
    3071                         return NULL;
    3072                 }
    3073         }
    3074         if (fob == Py_None)
    3075                 fp = NULL;
    3076         else {
    3077                 if (!PyFile_Check(fob)) {
    3078                         PyErr_SetString(PyExc_ValueError,
    3079                                 "load_module arg#2 should be a file or None");
    3080                         return NULL;
    3081                 }
    3082                 fp = get_file(pathname, fob, mode);
    3083                 if (fp == NULL)
    3084                         return NULL;
    3085         }
    3086         return load_module(name, fp, pathname, type, NULL);
     3173    char *name;
     3174    PyObject *fob;
     3175    char *pathname;
     3176    char *suffix; /* Unused */
     3177    char *mode;
     3178    int type;
     3179    FILE *fp;
     3180
     3181    if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
     3182                          &name, &fob, &pathname,
     3183                          &suffix, &mode, &type))
     3184        return NULL;
     3185    if (*mode) {
     3186        /* Mode must start with 'r' or 'U' and must not contain '+'.
     3187           Implicit in this test is the assumption that the mode
     3188           may contain other modifiers like 'b' or 't'. */
     3189
     3190        if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
     3191            PyErr_Format(PyExc_ValueError,
     3192                         "invalid file open mode %.200s", mode);
     3193            return NULL;
     3194        }
     3195    }
     3196    if (fob == Py_None)
     3197        fp = NULL;
     3198    else {
     3199        if (!PyFile_Check(fob)) {
     3200            PyErr_SetString(PyExc_ValueError,
     3201                "load_module arg#2 should be a file or None");
     3202            return NULL;
     3203        }
     3204        fp = get_file(pathname, fob, mode);
     3205        if (fp == NULL)
     3206            return NULL;
     3207    }
     3208    return load_module(name, fp, pathname, type, NULL);
    30873209}
    30883210
     
    30903212imp_load_package(PyObject *self, PyObject *args)
    30913213{
    3092         char *name;
    3093         char *pathname;
    3094         if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
    3095                 return NULL;
    3096         return load_package(name, pathname);
     3214    char *name;
     3215    char *pathname;
     3216    if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
     3217        return NULL;
     3218    return load_package(name, pathname);
    30973219}
    30983220
     
    31003222imp_new_module(PyObject *self, PyObject *args)
    31013223{
    3102         char *name;
    3103         if (!PyArg_ParseTuple(args, "s:new_module", &name))
    3104                 return NULL;
    3105         return PyModule_New(name);
     3224    char *name;
     3225    if (!PyArg_ParseTuple(args, "s:new_module", &name))
     3226        return NULL;
     3227    return PyModule_New(name);
    31063228}
    31073229
     
    31093231imp_reload(PyObject *self, PyObject *v)
    31103232{
    3111         return PyImport_ReloadModule(v);
     3233    return PyImport_ReloadModule(v);
    31123234}
    31133235
     
    31683290
    31693291static PyMethodDef imp_methods[] = {
    3170         {"reload",       imp_reload,       METH_O,      doc_reload},
    3171         {"find_module", imp_find_module,  METH_VARARGS, doc_find_module},
    3172         {"get_magic",    imp_get_magic,    METH_NOARGS,  doc_get_magic},
    3173         {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes},
    3174         {"load_module", imp_load_module,  METH_VARARGS, doc_load_module},
    3175         {"new_module",  imp_new_module,   METH_VARARGS, doc_new_module},
    3176         {"lock_held",    imp_lock_held,    METH_NOARGS,  doc_lock_held},
    3177         {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock},
    3178         {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock},
    3179         /* The rest are obsolete */
    3180         {"get_frozen_object",   imp_get_frozen_object,  METH_VARARGS},
    3181         {"init_builtin",        imp_init_builtin,       METH_VARARGS},
    3182         {"init_frozen",         imp_init_frozen,        METH_VARARGS},
    3183         {"is_builtin",          imp_is_builtin,         METH_VARARGS},
    3184         {"is_frozen",           imp_is_frozen,          METH_VARARGS},
    3185         {"load_compiled",       imp_load_compiled,      METH_VARARGS},
     3292    {"reload",           imp_reload,       METH_O,      doc_reload},
     3293    {"find_module",      imp_find_module,  METH_VARARGS, doc_find_module},
     3294    {"get_magic",        imp_get_magic,    METH_NOARGS,  doc_get_magic},
     3295    {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes},
     3296    {"load_module",      imp_load_module,  METH_VARARGS, doc_load_module},
     3297    {"new_module",      imp_new_module,   METH_VARARGS, doc_new_module},
     3298    {"lock_held",        imp_lock_held,    METH_NOARGS,  doc_lock_held},
     3299    {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock},
     3300    {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock},
     3301    /* The rest are obsolete */
     3302    {"get_frozen_object",       imp_get_frozen_object,  METH_VARARGS},
     3303    {"init_builtin",            imp_init_builtin,       METH_VARARGS},
     3304    {"init_frozen",             imp_init_frozen,        METH_VARARGS},
     3305    {"is_builtin",              imp_is_builtin,         METH_VARARGS},
     3306    {"is_frozen",               imp_is_frozen,          METH_VARARGS},
     3307    {"load_compiled",           imp_load_compiled,      METH_VARARGS},
    31863308#ifdef HAVE_DYNAMIC_LOADING
    3187         {"load_dynamic",        imp_load_dynamic,       METH_VARARGS},
     3309    {"load_dynamic",            imp_load_dynamic,       METH_VARARGS},
    31883310#endif
    3189         {"load_package",        imp_load_package,       METH_VARARGS},
    3190         {"load_source",         imp_load_source,        METH_VARARGS},
    3191         {NULL,                  NULL}           /* sentinel */
     3311    {"load_package",            imp_load_package,       METH_VARARGS},
     3312    {"load_source",             imp_load_source,        METH_VARARGS},
     3313    {NULL,                      NULL}           /* sentinel */
    31923314};
    31933315
     
    31953317setint(PyObject *d, char *name, int value)
    31963318{
    3197         PyObject *v;
    3198         int err;
    3199 
    3200         v = PyInt_FromLong((long)value);
    3201         err = PyDict_SetItemString(d, name, v);
    3202         Py_XDECREF(v);
    3203         return err;
     3319    PyObject *v;
     3320    int err;
     3321
     3322    v = PyInt_FromLong((long)value);
     3323    err = PyDict_SetItemString(d, name, v);
     3324    Py_XDECREF(v);
     3325    return err;
    32043326}
    32053327
     
    32113333NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
    32123334{
    3213         char *path;
    3214         Py_ssize_t pathlen;
    3215 
    3216         if (!_PyArg_NoKeywords("NullImporter()", kwds))
    3217                 return -1;
    3218 
    3219         if (!PyArg_ParseTuple(args, "s:NullImporter",
    3220                               &path))
    3221                 return -1;
    3222 
    3223         pathlen = strlen(path);
    3224         if (pathlen == 0) {
    3225                 PyErr_SetString(PyExc_ImportError, "empty pathname");
    3226                 return -1;
    3227         } else {
    3228 #ifndef RISCOS
    3229 #ifndef MS_WINDOWS
    3230                 struct stat statbuf;
    3231                 int rv;
    3232 
    3233                 rv = stat(path, &statbuf);
    3234                 if (rv == 0) {
    3235                         /* it exists */
    3236                         if (S_ISDIR(statbuf.st_mode)) {
    3237                                 /* it's a directory */
    3238                                 PyErr_SetString(PyExc_ImportError,
    3239                                                 "existing directory");
    3240                                 return -1;
    3241                         }
    3242                 }
    3243 #else /* MS_WINDOWS */
    3244                 DWORD rv;
    3245                 /* see issue1293 and issue3677:
    3246                  * stat() on Windows doesn't recognise paths like
    3247                  * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
    3248                  */
    3249                 rv = GetFileAttributesA(path);
    3250                 if (rv != INVALID_FILE_ATTRIBUTES) {
    3251                         /* it exists */
    3252                         if (rv & FILE_ATTRIBUTE_DIRECTORY) {
    3253                                 /* it's a directory */
    3254                                 PyErr_SetString(PyExc_ImportError,
    3255                                                 "existing directory");
    3256                                 return -1;
    3257                         }
    3258                 }
    3259 #endif
    3260 #else /* RISCOS */
    3261                 if (object_exists(path)) {
    3262                         /* it exists */
    3263                         if (isdir(path)) {
    3264                                 /* it's a directory */
    3265                                 PyErr_SetString(PyExc_ImportError,
    3266                                                 "existing directory");
    3267                                 return -1;
    3268                         }
    3269                 }
    3270 #endif
    3271         }
    3272         return 0;
     3335    char *path;
     3336    Py_ssize_t pathlen;
     3337
     3338    if (!_PyArg_NoKeywords("NullImporter()", kwds))
     3339        return -1;
     3340
     3341    if (!PyArg_ParseTuple(args, "s:NullImporter",
     3342                          &path))
     3343        return -1;
     3344
     3345    pathlen = strlen(path);
     3346    if (pathlen == 0) {
     3347        PyErr_SetString(PyExc_ImportError, "empty pathname");
     3348        return -1;
     3349    } else {
     3350        if(isdir(path)) {
     3351            PyErr_SetString(PyExc_ImportError,
     3352                            "existing directory");
     3353            return -1;
     3354        }
     3355    }
     3356    return 0;
    32733357}
    32743358
     
    32763360NullImporter_find_module(NullImporter *self, PyObject *args)
    32773361{
    3278         Py_RETURN_NONE;
     3362    Py_RETURN_NONE;
    32793363}
    32803364
    32813365static PyMethodDef NullImporter_methods[] = {
    3282         {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
    3283         "Always return None"
    3284         },
    3285         {NULL}  /* Sentinel */
     3366    {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
     3367    "Always return None"
     3368    },
     3369    {NULL}  /* Sentinel */
    32863370};
    32873371
    32883372
    32893373PyTypeObject PyNullImporter_Type = {
    3290         PyVarObject_HEAD_INIT(NULL, 0)
    3291         "imp.NullImporter",        /*tp_name*/
    3292         sizeof(NullImporter),      /*tp_basicsize*/
    3293         0,                         /*tp_itemsize*/
    3294         0,                         /*tp_dealloc*/
    3295         0,                         /*tp_print*/
    3296         0,                         /*tp_getattr*/
    3297         0,                         /*tp_setattr*/
    3298         0,                         /*tp_compare*/
    3299         0,                         /*tp_repr*/
    3300         0,                         /*tp_as_number*/
    3301         0,                         /*tp_as_sequence*/
    3302         0,                         /*tp_as_mapping*/
    3303         0,                         /*tp_hash */
    3304         0,                         /*tp_call*/
    3305         0,                         /*tp_str*/
    3306         0,                         /*tp_getattro*/
    3307         0,                         /*tp_setattro*/
    3308         0,                         /*tp_as_buffer*/
    3309         Py_TPFLAGS_DEFAULT,        /*tp_flags*/
    3310         "Null importer object",    /* tp_doc */
    3311         0,                         /* tp_traverse */
    3312         0,                         /* tp_clear */
    3313         0,                         /* tp_richcompare */
    3314         0,                         /* tp_weaklistoffset */
    3315         0,                         /* tp_iter */
    3316         0,                         /* tp_iternext */
    3317         NullImporter_methods,      /* tp_methods */
    3318         0,                         /* tp_members */
    3319         0,                         /* tp_getset */
    3320         0,                         /* tp_base */
    3321         0,                         /* tp_dict */
    3322         0,                         /* tp_descr_get */
    3323         0,                         /* tp_descr_set */
    3324         0,                         /* tp_dictoffset */
    3325         (initproc)NullImporter_init,      /* tp_init */
    3326         0,                         /* tp_alloc */
    3327         PyType_GenericNew          /* tp_new */
     3374    PyVarObject_HEAD_INIT(NULL, 0)
     3375    "imp.NullImporter",        /*tp_name*/
     3376    sizeof(NullImporter),      /*tp_basicsize*/
     3377    0,                         /*tp_itemsize*/
     3378    0,                         /*tp_dealloc*/
     3379    0,                         /*tp_print*/
     3380    0,                         /*tp_getattr*/
     3381    0,                         /*tp_setattr*/
     3382    0,                         /*tp_compare*/
     3383    0,                         /*tp_repr*/
     3384    0,                         /*tp_as_number*/
     3385    0,                         /*tp_as_sequence*/
     3386    0,                         /*tp_as_mapping*/
     3387    0,                         /*tp_hash */
     3388    0,                         /*tp_call*/
     3389    0,                         /*tp_str*/
     3390    0,                         /*tp_getattro*/
     3391    0,                         /*tp_setattro*/
     3392    0,                         /*tp_as_buffer*/
     3393    Py_TPFLAGS_DEFAULT,        /*tp_flags*/
     3394    "Null importer object",    /* tp_doc */
     3395    0,                             /* tp_traverse */
     3396    0,                             /* tp_clear */
     3397    0,                             /* tp_richcompare */
     3398    0,                             /* tp_weaklistoffset */
     3399    0,                             /* tp_iter */
     3400    0,                             /* tp_iternext */
     3401    NullImporter_methods,      /* tp_methods */
     3402    0,                         /* tp_members */
     3403    0,                         /* tp_getset */
     3404    0,                         /* tp_base */
     3405    0,                         /* tp_dict */
     3406    0,                         /* tp_descr_get */
     3407    0,                         /* tp_descr_set */
     3408    0,                         /* tp_dictoffset */
     3409    (initproc)NullImporter_init,      /* tp_init */
     3410    0,                         /* tp_alloc */
     3411    PyType_GenericNew          /* tp_new */
    33283412};
    33293413
     
    33323416initimp(void)
    33333417{
    3334         PyObject *m, *d;
    3335 
    3336         if (PyType_Ready(&PyNullImporter_Type) < 0)
    3337                 goto failure;
    3338 
    3339         m = Py_InitModule4("imp", imp_methods, doc_imp,
    3340                            NULL, PYTHON_API_VERSION);
    3341         if (m == NULL)
    3342                 goto failure;
    3343         d = PyModule_GetDict(m);
    3344         if (d == NULL)
    3345                 goto failure;
    3346 
    3347         if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
    3348         if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
    3349         if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
    3350         if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
    3351         if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
    3352         if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
    3353         if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
    3354         if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
    3355         if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
    3356         if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
    3357 
    3358         Py_INCREF(&PyNullImporter_Type);
    3359         PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
     3418    PyObject *m, *d;
     3419
     3420    if (PyType_Ready(&PyNullImporter_Type) < 0)
     3421        goto failure;
     3422
     3423    m = Py_InitModule4("imp", imp_methods, doc_imp,
     3424                       NULL, PYTHON_API_VERSION);
     3425    if (m == NULL)
     3426        goto failure;
     3427    d = PyModule_GetDict(m);
     3428    if (d == NULL)
     3429        goto failure;
     3430
     3431    if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
     3432    if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
     3433    if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
     3434    if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
     3435    if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
     3436    if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
     3437    if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
     3438    if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
     3439    if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
     3440    if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
     3441
     3442    Py_INCREF(&PyNullImporter_Type);
     3443    PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
    33603444  failure:
    3361         ;
     3445    ;
    33623446}
    33633447
     
    33733457PyImport_ExtendInittab(struct _inittab *newtab)
    33743458{
    3375         static struct _inittab *our_copy = NULL;
    3376         struct _inittab *p;
    3377         int i, n;
    3378 
    3379         /* Count the number of entries in both tables */
    3380         for (n = 0; newtab[n].name != NULL; n++)
    3381                 ;
    3382         if (n == 0)
    3383                 return 0; /* Nothing to do */
    3384         for (i = 0; PyImport_Inittab[i].name != NULL; i++)
    3385                 ;
    3386 
    3387         /* Allocate new memory for the combined table */
    3388         p = our_copy;
    3389         PyMem_RESIZE(p, struct _inittab, i+n+1);
    3390         if (p == NULL)
    3391                 return -1;
    3392 
    3393         /* Copy the tables into the new memory */
    3394         if (our_copy != PyImport_Inittab)
    3395                 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
    3396         PyImport_Inittab = our_copy = p;
    3397         memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
    3398 
    3399         return 0;
     3459    static struct _inittab *our_copy = NULL;
     3460    struct _inittab *p;
     3461    int i, n;
     3462
     3463    /* Count the number of entries in both tables */
     3464    for (n = 0; newtab[n].name != NULL; n++)
     3465        ;
     3466    if (n == 0)
     3467        return 0; /* Nothing to do */
     3468    for (i = 0; PyImport_Inittab[i].name != NULL; i++)
     3469        ;
     3470
     3471    /* Allocate new memory for the combined table */
     3472    p = our_copy;
     3473    PyMem_RESIZE(p, struct _inittab, i+n+1);
     3474    if (p == NULL)
     3475        return -1;
     3476
     3477    /* Copy the tables into the new memory */
     3478    if (our_copy != PyImport_Inittab)
     3479        memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
     3480    PyImport_Inittab = our_copy = p;
     3481    memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
     3482
     3483    return 0;
    34003484}
    34013485
     
    34033487
    34043488int
    3405 PyImport_AppendInittab(char *name, void (*initfunc)(void))
    3406 {
    3407         struct _inittab newtab[2];
    3408 
    3409         memset(newtab, '\0', sizeof newtab);
    3410 
    3411         newtab[0].name = name;
    3412         newtab[0].initfunc = initfunc;
    3413 
    3414         return PyImport_ExtendInittab(newtab);
     3489PyImport_AppendInittab(const char *name, void (*initfunc)(void))
     3490{
     3491    struct _inittab newtab[2];
     3492
     3493    memset(newtab, '\0', sizeof newtab);
     3494
     3495    newtab[0].name = (char *)name;
     3496    newtab[0].initfunc = initfunc;
     3497
     3498    return PyImport_ExtendInittab(newtab);
    34153499}
    34163500
Note: See TracChangeset for help on using the changeset viewer.