~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Python/import.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
/* Module definition and import implementation */
 
3
 
 
4
#include "Python.h"
 
5
 
 
6
#include "Python-ast.h"
 
7
#undef Yield /* undefine macro conflicting with winbase.h */
 
8
#include "pyarena.h"
 
9
#include "pythonrun.h"
 
10
#include "errcode.h"
 
11
#include "marshal.h"
 
12
#include "code.h"
 
13
#include "compile.h"
 
14
#include "eval.h"
 
15
#include "osdefs.h"
 
16
#include "importdl.h"
 
17
 
 
18
#ifdef HAVE_FCNTL_H
 
19
#include <fcntl.h>
 
20
#endif
 
21
#ifdef __cplusplus
 
22
extern "C" { 
 
23
#endif
 
24
 
 
25
#ifdef MS_WINDOWS
 
26
/* for stat.st_mode */
 
27
typedef unsigned short mode_t;
 
28
#endif
 
29
 
 
30
 
 
31
/* Magic word to reject .pyc files generated by other Python versions.
 
32
   It should change for each incompatible change to the bytecode.
 
33
 
 
34
   The value of CR and LF is incorporated so if you ever read or write
 
35
   a .pyc file in text mode the magic number will be wrong; also, the
 
36
   Apple MPW compiler swaps their values, botching string constants.
 
37
 
 
38
   The magic numbers must be spaced apart at least 2 values, as the
 
39
   -U interpeter flag will cause MAGIC+1 being used. They have been
 
40
   odd numbers for some time now.
 
41
 
 
42
   There were a variety of old schemes for setting the magic number.
 
43
   The current working scheme is to increment the previous value by
 
44
   10.
 
45
 
 
46
   Known values:
 
47
       Python 1.5:   20121
 
48
       Python 1.5.1: 20121
 
49
       Python 1.5.2: 20121
 
50
       Python 1.6:   50428
 
51
       Python 2.0:   50823
 
52
       Python 2.0.1: 50823
 
53
       Python 2.1:   60202
 
54
       Python 2.1.1: 60202
 
55
       Python 2.1.2: 60202
 
56
       Python 2.2:   60717
 
57
       Python 2.3a0: 62011
 
58
       Python 2.3a0: 62021
 
59
       Python 2.3a0: 62011 (!)
 
60
       Python 2.4a0: 62041
 
61
       Python 2.4a3: 62051
 
62
       Python 2.4b1: 62061
 
63
       Python 2.5a0: 62071
 
64
       Python 2.5a0: 62081 (ast-branch)
 
65
       Python 2.5a0: 62091 (with)
 
66
       Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
 
67
       Python 2.5b3: 62101 (fix wrong code: for x, in ...)
 
68
       Python 2.5b3: 62111 (fix wrong code: x += yield)
 
69
       Python 2.5c1: 62121 (fix wrong lnotab with for loops and
 
70
                            storing constants that should have been removed)
 
71
       Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
 
72
       Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
 
73
       Python 2.6a1: 62161 (WITH_CLEANUP optimization)
 
74
       Python 3000:   3000
 
75
                      3010 (removed UNARY_CONVERT)
 
76
                      3020 (added BUILD_SET)
 
77
                      3030 (added keyword-only parameters)
 
78
                      3040 (added signature annotations)
 
79
                      3050 (print becomes a function)
 
80
                      3060 (PEP 3115 metaclass syntax)
 
81
                      3070 (PEP 3109 raise changes)
 
82
                      3080 (PEP 3137 make __file__ and __name__ unicode)
 
83
                      3090 (kill str8 interning)
 
84
                      3100 (merge from 2.6a0, see 62151)
 
85
                      3102 (__file__ points to source file)
 
86
       Python 3.0a4: 3110 (WITH_CLEANUP optimization).
 
87
       Python 3.0a5: 3130 (lexical exception stacking, including POP_EXCEPT)
 
88
       Python 3.1a0: 3140 (optimize list, set and dict comprehensions:
 
89
                           change LIST_APPEND and SET_ADD, add MAP_ADD)
 
90
       Python 3.1a0: 3150 (optimize conditional branches:
 
91
                           introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
 
92
*/
 
93
#define MAGIC (3150 | ((long)'\r'<<16) | ((long)'\n'<<24))
 
94
 
 
95
/* Magic word as global; note that _PyImport_Init() can change the
 
96
   value of this global to accommodate for alterations of how the
 
97
   compiler works which are enabled by command line switches. */
 
98
static long pyc_magic = MAGIC;
 
99
 
 
100
/* See _PyImport_FixupExtension() below */
 
101
static PyObject *extensions = NULL;
 
102
 
 
103
/* This table is defined in config.c: */
 
104
extern struct _inittab _PyImport_Inittab[];
 
105
 
 
106
/* Method from Parser/tokenizer.c */
 
107
extern char * PyTokenizer_FindEncoding(int);
 
108
 
 
109
struct _inittab *PyImport_Inittab = _PyImport_Inittab;
 
110
 
 
111
/* these tables define the module suffixes that Python recognizes */
 
112
struct filedescr * _PyImport_Filetab = NULL;
 
113
 
 
114
static const struct filedescr _PyImport_StandardFiletab[] = {
 
115
        {".py", "U", PY_SOURCE},
 
116
#ifdef MS_WINDOWS
 
117
        {".pyw", "U", PY_SOURCE},
 
118
#endif
 
119
        {".pyc", "rb", PY_COMPILED},
 
120
        {0, 0}
 
121
};
 
122
 
 
123
 
 
124
/* Initialize things */
 
125
 
 
126
void
 
127
_PyImport_Init(void)
 
128
{
 
129
        const struct filedescr *scan;
 
130
        struct filedescr *filetab;
 
131
        int countD = 0;
 
132
        int countS = 0;
 
133
 
 
134
        /* prepare _PyImport_Filetab: copy entries from
 
135
           _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
 
136
         */
 
137
#ifdef HAVE_DYNAMIC_LOADING
 
138
        for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
 
139
                ++countD;
 
140
#endif
 
141
        for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
 
142
                ++countS;
 
143
        filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
 
144
        if (filetab == NULL)
 
145
                Py_FatalError("Can't initialize import file table.");
 
146
#ifdef HAVE_DYNAMIC_LOADING
 
147
        memcpy(filetab, _PyImport_DynLoadFiletab,
 
148
               countD * sizeof(struct filedescr));
 
149
#endif
 
150
        memcpy(filetab + countD, _PyImport_StandardFiletab,
 
151
               countS * sizeof(struct filedescr));
 
152
        filetab[countD + countS].suffix = NULL;
 
153
 
 
154
        _PyImport_Filetab = filetab;
 
155
 
 
156
        if (Py_OptimizeFlag) {
 
157
                /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
 
158
                for (; filetab->suffix != NULL; filetab++) {
 
159
                        if (strcmp(filetab->suffix, ".pyc") == 0)
 
160
                                filetab->suffix = ".pyo";
 
161
                }
 
162
        }
 
163
 
 
164
        {
 
165
                /* Fix the pyc_magic so that byte compiled code created
 
166
                   using the all-Unicode method doesn't interfere with
 
167
                   code created in normal operation mode. */
 
168
                pyc_magic = MAGIC + 1;
 
169
        }
 
170
}
 
171
 
 
172
void
 
173
_PyImportHooks_Init(void)
 
174
{
 
175
        PyObject *v, *path_hooks = NULL, *zimpimport;
 
176
        int err = 0;
 
177
 
 
178
        /* adding sys.path_hooks and sys.path_importer_cache, setting up
 
179
           zipimport */
 
180
        if (PyType_Ready(&PyNullImporter_Type) < 0)
 
181
                goto error;
 
182
 
 
183
        if (Py_VerboseFlag)
 
184
                PySys_WriteStderr("# installing zipimport hook\n");
 
185
 
 
186
        v = PyList_New(0);
 
187
        if (v == NULL)
 
188
                goto error;
 
189
        err = PySys_SetObject("meta_path", v);
 
190
        Py_DECREF(v);
 
191
        if (err)
 
192
                goto error;
 
193
        v = PyDict_New();
 
194
        if (v == NULL)
 
195
                goto error;
 
196
        err = PySys_SetObject("path_importer_cache", v);
 
197
        Py_DECREF(v);
 
198
        if (err)
 
199
                goto error;
 
200
        path_hooks = PyList_New(0);
 
201
        if (path_hooks == NULL)
 
202
                goto error;
 
203
        err = PySys_SetObject("path_hooks", path_hooks);
 
204
        if (err) {
 
205
  error:
 
206
                PyErr_Print();
 
207
                Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
 
208
                              "path_importer_cache, or NullImporter failed"
 
209
                              );
 
210
        }
 
211
 
 
212
        zimpimport = PyImport_ImportModule("zipimport");
 
213
        if (zimpimport == NULL) {
 
214
                PyErr_Clear(); /* No zip import module -- okay */
 
215
                if (Py_VerboseFlag)
 
216
                        PySys_WriteStderr("# can't import zipimport\n");
 
217
        }
 
218
        else {
 
219
                PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
 
220
                                                               "zipimporter");
 
221
                Py_DECREF(zimpimport);
 
222
                if (zipimporter == NULL) {
 
223
                        PyErr_Clear(); /* No zipimporter object -- okay */
 
224
                        if (Py_VerboseFlag)
 
225
                                PySys_WriteStderr(
 
226
                                    "# can't import zipimport.zipimporter\n");
 
227
                }
 
228
                else {
 
229
                        /* sys.path_hooks.append(zipimporter) */
 
230
                        err = PyList_Append(path_hooks, zipimporter);
 
231
                        Py_DECREF(zipimporter);
 
232
                        if (err)
 
233
                                goto error;
 
234
                        if (Py_VerboseFlag)
 
235
                                PySys_WriteStderr(
 
236
                                        "# installed zipimport hook\n");
 
237
                }
 
238
        }
 
239
        Py_DECREF(path_hooks);
 
240
}
 
241
 
 
242
void
 
243
_PyImport_Fini(void)
 
244
{
 
245
        Py_XDECREF(extensions);
 
246
        extensions = NULL;
 
247
        PyMem_DEL(_PyImport_Filetab);
 
248
        _PyImport_Filetab = NULL;
 
249
}
 
250
 
 
251
 
 
252
/* Locking primitives to prevent parallel imports of the same module
 
253
   in different threads to return with a partially loaded module.
 
254
   These calls are serialized by the global interpreter lock. */
 
255
 
 
256
#ifdef WITH_THREAD
 
257
 
 
258
#include "pythread.h"
 
259
 
 
260
static PyThread_type_lock import_lock = 0;
 
261
static long import_lock_thread = -1;
 
262
static int import_lock_level = 0;
 
263
 
 
264
static void
 
265
lock_import(void)
 
266
{
 
267
        long me = PyThread_get_thread_ident();
 
268
        if (me == -1)
 
269
                return; /* Too bad */
 
270
        if (import_lock == NULL) {
 
271
                import_lock = PyThread_allocate_lock();
 
272
                if (import_lock == NULL)
 
273
                        return;  /* Nothing much we can do. */
 
274
        }
 
275
        if (import_lock_thread == me) {
 
276
                import_lock_level++;
 
277
                return;
 
278
        }
 
279
        if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
 
280
        {
 
281
                PyThreadState *tstate = PyEval_SaveThread();
 
282
                PyThread_acquire_lock(import_lock, 1);
 
283
                PyEval_RestoreThread(tstate);
 
284
        }
 
285
        import_lock_thread = me;
 
286
        import_lock_level = 1;
 
287
}
 
288
 
 
289
static int
 
290
unlock_import(void)
 
291
{
 
292
        long me = PyThread_get_thread_ident();
 
293
        if (me == -1 || import_lock == NULL)
 
294
                return 0; /* Too bad */
 
295
        if (import_lock_thread != me)
 
296
                return -1;
 
297
        import_lock_level--;
 
298
        if (import_lock_level == 0) {
 
299
                import_lock_thread = -1;
 
300
                PyThread_release_lock(import_lock);
 
301
        }
 
302
        return 1;
 
303
}
 
304
 
 
305
/* This function is called from PyOS_AfterFork to ensure that newly
 
306
   created child processes do not share locks with the parent. */
 
307
 
 
308
void
 
309
_PyImport_ReInitLock(void)
 
310
{
 
311
#ifdef _AIX
 
312
        if (import_lock != NULL)
 
313
                import_lock = PyThread_allocate_lock();
 
314
#endif
 
315
}
 
316
 
 
317
#else
 
318
 
 
319
#define lock_import()
 
320
#define unlock_import() 0
 
321
 
 
322
#endif
 
323
 
 
324
static PyObject *
 
325
imp_lock_held(PyObject *self, PyObject *noargs)
 
326
{
 
327
#ifdef WITH_THREAD
 
328
        return PyBool_FromLong(import_lock_thread != -1);
 
329
#else
 
330
        return PyBool_FromLong(0);
 
331
#endif
 
332
}
 
333
 
 
334
static PyObject *
 
335
imp_acquire_lock(PyObject *self, PyObject *noargs)
 
336
{
 
337
#ifdef WITH_THREAD
 
338
        lock_import();
 
339
#endif
 
340
        Py_INCREF(Py_None);
 
341
        return Py_None;
 
342
}
 
343
 
 
344
static PyObject *
 
345
imp_release_lock(PyObject *self, PyObject *noargs)
 
346
{
 
347
#ifdef WITH_THREAD
 
348
        if (unlock_import() < 0) {
 
349
                PyErr_SetString(PyExc_RuntimeError,
 
350
                                "not holding the import lock");
 
351
                return NULL;
 
352
        }
 
353
#endif
 
354
        Py_INCREF(Py_None);
 
355
        return Py_None;
 
356
}
 
357
 
 
358
static void
 
359
imp_modules_reloading_clear(void)
 
360
{
 
361
        PyInterpreterState *interp = PyThreadState_Get()->interp;
 
362
        if (interp->modules_reloading != NULL)
 
363
                PyDict_Clear(interp->modules_reloading);
 
364
}
 
365
 
 
366
/* Helper for sys */
 
367
 
 
368
PyObject *
 
369
PyImport_GetModuleDict(void)
 
370
{
 
371
        PyInterpreterState *interp = PyThreadState_GET()->interp;
 
372
        if (interp->modules == NULL)
 
373
                Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
 
374
        return interp->modules;
 
375
}
 
376
 
 
377
 
 
378
/* List of names to clear in sys */
 
379
static char* sys_deletes[] = {
 
380
        "path", "argv", "ps1", "ps2",
 
381
        "last_type", "last_value", "last_traceback",
 
382
        "path_hooks", "path_importer_cache", "meta_path",
 
383
        /* misc stuff */
 
384
        "flags", "float_info",
 
385
        NULL
 
386
};
 
387
 
 
388
static char* sys_files[] = {
 
389
        "stdin", "__stdin__",
 
390
        "stdout", "__stdout__",
 
391
        "stderr", "__stderr__",
 
392
        NULL
 
393
};
 
394
 
 
395
 
 
396
/* Un-initialize things, as good as we can */
 
397
 
 
398
void
 
399
PyImport_Cleanup(void)
 
400
{
 
401
        Py_ssize_t pos, ndone;
 
402
        char *name;
 
403
        PyObject *key, *value, *dict;
 
404
        PyInterpreterState *interp = PyThreadState_GET()->interp;
 
405
        PyObject *modules = interp->modules;
 
406
 
 
407
        if (modules == NULL)
 
408
                return; /* Already done */
 
409
 
 
410
        /* Delete some special variables first.  These are common
 
411
           places where user values hide and people complain when their
 
412
           destructors fail.  Since the modules containing them are
 
413
           deleted *last* of all, they would come too late in the normal
 
414
           destruction order.  Sigh. */
 
415
 
 
416
        value = PyDict_GetItemString(modules, "builtins");
 
417
        if (value != NULL && PyModule_Check(value)) {
 
418
                dict = PyModule_GetDict(value);
 
419
                if (Py_VerboseFlag)
 
420
                        PySys_WriteStderr("# clear builtins._\n");
 
421
                PyDict_SetItemString(dict, "_", Py_None);
 
422
        }
 
423
        value = PyDict_GetItemString(modules, "sys");
 
424
        if (value != NULL && PyModule_Check(value)) {
 
425
                char **p;
 
426
                PyObject *v;
 
427
                dict = PyModule_GetDict(value);
 
428
                for (p = sys_deletes; *p != NULL; p++) {
 
429
                        if (Py_VerboseFlag)
 
430
                                PySys_WriteStderr("# clear sys.%s\n", *p);
 
431
                        PyDict_SetItemString(dict, *p, Py_None);
 
432
                }
 
433
                for (p = sys_files; *p != NULL; p+=2) {
 
434
                        if (Py_VerboseFlag)
 
435
                                PySys_WriteStderr("# restore sys.%s\n", *p);
 
436
                        v = PyDict_GetItemString(dict, *(p+1));
 
437
                        if (v == NULL)
 
438
                                v = Py_None;
 
439
                        PyDict_SetItemString(dict, *p, v);
 
440
                }
 
441
        }
 
442
 
 
443
        /* First, delete __main__ */
 
444
        value = PyDict_GetItemString(modules, "__main__");
 
445
        if (value != NULL && PyModule_Check(value)) {
 
446
                if (Py_VerboseFlag)
 
447
                        PySys_WriteStderr("# cleanup __main__\n");
 
448
                _PyModule_Clear(value);
 
449
                PyDict_SetItemString(modules, "__main__", Py_None);
 
450
        }
 
451
 
 
452
        /* The special treatment of "builtins" here is because even
 
453
           when it's not referenced as a module, its dictionary is
 
454
           referenced by almost every module's __builtins__.  Since
 
455
           deleting a module clears its dictionary (even if there are
 
456
           references left to it), we need to delete the "builtins"
 
457
           module last.  Likewise, we don't delete sys until the very
 
458
           end because it is implicitly referenced (e.g. by print).
 
459
 
 
460
           Also note that we 'delete' modules by replacing their entry
 
461
           in the modules dict with None, rather than really deleting
 
462
           them; this avoids a rehash of the modules dictionary and
 
463
           also marks them as "non existent" so they won't be
 
464
           re-imported. */
 
465
 
 
466
        /* Next, repeatedly delete modules with a reference count of
 
467
           one (skipping builtins and sys) and delete them */
 
468
        do {
 
469
                ndone = 0;
 
470
                pos = 0;
 
471
                while (PyDict_Next(modules, &pos, &key, &value)) {
 
472
                        if (value->ob_refcnt != 1)
 
473
                                continue;
 
474
                        if (PyUnicode_Check(key) && PyModule_Check(value)) {
 
475
                                name = _PyUnicode_AsString(key);
 
476
                                if (strcmp(name, "builtins") == 0)
 
477
                                        continue;
 
478
                                if (strcmp(name, "sys") == 0)
 
479
                                        continue;
 
480
                                if (Py_VerboseFlag)
 
481
                                        PySys_WriteStderr(
 
482
                                                "# cleanup[1] %s\n", name);
 
483
                                _PyModule_Clear(value);
 
484
                                PyDict_SetItem(modules, key, Py_None);
 
485
                                ndone++;
 
486
                        }
 
487
                }
 
488
        } while (ndone > 0);
 
489
 
 
490
        /* Next, delete all modules (still skipping builtins and sys) */
 
491
        pos = 0;
 
492
        while (PyDict_Next(modules, &pos, &key, &value)) {
 
493
                if (PyUnicode_Check(key) && PyModule_Check(value)) {
 
494
                        name = _PyUnicode_AsString(key);
 
495
                        if (strcmp(name, "builtins") == 0)
 
496
                                continue;
 
497
                        if (strcmp(name, "sys") == 0)
 
498
                                continue;
 
499
                        if (Py_VerboseFlag)
 
500
                                PySys_WriteStderr("# cleanup[2] %s\n", name);
 
501
                        _PyModule_Clear(value);
 
502
                        PyDict_SetItem(modules, key, Py_None);
 
503
                }
 
504
        }
 
505
 
 
506
        /* Next, delete sys and builtins (in that order) */
 
507
        value = PyDict_GetItemString(modules, "sys");
 
508
        if (value != NULL && PyModule_Check(value)) {
 
509
                if (Py_VerboseFlag)
 
510
                        PySys_WriteStderr("# cleanup sys\n");
 
511
                _PyModule_Clear(value);
 
512
                PyDict_SetItemString(modules, "sys", Py_None);
 
513
        }
 
514
        value = PyDict_GetItemString(modules, "builtins");
 
515
        if (value != NULL && PyModule_Check(value)) {
 
516
                if (Py_VerboseFlag)
 
517
                        PySys_WriteStderr("# cleanup builtins\n");
 
518
                _PyModule_Clear(value);
 
519
                PyDict_SetItemString(modules, "builtins", Py_None);
 
520
        }
 
521
 
 
522
        /* Finally, clear and delete the modules directory */
 
523
        PyDict_Clear(modules);
 
524
        interp->modules = NULL;
 
525
        Py_DECREF(modules);
 
526
        Py_CLEAR(interp->modules_reloading);
 
527
}
 
528
 
 
529
 
 
530
/* Helper for pythonrun.c -- return magic number */
 
531
 
 
532
long
 
533
PyImport_GetMagicNumber(void)
 
534
{
 
535
        return pyc_magic;
 
536
}
 
537
 
 
538
 
 
539
/* Magic for extension modules (built-in as well as dynamically
 
540
   loaded).  To prevent initializing an extension module more than
 
541
   once, we keep a static dictionary 'extensions' keyed by module name
 
542
   (for built-in modules) or by filename (for dynamically loaded
 
543
   modules), containing these modules.  A copy of the module's
 
544
   dictionary is stored by calling _PyImport_FixupExtension()
 
545
   immediately after the module initialization function succeeds.  A
 
546
   copy can be retrieved from there by calling
 
547
   _PyImport_FindExtension(). 
 
548
 
 
549
   Modules which do support multiple multiple initialization set
 
550
   their m_size field to a non-negative number (indicating the size
 
551
   of the module-specific state). They are still recorded in the
 
552
   extensions dictionary, to avoid loading shared libraries twice.
 
553
*/
 
554
 
 
555
int
 
556
_PyImport_FixupExtension(PyObject *mod, char *name, char *filename)
 
557
{
 
558
        PyObject *modules, *dict;
 
559
        struct PyModuleDef *def;
 
560
        if (extensions == NULL) {
 
561
                extensions = PyDict_New();
 
562
                if (extensions == NULL)
 
563
                        return -1;
 
564
        }
 
565
        if (mod == NULL || !PyModule_Check(mod)) {
 
566
                PyErr_BadInternalCall();
 
567
                return -1;
 
568
        }
 
569
        def = PyModule_GetDef(mod);
 
570
        if (!def) {
 
571
                PyErr_BadInternalCall();
 
572
                return -1;
 
573
        }
 
574
        modules = PyImport_GetModuleDict();
 
575
        if (PyDict_SetItemString(modules, name, mod) < 0)
 
576
                return -1;
 
577
        if (_PyState_AddModule(mod, def) < 0) {
 
578
                PyDict_DelItemString(modules, name);
 
579
                return -1;
 
580
        }
 
581
        if (def->m_size == -1) {
 
582
                if (def->m_base.m_copy) {
 
583
                        /* Somebody already imported the module, 
 
584
                           likely under a different name.
 
585
                           XXX this should really not happen. */
 
586
                        Py_DECREF(def->m_base.m_copy);
 
587
                        def->m_base.m_copy = NULL;
 
588
                }
 
589
                dict = PyModule_GetDict(mod);
 
590
                if (dict == NULL)
 
591
                        return -1;
 
592
                def->m_base.m_copy = PyDict_Copy(dict);
 
593
                if (def->m_base.m_copy == NULL)
 
594
                        return -1;
 
595
        }
 
596
        PyDict_SetItemString(extensions, filename, (PyObject*)def);
 
597
        return 0;
 
598
}
 
599
 
 
600
PyObject *
 
601
_PyImport_FindExtension(char *name, char *filename)
 
602
{
 
603
        PyObject *mod, *mdict;
 
604
        PyModuleDef* def;
 
605
        if (extensions == NULL)
 
606
                return NULL;
 
607
        def = (PyModuleDef*)PyDict_GetItemString(extensions, filename);
 
608
        if (def == NULL)
 
609
                return NULL;
 
610
        if (def->m_size == -1) {
 
611
                /* Module does not support repeated initialization */
 
612
                if (def->m_base.m_copy == NULL)
 
613
                        return NULL;
 
614
                mod = PyImport_AddModule(name);
 
615
                if (mod == NULL)
 
616
                        return NULL;
 
617
                mdict = PyModule_GetDict(mod);
 
618
                if (mdict == NULL)
 
619
                        return NULL;
 
620
                if (PyDict_Update(mdict, def->m_base.m_copy))
 
621
                        return NULL;
 
622
        }
 
623
        else {
 
624
                if (def->m_base.m_init == NULL)
 
625
                        return NULL;
 
626
                mod = def->m_base.m_init();
 
627
                if (mod == NULL)
 
628
                        return NULL;
 
629
                PyDict_SetItemString(PyImport_GetModuleDict(), name, mod);
 
630
                Py_DECREF(mod);
 
631
        }
 
632
        if (_PyState_AddModule(mod, def) < 0) {
 
633
                PyDict_DelItemString(PyImport_GetModuleDict(), name);
 
634
                Py_DECREF(mod);
 
635
                return NULL;
 
636
        }
 
637
        if (Py_VerboseFlag)
 
638
                PySys_WriteStderr("import %s # previously loaded (%s)\n",
 
639
                                  name, filename);
 
640
        return mod;
 
641
        
 
642
}
 
643
 
 
644
 
 
645
/* Get the module object corresponding to a module name.
 
646
   First check the modules dictionary if there's one there,
 
647
   if not, create a new one and insert it in the modules dictionary.
 
648
   Because the former action is most common, THIS DOES NOT RETURN A
 
649
   'NEW' REFERENCE! */
 
650
 
 
651
PyObject *
 
652
PyImport_AddModule(const char *name)
 
653
{
 
654
        PyObject *modules = PyImport_GetModuleDict();
 
655
        PyObject *m;
 
656
 
 
657
        if ((m = PyDict_GetItemString(modules, name)) != NULL &&
 
658
            PyModule_Check(m))
 
659
                return m;
 
660
        m = PyModule_New(name);
 
661
        if (m == NULL)
 
662
                return NULL;
 
663
        if (PyDict_SetItemString(modules, name, m) != 0) {
 
664
                Py_DECREF(m);
 
665
                return NULL;
 
666
        }
 
667
        Py_DECREF(m); /* Yes, it still exists, in modules! */
 
668
 
 
669
        return m;
 
670
}
 
671
 
 
672
/* Remove name from sys.modules, if it's there. */
 
673
static void
 
674
_RemoveModule(const char *name)
 
675
{
 
676
        PyObject *modules = PyImport_GetModuleDict();
 
677
        if (PyDict_GetItemString(modules, name) == NULL)
 
678
                return;
 
679
        if (PyDict_DelItemString(modules, name) < 0)
 
680
                Py_FatalError("import:  deleting existing key in"
 
681
                              "sys.modules failed");
 
682
}
 
683
 
 
684
static PyObject * get_sourcefile(const char *file);
 
685
 
 
686
/* Execute a code object in a module and return the module object
 
687
 * WITH INCREMENTED REFERENCE COUNT.  If an error occurs, name is
 
688
 * removed from sys.modules, to avoid leaving damaged module objects
 
689
 * in sys.modules.  The caller may wish to restore the original
 
690
 * module object (if any) in this case; PyImport_ReloadModule is an
 
691
 * example.
 
692
 */
 
693
PyObject *
 
694
PyImport_ExecCodeModule(char *name, PyObject *co)
 
695
{
 
696
        return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
 
697
}
 
698
 
 
699
PyObject *
 
700
PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
 
701
{
 
702
        PyObject *modules = PyImport_GetModuleDict();
 
703
        PyObject *m, *d, *v;
 
704
 
 
705
        m = PyImport_AddModule(name);
 
706
        if (m == NULL)
 
707
                return NULL;
 
708
        /* If the module is being reloaded, we get the old module back
 
709
           and re-use its dict to exec the new code. */
 
710
        d = PyModule_GetDict(m);
 
711
        if (PyDict_GetItemString(d, "__builtins__") == NULL) {
 
712
                if (PyDict_SetItemString(d, "__builtins__",
 
713
                                         PyEval_GetBuiltins()) != 0)
 
714
                        goto error;
 
715
        }
 
716
        /* Remember the filename as the __file__ attribute */
 
717
        v = NULL;
 
718
        if (pathname != NULL) {
 
719
                v = get_sourcefile(pathname);
 
720
                if (v == NULL)
 
721
                        PyErr_Clear();
 
722
        }
 
723
        if (v == NULL) {
 
724
                v = ((PyCodeObject *)co)->co_filename;
 
725
                Py_INCREF(v);
 
726
        }
 
727
        if (PyDict_SetItemString(d, "__file__", v) != 0)
 
728
                PyErr_Clear(); /* Not important enough to report */
 
729
        Py_DECREF(v);
 
730
 
 
731
        v = PyEval_EvalCode((PyCodeObject *)co, d, d);
 
732
        if (v == NULL)
 
733
                goto error;
 
734
        Py_DECREF(v);
 
735
 
 
736
        if ((m = PyDict_GetItemString(modules, name)) == NULL) {
 
737
                PyErr_Format(PyExc_ImportError,
 
738
                             "Loaded module %.200s not found in sys.modules",
 
739
                             name);
 
740
                return NULL;
 
741
        }
 
742
 
 
743
        Py_INCREF(m);
 
744
 
 
745
        return m;
 
746
 
 
747
  error:
 
748
        _RemoveModule(name);
 
749
        return NULL;
 
750
}
 
751
 
 
752
 
 
753
/* Given a pathname for a Python source file, fill a buffer with the
 
754
   pathname for the corresponding compiled file.  Return the pathname
 
755
   for the compiled file, or NULL if there's no space in the buffer.
 
756
   Doesn't set an exception. */
 
757
 
 
758
static char *
 
759
make_compiled_pathname(char *pathname, char *buf, size_t buflen)
 
760
{
 
761
        size_t len = strlen(pathname);
 
762
        if (len+2 > buflen)
 
763
                return NULL;
 
764
 
 
765
#ifdef MS_WINDOWS
 
766
        /* Treat .pyw as if it were .py.  The case of ".pyw" must match
 
767
           that used in _PyImport_StandardFiletab. */
 
768
        if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
 
769
                --len;  /* pretend 'w' isn't there */
 
770
#endif
 
771
        memcpy(buf, pathname, len);
 
772
        buf[len] = Py_OptimizeFlag ? 'o' : 'c';
 
773
        buf[len+1] = '\0';
 
774
 
 
775
        return buf;
 
776
}
 
777
 
 
778
 
 
779
/* Given a pathname for a Python source file, its time of last
 
780
   modification, and a pathname for a compiled file, check whether the
 
781
   compiled file represents the same version of the source.  If so,
 
782
   return a FILE pointer for the compiled file, positioned just after
 
783
   the header; if not, return NULL.
 
784
   Doesn't set an exception. */
 
785
 
 
786
static FILE *
 
787
check_compiled_module(char *pathname, time_t mtime, char *cpathname)
 
788
{
 
789
        FILE *fp;
 
790
        long magic;
 
791
        long pyc_mtime;
 
792
 
 
793
        fp = fopen(cpathname, "rb");
 
794
        if (fp == NULL)
 
795
                return NULL;
 
796
        magic = PyMarshal_ReadLongFromFile(fp);
 
797
        if (magic != pyc_magic) {
 
798
                if (Py_VerboseFlag)
 
799
                        PySys_WriteStderr("# %s has bad magic\n", cpathname);
 
800
                fclose(fp);
 
801
                return NULL;
 
802
        }
 
803
        pyc_mtime = PyMarshal_ReadLongFromFile(fp);
 
804
        if (pyc_mtime != mtime) {
 
805
                if (Py_VerboseFlag)
 
806
                        PySys_WriteStderr("# %s has bad mtime\n", cpathname);
 
807
                fclose(fp);
 
808
                return NULL;
 
809
        }
 
810
        if (Py_VerboseFlag)
 
811
                PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
 
812
        return fp;
 
813
}
 
814
 
 
815
 
 
816
/* Read a code object from a file and check it for validity */
 
817
 
 
818
static PyCodeObject *
 
819
read_compiled_module(char *cpathname, FILE *fp)
 
820
{
 
821
        PyObject *co;
 
822
 
 
823
        co = PyMarshal_ReadLastObjectFromFile(fp);
 
824
        if (co == NULL)
 
825
                return NULL;
 
826
        if (!PyCode_Check(co)) {
 
827
                PyErr_Format(PyExc_ImportError,
 
828
                             "Non-code object in %.200s", cpathname);
 
829
                Py_DECREF(co);
 
830
                return NULL;
 
831
        }
 
832
        return (PyCodeObject *)co;
 
833
}
 
834
 
 
835
 
 
836
/* Load a module from a compiled file, execute it, and return its
 
837
   module object WITH INCREMENTED REFERENCE COUNT */
 
838
 
 
839
static PyObject *
 
840
load_compiled_module(char *name, char *cpathname, FILE *fp)
 
841
{
 
842
        long magic;
 
843
        PyCodeObject *co;
 
844
        PyObject *m;
 
845
 
 
846
        magic = PyMarshal_ReadLongFromFile(fp);
 
847
        if (magic != pyc_magic) {
 
848
                PyErr_Format(PyExc_ImportError,
 
849
                             "Bad magic number in %.200s", cpathname);
 
850
                return NULL;
 
851
        }
 
852
        (void) PyMarshal_ReadLongFromFile(fp);
 
853
        co = read_compiled_module(cpathname, fp);
 
854
        if (co == NULL)
 
855
                return NULL;
 
856
        if (Py_VerboseFlag)
 
857
                PySys_WriteStderr("import %s # precompiled from %s\n",
 
858
                        name, cpathname);
 
859
        m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
 
860
        Py_DECREF(co);
 
861
 
 
862
        return m;
 
863
}
 
864
 
 
865
/* Parse a source file and return the corresponding code object */
 
866
 
 
867
static PyCodeObject *
 
868
parse_source_module(const char *pathname, FILE *fp)
 
869
{
 
870
        PyCodeObject *co = NULL;
 
871
        mod_ty mod;
 
872
        PyCompilerFlags flags;
 
873
        PyArena *arena = PyArena_New();
 
874
        if (arena == NULL)
 
875
                return NULL;
 
876
 
 
877
        flags.cf_flags = 0;
 
878
        mod = PyParser_ASTFromFile(fp, pathname, NULL,
 
879
                                   Py_file_input, 0, 0, &flags, 
 
880
                                   NULL, arena);
 
881
        if (mod) {
 
882
                co = PyAST_Compile(mod, pathname, NULL, arena);
 
883
        }
 
884
        PyArena_Free(arena);
 
885
        return co;
 
886
}
 
887
 
 
888
 
 
889
/* Helper to open a bytecode file for writing in exclusive mode */
 
890
 
 
891
static FILE *
 
892
open_exclusive(char *filename, mode_t mode)
 
893
{
 
894
#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
 
895
        /* Use O_EXCL to avoid a race condition when another process tries to
 
896
           write the same file.  When that happens, our open() call fails,
 
897
           which is just fine (since it's only a cache).
 
898
           XXX If the file exists and is writable but the directory is not
 
899
           writable, the file will never be written.  Oh well.
 
900
        */
 
901
        int fd;
 
902
        (void) unlink(filename);
 
903
        fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
 
904
#ifdef O_BINARY
 
905
                                |O_BINARY   /* necessary for Windows */
 
906
#endif
 
907
#ifdef __VMS
 
908
                        , mode, "ctxt=bin", "shr=nil"
 
909
#else
 
910
                        , mode
 
911
#endif
 
912
                  );
 
913
        if (fd < 0)
 
914
                return NULL;
 
915
        return fdopen(fd, "wb");
 
916
#else
 
917
        /* Best we can do -- on Windows this can't happen anyway */
 
918
        return fopen(filename, "wb");
 
919
#endif
 
920
}
 
921
 
 
922
 
 
923
/* Write a compiled module to a file, placing the time of last
 
924
   modification of its source into the header.
 
925
   Errors are ignored, if a write error occurs an attempt is made to
 
926
   remove the file. */
 
927
 
 
928
static void
 
929
write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
 
930
{
 
931
        FILE *fp;
 
932
        time_t mtime = srcstat->st_mtime;
 
933
        mode_t mode = srcstat->st_mode;
 
934
 
 
935
        fp = open_exclusive(cpathname, mode);
 
936
        if (fp == NULL) {
 
937
                if (Py_VerboseFlag)
 
938
                        PySys_WriteStderr(
 
939
                                "# can't create %s\n", cpathname);
 
940
                return;
 
941
        }
 
942
        PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
 
943
        /* First write a 0 for mtime */
 
944
        PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
 
945
        PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
 
946
        if (fflush(fp) != 0 || ferror(fp)) {
 
947
                if (Py_VerboseFlag)
 
948
                        PySys_WriteStderr("# can't write %s\n", cpathname);
 
949
                /* Don't keep partial file */
 
950
                fclose(fp);
 
951
                (void) unlink(cpathname);
 
952
                return;
 
953
        }
 
954
        /* Now write the true mtime */
 
955
        fseek(fp, 4L, 0);
 
956
        assert(mtime < LONG_MAX);
 
957
        PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
 
958
        fflush(fp);
 
959
        fclose(fp);
 
960
        if (Py_VerboseFlag)
 
961
                PySys_WriteStderr("# wrote %s\n", cpathname);
 
962
}
 
963
 
 
964
static void
 
965
update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
 
966
{
 
967
        PyObject *constants, *tmp;
 
968
        Py_ssize_t i, n;
 
969
 
 
970
        if (PyUnicode_Compare(co->co_filename, oldname))
 
971
                return;
 
972
 
 
973
        tmp = co->co_filename;
 
974
        co->co_filename = newname;
 
975
        Py_INCREF(co->co_filename);
 
976
        Py_DECREF(tmp);
 
977
 
 
978
        constants = co->co_consts;
 
979
        n = PyTuple_GET_SIZE(constants);
 
980
        for (i = 0; i < n; i++) {
 
981
                tmp = PyTuple_GET_ITEM(constants, i);
 
982
                if (PyCode_Check(tmp))
 
983
                        update_code_filenames((PyCodeObject *)tmp,
 
984
                                              oldname, newname);
 
985
        }
 
986
}
 
987
 
 
988
static int
 
989
update_compiled_module(PyCodeObject *co, char *pathname)
 
990
{
 
991
        PyObject *oldname, *newname;
 
992
 
 
993
        newname = PyUnicode_DecodeFSDefault(pathname);
 
994
        if (newname == NULL)
 
995
                return -1;
 
996
 
 
997
        if (!PyUnicode_Compare(co->co_filename, newname)) {
 
998
                Py_DECREF(newname);
 
999
                return 0;
 
1000
        }
 
1001
 
 
1002
        oldname = co->co_filename;
 
1003
        Py_INCREF(oldname);
 
1004
        update_code_filenames(co, oldname, newname);
 
1005
        Py_DECREF(oldname);
 
1006
        Py_DECREF(newname);
 
1007
        return 1;
 
1008
}
 
1009
 
 
1010
/* Load a source module from a given file and return its module
 
1011
   object WITH INCREMENTED REFERENCE COUNT.  If there's a matching
 
1012
   byte-compiled file, use that instead. */
 
1013
 
 
1014
static PyObject *
 
1015
load_source_module(char *name, char *pathname, FILE *fp)
 
1016
{
 
1017
        struct stat st;
 
1018
        FILE *fpc;
 
1019
        char buf[MAXPATHLEN+1];
 
1020
        char *cpathname;
 
1021
        PyCodeObject *co;
 
1022
        PyObject *m;
 
1023
        
 
1024
        if (fstat(fileno(fp), &st) != 0) {
 
1025
                PyErr_Format(PyExc_RuntimeError,
 
1026
                             "unable to get file status from '%s'",
 
1027
                             pathname);
 
1028
                return NULL;
 
1029
        }
 
1030
#if SIZEOF_TIME_T > 4
 
1031
        /* Python's .pyc timestamp handling presumes that the timestamp fits
 
1032
           in 4 bytes. This will be fine until sometime in the year 2038,
 
1033
           when a 4-byte signed time_t will overflow.
 
1034
         */
 
1035
        if (st.st_mtime >> 32) {
 
1036
                PyErr_SetString(PyExc_OverflowError,
 
1037
                        "modification time overflows a 4 byte field");
 
1038
                return NULL;
 
1039
        }
 
1040
#endif
 
1041
        cpathname = make_compiled_pathname(pathname, buf,
 
1042
                                           (size_t)MAXPATHLEN + 1);
 
1043
        if (cpathname != NULL &&
 
1044
            (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
 
1045
                co = read_compiled_module(cpathname, fpc);
 
1046
                fclose(fpc);
 
1047
                if (co == NULL)
 
1048
                        return NULL;
 
1049
                if (update_compiled_module(co, pathname) < 0)
 
1050
                        return NULL;
 
1051
                if (Py_VerboseFlag)
 
1052
                        PySys_WriteStderr("import %s # precompiled from %s\n",
 
1053
                                name, cpathname);
 
1054
                pathname = cpathname;
 
1055
        }
 
1056
        else {
 
1057
                co = parse_source_module(pathname, fp);
 
1058
                if (co == NULL)
 
1059
                        return NULL;
 
1060
                if (Py_VerboseFlag)
 
1061
                        PySys_WriteStderr("import %s # from %s\n",
 
1062
                                name, pathname);
 
1063
                if (cpathname) {
 
1064
                        PyObject *ro = PySys_GetObject("dont_write_bytecode");
 
1065
                        if (ro == NULL || !PyObject_IsTrue(ro))
 
1066
                                write_compiled_module(co, cpathname, &st);
 
1067
                }
 
1068
        }
 
1069
        m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
 
1070
        Py_DECREF(co);
 
1071
 
 
1072
        return m;
 
1073
}
 
1074
 
 
1075
/* Get source file -> unicode or None
 
1076
 * Returns the path to the py file if available, else the given path
 
1077
 */
 
1078
static PyObject *
 
1079
get_sourcefile(const char *file)
 
1080
{
 
1081
        char py[MAXPATHLEN + 1];
 
1082
        Py_ssize_t len;
 
1083
        PyObject *u;
 
1084
        struct stat statbuf;
 
1085
 
 
1086
        if (!file || !*file) {
 
1087
                Py_RETURN_NONE;
 
1088
        }
 
1089
 
 
1090
        len = strlen(file);
 
1091
        /* match '*.py?' */
 
1092
        if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
 
1093
                return PyUnicode_DecodeFSDefault(file);
 
1094
        }
 
1095
 
 
1096
        strncpy(py, file, len-1);
 
1097
        py[len-1] = '\0';
 
1098
        if (stat(py, &statbuf) == 0 &&
 
1099
                S_ISREG(statbuf.st_mode)) {
 
1100
                u = PyUnicode_DecodeFSDefault(py);
 
1101
        }
 
1102
        else {
 
1103
                u = PyUnicode_DecodeFSDefault(file);
 
1104
        }
 
1105
        return u;
 
1106
}
 
1107
 
 
1108
/* Forward */
 
1109
static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
 
1110
static struct filedescr *find_module(char *, char *, PyObject *,
 
1111
                                     char *, size_t, FILE **, PyObject **);
 
1112
static struct _frozen * find_frozen(char *);
 
1113
 
 
1114
/* Load a package and return its module object WITH INCREMENTED
 
1115
   REFERENCE COUNT */
 
1116
 
 
1117
static PyObject *
 
1118
load_package(char *name, char *pathname)
 
1119
{
 
1120
        PyObject *m, *d;
 
1121
        PyObject *file = NULL;
 
1122
        PyObject *path = NULL;
 
1123
        int err;
 
1124
        char buf[MAXPATHLEN+1];
 
1125
        FILE *fp = NULL;
 
1126
        struct filedescr *fdp;
 
1127
 
 
1128
        m = PyImport_AddModule(name);
 
1129
        if (m == NULL)
 
1130
                return NULL;
 
1131
        if (Py_VerboseFlag)
 
1132
                PySys_WriteStderr("import %s # directory %s\n",
 
1133
                        name, pathname);
 
1134
        d = PyModule_GetDict(m);
 
1135
        file = get_sourcefile(pathname);
 
1136
        if (file == NULL)
 
1137
                goto error;
 
1138
        path = Py_BuildValue("[O]", file);
 
1139
        if (path == NULL)
 
1140
                goto error;
 
1141
        err = PyDict_SetItemString(d, "__file__", file);
 
1142
        if (err == 0)
 
1143
                err = PyDict_SetItemString(d, "__path__", path);
 
1144
        if (err != 0)
 
1145
                goto error;
 
1146
        buf[0] = '\0';
 
1147
        fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
 
1148
        if (fdp == NULL) {
 
1149
                if (PyErr_ExceptionMatches(PyExc_ImportError)) {
 
1150
                        PyErr_Clear();
 
1151
                        Py_INCREF(m);
 
1152
                }
 
1153
                else
 
1154
                        m = NULL;
 
1155
                goto cleanup;
 
1156
        }
 
1157
        m = load_module(name, fp, buf, fdp->type, NULL);
 
1158
        if (fp != NULL)
 
1159
                fclose(fp);
 
1160
        goto cleanup;
 
1161
 
 
1162
  error:
 
1163
        m = NULL;
 
1164
  cleanup:
 
1165
        Py_XDECREF(path);
 
1166
        Py_XDECREF(file);
 
1167
        return m;
 
1168
}
 
1169
 
 
1170
 
 
1171
/* Helper to test for built-in module */
 
1172
 
 
1173
static int
 
1174
is_builtin(char *name)
 
1175
{
 
1176
        int i;
 
1177
        for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
 
1178
                if (strcmp(name, PyImport_Inittab[i].name) == 0) {
 
1179
                        if (PyImport_Inittab[i].initfunc == NULL)
 
1180
                                return -1;
 
1181
                        else
 
1182
                                return 1;
 
1183
                }
 
1184
        }
 
1185
        return 0;
 
1186
}
 
1187
 
 
1188
 
 
1189
/* Return an importer object for a sys.path/pkg.__path__ item 'p',
 
1190
   possibly by fetching it from the path_importer_cache dict. If it
 
1191
   wasn't yet cached, traverse path_hooks until a hook is found
 
1192
   that can handle the path item. Return None if no hook could;
 
1193
   this tells our caller it should fall back to the builtin
 
1194
   import mechanism. Cache the result in path_importer_cache.
 
1195
   Returns a borrowed reference. */
 
1196
 
 
1197
static PyObject *
 
1198
get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
 
1199
                  PyObject *p)
 
1200
{
 
1201
        PyObject *importer;
 
1202
        Py_ssize_t j, nhooks;
 
1203
 
 
1204
        /* These conditions are the caller's responsibility: */
 
1205
        assert(PyList_Check(path_hooks));
 
1206
        assert(PyDict_Check(path_importer_cache));
 
1207
 
 
1208
        nhooks = PyList_Size(path_hooks);
 
1209
        if (nhooks < 0)
 
1210
                return NULL; /* Shouldn't happen */
 
1211
 
 
1212
        importer = PyDict_GetItem(path_importer_cache, p);
 
1213
        if (importer != NULL)
 
1214
                return importer;
 
1215
 
 
1216
        /* set path_importer_cache[p] to None to avoid recursion */
 
1217
        if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
 
1218
                return NULL;
 
1219
 
 
1220
        for (j = 0; j < nhooks; j++) {
 
1221
                PyObject *hook = PyList_GetItem(path_hooks, j);
 
1222
                if (hook == NULL)
 
1223
                        return NULL;
 
1224
                importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
 
1225
                if (importer != NULL)
 
1226
                        break;
 
1227
 
 
1228
                if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
 
1229
                        return NULL;
 
1230
                }
 
1231
                PyErr_Clear();
 
1232
        }
 
1233
        if (importer == NULL) {
 
1234
                importer = PyObject_CallFunctionObjArgs(
 
1235
                        (PyObject *)&PyNullImporter_Type, p, NULL
 
1236
                );
 
1237
                if (importer == NULL) {
 
1238
                        if (PyErr_ExceptionMatches(PyExc_ImportError)) {
 
1239
                                PyErr_Clear();
 
1240
                                return Py_None;
 
1241
                        }
 
1242
                }
 
1243
        }
 
1244
        if (importer != NULL) {
 
1245
                int err = PyDict_SetItem(path_importer_cache, p, importer);
 
1246
                Py_DECREF(importer);
 
1247
                if (err != 0)
 
1248
                        return NULL;
 
1249
        }
 
1250
        return importer;
 
1251
}
 
1252
 
 
1253
PyAPI_FUNC(PyObject *)
 
1254
PyImport_GetImporter(PyObject *path) {
 
1255
        PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
 
1256
 
 
1257
        if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
 
1258
                if ((path_hooks = PySys_GetObject("path_hooks"))) {
 
1259
                        importer = get_path_importer(path_importer_cache,
 
1260
                                                     path_hooks, path);
 
1261
                }
 
1262
        }
 
1263
        Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
 
1264
        return importer;
 
1265
}
 
1266
 
 
1267
/* Search the path (default sys.path) for a module.  Return the
 
1268
   corresponding filedescr struct, and (via return arguments) the
 
1269
   pathname and an open file.  Return NULL if the module is not found. */
 
1270
 
 
1271
#ifdef MS_COREDLL
 
1272
extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
 
1273
                                        char *, Py_ssize_t);
 
1274
#endif
 
1275
 
 
1276
static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
 
1277
static int find_init_module(char *); /* Forward */
 
1278
static struct filedescr importhookdescr = {"", "", IMP_HOOK};
 
1279
 
 
1280
static struct filedescr *
 
1281
find_module(char *fullname, char *subname, PyObject *path, char *buf,
 
1282
            size_t buflen, FILE **p_fp, PyObject **p_loader)
 
1283
{
 
1284
        Py_ssize_t i, npath;
 
1285
        size_t len, namelen;
 
1286
        struct filedescr *fdp = NULL;
 
1287
        char *filemode;
 
1288
        FILE *fp = NULL;
 
1289
        PyObject *path_hooks, *path_importer_cache;
 
1290
        struct stat statbuf;
 
1291
        static struct filedescr fd_frozen = {"", "", PY_FROZEN};
 
1292
        static struct filedescr fd_builtin = {"", "", C_BUILTIN};
 
1293
        static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
 
1294
        char name[MAXPATHLEN+1];
 
1295
#if defined(PYOS_OS2)
 
1296
        size_t saved_len;
 
1297
        size_t saved_namelen;
 
1298
        char *saved_buf = NULL;
 
1299
#endif
 
1300
        if (p_loader != NULL)
 
1301
                *p_loader = NULL;
 
1302
 
 
1303
        if (strlen(subname) > MAXPATHLEN) {
 
1304
                PyErr_SetString(PyExc_OverflowError,
 
1305
                                "module name is too long");
 
1306
                return NULL;
 
1307
        }
 
1308
        strcpy(name, subname);
 
1309
 
 
1310
        /* sys.meta_path import hook */
 
1311
        if (p_loader != NULL) {
 
1312
                PyObject *meta_path;
 
1313
 
 
1314
                meta_path = PySys_GetObject("meta_path");
 
1315
                if (meta_path == NULL || !PyList_Check(meta_path)) {
 
1316
                        PyErr_SetString(PyExc_ImportError,
 
1317
                                        "sys.meta_path must be a list of "
 
1318
                                        "import hooks");
 
1319
                        return NULL;
 
1320
                }
 
1321
                Py_INCREF(meta_path);  /* zap guard */
 
1322
                npath = PyList_Size(meta_path);
 
1323
                for (i = 0; i < npath; i++) {
 
1324
                        PyObject *loader;
 
1325
                        PyObject *hook = PyList_GetItem(meta_path, i);
 
1326
                        loader = PyObject_CallMethod(hook, "find_module",
 
1327
                                                     "sO", fullname,
 
1328
                                                     path != NULL ?
 
1329
                                                     path : Py_None);
 
1330
                        if (loader == NULL) {
 
1331
                                Py_DECREF(meta_path);
 
1332
                                return NULL;  /* true error */
 
1333
                        }
 
1334
                        if (loader != Py_None) {
 
1335
                                /* a loader was found */
 
1336
                                *p_loader = loader;
 
1337
                                Py_DECREF(meta_path);
 
1338
                                return &importhookdescr;
 
1339
                        }
 
1340
                        Py_DECREF(loader);
 
1341
                }
 
1342
                Py_DECREF(meta_path);
 
1343
        }
 
1344
 
 
1345
        if (find_frozen(fullname) != NULL) {
 
1346
                strcpy(buf, fullname);
 
1347
                return &fd_frozen;
 
1348
        }
 
1349
 
 
1350
        if (path == NULL) {
 
1351
                if (is_builtin(name)) {
 
1352
                        strcpy(buf, name);
 
1353
                        return &fd_builtin;
 
1354
                }
 
1355
#ifdef MS_COREDLL
 
1356
                fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
 
1357
                if (fp != NULL) {
 
1358
                        *p_fp = fp;
 
1359
                        return fdp;
 
1360
                }
 
1361
#endif
 
1362
                path = PySys_GetObject("path");
 
1363
        }
 
1364
 
 
1365
        if (path == NULL || !PyList_Check(path)) {
 
1366
                PyErr_SetString(PyExc_ImportError,
 
1367
                                "sys.path must be a list of directory names");
 
1368
                return NULL;
 
1369
        }
 
1370
 
 
1371
        path_hooks = PySys_GetObject("path_hooks");
 
1372
        if (path_hooks == NULL || !PyList_Check(path_hooks)) {
 
1373
                PyErr_SetString(PyExc_ImportError,
 
1374
                                "sys.path_hooks must be a list of "
 
1375
                                "import hooks");
 
1376
                return NULL;
 
1377
        }
 
1378
        path_importer_cache = PySys_GetObject("path_importer_cache");
 
1379
        if (path_importer_cache == NULL ||
 
1380
            !PyDict_Check(path_importer_cache)) {
 
1381
                PyErr_SetString(PyExc_ImportError,
 
1382
                                "sys.path_importer_cache must be a dict");
 
1383
                return NULL;
 
1384
        }
 
1385
 
 
1386
        npath = PyList_Size(path);
 
1387
        namelen = strlen(name);
 
1388
        for (i = 0; i < npath; i++) {
 
1389
                PyObject *v = PyList_GetItem(path, i);
 
1390
                PyObject *origv = v;
 
1391
                const char *base;
 
1392
                Py_ssize_t size;
 
1393
                if (!v)
 
1394
                        return NULL;
 
1395
                if (PyUnicode_Check(v)) {
 
1396
                        v = PyUnicode_AsEncodedString(v, 
 
1397
                            Py_FileSystemDefaultEncoding, NULL);
 
1398
                        if (v == NULL)
 
1399
                                return NULL;
 
1400
                }
 
1401
                else if (!PyBytes_Check(v))
 
1402
                        continue;
 
1403
                else
 
1404
                        Py_INCREF(v);
 
1405
 
 
1406
                base = PyBytes_AS_STRING(v);
 
1407
                size = PyBytes_GET_SIZE(v);
 
1408
                len = size;
 
1409
                if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
 
1410
                        Py_DECREF(v);
 
1411
                        continue; /* Too long */
 
1412
                }
 
1413
                strcpy(buf, base);
 
1414
                Py_DECREF(v);
 
1415
 
 
1416
                if (strlen(buf) != len) {
 
1417
                        continue; /* v contains '\0' */
 
1418
                }
 
1419
 
 
1420
                /* sys.path_hooks import hook */
 
1421
                if (p_loader != NULL) {
 
1422
                        PyObject *importer;
 
1423
 
 
1424
                        importer = get_path_importer(path_importer_cache,
 
1425
                                                     path_hooks, origv);
 
1426
                        if (importer == NULL) {
 
1427
                                return NULL;
 
1428
                        }
 
1429
                        /* Note: importer is a borrowed reference */
 
1430
                        if (importer != Py_None) {
 
1431
                                PyObject *loader;
 
1432
                                loader = PyObject_CallMethod(importer,
 
1433
                                                             "find_module",
 
1434
                                                             "s", fullname);
 
1435
                                if (loader == NULL)
 
1436
                                        return NULL;  /* error */
 
1437
                                if (loader != Py_None) {
 
1438
                                        /* a loader was found */
 
1439
                                        *p_loader = loader;
 
1440
                                        return &importhookdescr;
 
1441
                                }
 
1442
                                Py_DECREF(loader);
 
1443
                                continue;
 
1444
                        }
 
1445
                }
 
1446
                /* no hook was found, use builtin import */
 
1447
 
 
1448
                if (len > 0 && buf[len-1] != SEP
 
1449
#ifdef ALTSEP
 
1450
                    && buf[len-1] != ALTSEP
 
1451
#endif
 
1452
                    )
 
1453
                        buf[len++] = SEP;
 
1454
                strcpy(buf+len, name);
 
1455
                len += namelen;
 
1456
 
 
1457
                /* Check for package import (buf holds a directory name,
 
1458
                   and there's an __init__ module in that directory */
 
1459
#ifdef HAVE_STAT
 
1460
                if (stat(buf, &statbuf) == 0 &&         /* it exists */
 
1461
                    S_ISDIR(statbuf.st_mode) &&         /* it's a directory */
 
1462
                    case_ok(buf, len, namelen, name)) { /* case matches */
 
1463
                        if (find_init_module(buf)) { /* and has __init__.py */
 
1464
                                return &fd_package;
 
1465
                        }
 
1466
                        else {
 
1467
                                char warnstr[MAXPATHLEN+80];
 
1468
                                sprintf(warnstr, "Not importing directory "
 
1469
                                        "'%.*s': missing __init__.py", 
 
1470
                                        MAXPATHLEN, buf);
 
1471
                                if (PyErr_WarnEx(PyExc_ImportWarning,
 
1472
                                                 warnstr, 1)) {
 
1473
                                        return NULL;
 
1474
                                }
 
1475
                        }
 
1476
                }
 
1477
#endif
 
1478
#if defined(PYOS_OS2)
 
1479
                /* take a snapshot of the module spec for restoration
 
1480
                 * after the 8 character DLL hackery
 
1481
                 */
 
1482
                saved_buf = strdup(buf);
 
1483
                saved_len = len;
 
1484
                saved_namelen = namelen;
 
1485
#endif /* PYOS_OS2 */
 
1486
                for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
 
1487
#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
 
1488
                        /* OS/2 limits DLLs to 8 character names (w/o
 
1489
                           extension)
 
1490
                         * so if the name is longer than that and its a
 
1491
                         * dynamically loaded module we're going to try,
 
1492
                         * truncate the name before trying
 
1493
                         */
 
1494
                        if (strlen(subname) > 8) {
 
1495
                                /* is this an attempt to load a C extension? */
 
1496
                                const struct filedescr *scan;
 
1497
                                scan = _PyImport_DynLoadFiletab;
 
1498
                                while (scan->suffix != NULL) {
 
1499
                                        if (!strcmp(scan->suffix, fdp->suffix))
 
1500
                                                break;
 
1501
                                        else
 
1502
                                                scan++;
 
1503
                                }
 
1504
                                if (scan->suffix != NULL) {
 
1505
                                        /* yes, so truncate the name */
 
1506
                                        namelen = 8;
 
1507
                                        len -= strlen(subname) - namelen;
 
1508
                                        buf[len] = '\0';
 
1509
                                }
 
1510
                        }
 
1511
#endif /* PYOS_OS2 */
 
1512
                        strcpy(buf+len, fdp->suffix);
 
1513
                        if (Py_VerboseFlag > 1)
 
1514
                                PySys_WriteStderr("# trying %s\n", buf);
 
1515
                        filemode = fdp->mode;
 
1516
                        if (filemode[0] == 'U')
 
1517
                                filemode = "r" PY_STDIOTEXTMODE;
 
1518
                        fp = fopen(buf, filemode);
 
1519
                        if (fp != NULL) {
 
1520
                                if (case_ok(buf, len, namelen, name))
 
1521
                                        break;
 
1522
                                else {   /* continue search */
 
1523
                                        fclose(fp);
 
1524
                                        fp = NULL;
 
1525
                                }
 
1526
                        }
 
1527
#if defined(PYOS_OS2)
 
1528
                        /* restore the saved snapshot */
 
1529
                        strcpy(buf, saved_buf);
 
1530
                        len = saved_len;
 
1531
                        namelen = saved_namelen;
 
1532
#endif
 
1533
                }
 
1534
#if defined(PYOS_OS2)
 
1535
                /* don't need/want the module name snapshot anymore */
 
1536
                if (saved_buf)
 
1537
                {
 
1538
                        free(saved_buf);
 
1539
                        saved_buf = NULL;
 
1540
                }
 
1541
#endif
 
1542
                if (fp != NULL)
 
1543
                        break;
 
1544
        }
 
1545
        if (fp == NULL) {
 
1546
                PyErr_Format(PyExc_ImportError,
 
1547
                             "No module named %.200s", name);
 
1548
                return NULL;
 
1549
        }
 
1550
        *p_fp = fp;
 
1551
        return fdp;
 
1552
}
 
1553
 
 
1554
/* Helpers for main.c
 
1555
 *  Find the source file corresponding to a named module
 
1556
 */
 
1557
struct filedescr *
 
1558
_PyImport_FindModule(const char *name, PyObject *path, char *buf,
 
1559
            size_t buflen, FILE **p_fp, PyObject **p_loader)
 
1560
{
 
1561
        return find_module((char *) name, (char *) name, path,
 
1562
                           buf, buflen, p_fp, p_loader);
 
1563
}
 
1564
 
 
1565
PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
 
1566
{
 
1567
        return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
 
1568
}
 
1569
 
 
1570
/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
 
1571
 * The arguments here are tricky, best shown by example:
 
1572
 *    /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
 
1573
 *    ^                      ^                   ^    ^
 
1574
 *    |--------------------- buf ---------------------|
 
1575
 *    |------------------- len ------------------|
 
1576
 *                           |------ name -------|
 
1577
 *                           |----- namelen -----|
 
1578
 * buf is the full path, but len only counts up to (& exclusive of) the
 
1579
 * extension.  name is the module name, also exclusive of extension.
 
1580
 *
 
1581
 * We've already done a successful stat() or fopen() on buf, so know that
 
1582
 * there's some match, possibly case-insensitive.
 
1583
 *
 
1584
 * case_ok() is to return 1 if there's a case-sensitive match for
 
1585
 * name, else 0.  case_ok() is also to return 1 if envar PYTHONCASEOK
 
1586
 * exists.
 
1587
 *
 
1588
 * case_ok() is used to implement case-sensitive import semantics even
 
1589
 * on platforms with case-insensitive filesystems.  It's trivial to implement
 
1590
 * for case-sensitive filesystems.  It's pretty much a cross-platform
 
1591
 * nightmare for systems with case-insensitive filesystems.
 
1592
 */
 
1593
 
 
1594
/* First we may need a pile of platform-specific header files; the sequence
 
1595
 * of #if's here should match the sequence in the body of case_ok().
 
1596
 */
 
1597
#if defined(MS_WINDOWS)
 
1598
#include <windows.h>
 
1599
 
 
1600
#elif defined(DJGPP)
 
1601
#include <dir.h>
 
1602
 
 
1603
#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
 
1604
#include <sys/types.h>
 
1605
#include <dirent.h>
 
1606
 
 
1607
#elif defined(PYOS_OS2)
 
1608
#define INCL_DOS
 
1609
#define INCL_DOSERRORS
 
1610
#define INCL_NOPMAPI
 
1611
#include <os2.h>
 
1612
#endif
 
1613
 
 
1614
static int
 
1615
case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
 
1616
{
 
1617
/* Pick a platform-specific implementation; the sequence of #if's here should
 
1618
 * match the sequence just above.
 
1619
 */
 
1620
 
 
1621
/* MS_WINDOWS */
 
1622
#if defined(MS_WINDOWS)
 
1623
        WIN32_FIND_DATA data;
 
1624
        HANDLE h;
 
1625
 
 
1626
        if (Py_GETENV("PYTHONCASEOK") != NULL)
 
1627
                return 1;
 
1628
 
 
1629
        h = FindFirstFile(buf, &data);
 
1630
        if (h == INVALID_HANDLE_VALUE) {
 
1631
                PyErr_Format(PyExc_NameError,
 
1632
                  "Can't find file for module %.100s\n(filename %.300s)",
 
1633
                  name, buf);
 
1634
                return 0;
 
1635
        }
 
1636
        FindClose(h);
 
1637
        return strncmp(data.cFileName, name, namelen) == 0;
 
1638
 
 
1639
/* DJGPP */
 
1640
#elif defined(DJGPP)
 
1641
        struct ffblk ffblk;
 
1642
        int done;
 
1643
 
 
1644
        if (Py_GETENV("PYTHONCASEOK") != NULL)
 
1645
                return 1;
 
1646
 
 
1647
        done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
 
1648
        if (done) {
 
1649
                PyErr_Format(PyExc_NameError,
 
1650
                  "Can't find file for module %.100s\n(filename %.300s)",
 
1651
                  name, buf);
 
1652
                return 0;
 
1653
        }
 
1654
        return strncmp(ffblk.ff_name, name, namelen) == 0;
 
1655
 
 
1656
/* new-fangled macintosh (macosx) or Cygwin */
 
1657
#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
 
1658
        DIR *dirp;
 
1659
        struct dirent *dp;
 
1660
        char dirname[MAXPATHLEN + 1];
 
1661
        const int dirlen = len - namelen - 1; /* don't want trailing SEP */
 
1662
 
 
1663
        if (Py_GETENV("PYTHONCASEOK") != NULL)
 
1664
                return 1;
 
1665
 
 
1666
        /* Copy the dir component into dirname; substitute "." if empty */
 
1667
        if (dirlen <= 0) {
 
1668
                dirname[0] = '.';
 
1669
                dirname[1] = '\0';
 
1670
        }
 
1671
        else {
 
1672
                assert(dirlen <= MAXPATHLEN);
 
1673
                memcpy(dirname, buf, dirlen);
 
1674
                dirname[dirlen] = '\0';
 
1675
        }
 
1676
        /* Open the directory and search the entries for an exact match. */
 
1677
        dirp = opendir(dirname);
 
1678
        if (dirp) {
 
1679
                char *nameWithExt = buf + len - namelen;
 
1680
                while ((dp = readdir(dirp)) != NULL) {
 
1681
                        const int thislen =
 
1682
#ifdef _DIRENT_HAVE_D_NAMELEN
 
1683
                                                dp->d_namlen;
 
1684
#else
 
1685
                                                strlen(dp->d_name);
 
1686
#endif
 
1687
                        if (thislen >= namelen &&
 
1688
                            strcmp(dp->d_name, nameWithExt) == 0) {
 
1689
                                (void)closedir(dirp);
 
1690
                                return 1; /* Found */
 
1691
                        }
 
1692
                }
 
1693
                (void)closedir(dirp);
 
1694
        }
 
1695
        return 0 ; /* Not found */
 
1696
 
 
1697
/* OS/2 */
 
1698
#elif defined(PYOS_OS2)
 
1699
        HDIR hdir = 1;
 
1700
        ULONG srchcnt = 1;
 
1701
        FILEFINDBUF3 ffbuf;
 
1702
        APIRET rc;
 
1703
 
 
1704
        if (Py_GETENV("PYTHONCASEOK") != NULL)
 
1705
                return 1;
 
1706
 
 
1707
        rc = DosFindFirst(buf,
 
1708
                          &hdir,
 
1709
                          FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
 
1710
                          &ffbuf, sizeof(ffbuf),
 
1711
                          &srchcnt,
 
1712
                          FIL_STANDARD);
 
1713
        if (rc != NO_ERROR)
 
1714
                return 0;
 
1715
        return strncmp(ffbuf.achName, name, namelen) == 0;
 
1716
 
 
1717
/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
 
1718
#else
 
1719
        return 1;
 
1720
 
 
1721
#endif
 
1722
}
 
1723
 
 
1724
 
 
1725
#ifdef HAVE_STAT
 
1726
/* Helper to look for __init__.py or __init__.py[co] in potential package */
 
1727
static int
 
1728
find_init_module(char *buf)
 
1729
{
 
1730
        const size_t save_len = strlen(buf);
 
1731
        size_t i = save_len;
 
1732
        char *pname;  /* pointer to start of __init__ */
 
1733
        struct stat statbuf;
 
1734
 
 
1735
/*      For calling case_ok(buf, len, namelen, name):
 
1736
 *      /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
 
1737
 *      ^                      ^                   ^    ^
 
1738
 *      |--------------------- buf ---------------------|
 
1739
 *      |------------------- len ------------------|
 
1740
 *                             |------ name -------|
 
1741
 *                             |----- namelen -----|
 
1742
 */
 
1743
        if (save_len + 13 >= MAXPATHLEN)
 
1744
                return 0;
 
1745
        buf[i++] = SEP;
 
1746
        pname = buf + i;
 
1747
        strcpy(pname, "__init__.py");
 
1748
        if (stat(buf, &statbuf) == 0) {
 
1749
                if (case_ok(buf,
 
1750
                            save_len + 9,       /* len("/__init__") */
 
1751
                            8,                  /* len("__init__") */
 
1752
                            pname)) {
 
1753
                        buf[save_len] = '\0';
 
1754
                        return 1;
 
1755
                }
 
1756
        }
 
1757
        i += strlen(pname);
 
1758
        strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
 
1759
        if (stat(buf, &statbuf) == 0) {
 
1760
                if (case_ok(buf,
 
1761
                            save_len + 9,       /* len("/__init__") */
 
1762
                            8,                  /* len("__init__") */
 
1763
                            pname)) {
 
1764
                        buf[save_len] = '\0';
 
1765
                        return 1;
 
1766
                }
 
1767
        }
 
1768
        buf[save_len] = '\0';
 
1769
        return 0;
 
1770
}
 
1771
 
 
1772
#endif /* HAVE_STAT */
 
1773
 
 
1774
 
 
1775
static int init_builtin(char *); /* Forward */
 
1776
 
 
1777
/* Load an external module using the default search path and return
 
1778
   its module object WITH INCREMENTED REFERENCE COUNT */
 
1779
 
 
1780
static PyObject *
 
1781
load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
 
1782
{
 
1783
        PyObject *modules;
 
1784
        PyObject *m;
 
1785
        int err;
 
1786
 
 
1787
        /* First check that there's an open file (if we need one)  */
 
1788
        switch (type) {
 
1789
        case PY_SOURCE:
 
1790
        case PY_COMPILED:
 
1791
                if (fp == NULL) {
 
1792
                        PyErr_Format(PyExc_ValueError,
 
1793
                           "file object required for import (type code %d)",
 
1794
                                     type);
 
1795
                        return NULL;
 
1796
                }
 
1797
        }
 
1798
 
 
1799
        switch (type) {
 
1800
 
 
1801
        case PY_SOURCE:
 
1802
                m = load_source_module(name, buf, fp);
 
1803
                break;
 
1804
 
 
1805
        case PY_COMPILED:
 
1806
                m = load_compiled_module(name, buf, fp);
 
1807
                break;
 
1808
 
 
1809
#ifdef HAVE_DYNAMIC_LOADING
 
1810
        case C_EXTENSION:
 
1811
                m = _PyImport_LoadDynamicModule(name, buf, fp);
 
1812
                break;
 
1813
#endif
 
1814
 
 
1815
        case PKG_DIRECTORY:
 
1816
                m = load_package(name, buf);
 
1817
                break;
 
1818
 
 
1819
        case C_BUILTIN:
 
1820
        case PY_FROZEN:
 
1821
                if (buf != NULL && buf[0] != '\0')
 
1822
                        name = buf;
 
1823
                if (type == C_BUILTIN)
 
1824
                        err = init_builtin(name);
 
1825
                else
 
1826
                        err = PyImport_ImportFrozenModule(name);
 
1827
                if (err < 0)
 
1828
                        return NULL;
 
1829
                if (err == 0) {
 
1830
                        PyErr_Format(PyExc_ImportError,
 
1831
                                     "Purported %s module %.200s not found",
 
1832
                                     type == C_BUILTIN ?
 
1833
                                                "builtin" : "frozen",
 
1834
                                     name);
 
1835
                        return NULL;
 
1836
                }
 
1837
                modules = PyImport_GetModuleDict();
 
1838
                m = PyDict_GetItemString(modules, name);
 
1839
                if (m == NULL) {
 
1840
                        PyErr_Format(
 
1841
                                PyExc_ImportError,
 
1842
                                "%s module %.200s not properly initialized",
 
1843
                                type == C_BUILTIN ?
 
1844
                                        "builtin" : "frozen",
 
1845
                                name);
 
1846
                        return NULL;
 
1847
                }
 
1848
                Py_INCREF(m);
 
1849
                break;
 
1850
 
 
1851
        case IMP_HOOK: {
 
1852
                if (loader == NULL) {
 
1853
                        PyErr_SetString(PyExc_ImportError,
 
1854
                                        "import hook without loader");
 
1855
                        return NULL;
 
1856
                }
 
1857
                m = PyObject_CallMethod(loader, "load_module", "s", name);
 
1858
                break;
 
1859
        }
 
1860
 
 
1861
        default:
 
1862
                PyErr_Format(PyExc_ImportError,
 
1863
                             "Don't know how to import %.200s (type code %d)",
 
1864
                              name, type);
 
1865
                m = NULL;
 
1866
 
 
1867
        }
 
1868
 
 
1869
        return m;
 
1870
}
 
1871
 
 
1872
 
 
1873
/* Initialize a built-in module.
 
1874
   Return 1 for success, 0 if the module is not found, and -1 with
 
1875
   an exception set if the initialization failed. */
 
1876
 
 
1877
static int
 
1878
init_builtin(char *name)
 
1879
{
 
1880
        struct _inittab *p;
 
1881
 
 
1882
        if (_PyImport_FindExtension(name, name) != NULL)
 
1883
                return 1;
 
1884
 
 
1885
        for (p = PyImport_Inittab; p->name != NULL; p++) {
 
1886
                PyObject *mod;
 
1887
                if (strcmp(name, p->name) == 0) {
 
1888
                        if (p->initfunc == NULL) {
 
1889
                                PyErr_Format(PyExc_ImportError,
 
1890
                                    "Cannot re-init internal module %.200s",
 
1891
                                    name);
 
1892
                                return -1;
 
1893
                        }
 
1894
                        if (Py_VerboseFlag)
 
1895
                                PySys_WriteStderr("import %s # builtin\n", name);
 
1896
                        mod = (*p->initfunc)();
 
1897
                        if (mod == 0)
 
1898
                                return -1;
 
1899
                        if (_PyImport_FixupExtension(mod, name, name) < 0)
 
1900
                                return -1;
 
1901
                        /* FixupExtension has put the module into sys.modules,
 
1902
                           so we can release our own reference. */
 
1903
                        Py_DECREF(mod);
 
1904
                        return 1;
 
1905
                }
 
1906
        }
 
1907
        return 0;
 
1908
}
 
1909
 
 
1910
 
 
1911
/* Frozen modules */
 
1912
 
 
1913
static struct _frozen *
 
1914
find_frozen(char *name)
 
1915
{
 
1916
        struct _frozen *p;
 
1917
 
 
1918
        if (!name)
 
1919
                return NULL;
 
1920
 
 
1921
        for (p = PyImport_FrozenModules; ; p++) {
 
1922
                if (p->name == NULL)
 
1923
                        return NULL;
 
1924
                if (strcmp(p->name, name) == 0)
 
1925
                        break;
 
1926
        }
 
1927
        return p;
 
1928
}
 
1929
 
 
1930
static PyObject *
 
1931
get_frozen_object(char *name)
 
1932
{
 
1933
        struct _frozen *p = find_frozen(name);
 
1934
        int size;
 
1935
 
 
1936
        if (p == NULL) {
 
1937
                PyErr_Format(PyExc_ImportError,
 
1938
                             "No such frozen object named %.200s",
 
1939
                             name);
 
1940
                return NULL;
 
1941
        }
 
1942
        if (p->code == NULL) {
 
1943
                PyErr_Format(PyExc_ImportError,
 
1944
                             "Excluded frozen object named %.200s",
 
1945
                             name);
 
1946
                return NULL;
 
1947
        }
 
1948
        size = p->size;
 
1949
        if (size < 0)
 
1950
                size = -size;
 
1951
        return PyMarshal_ReadObjectFromString((char *)p->code, size);
 
1952
}
 
1953
 
 
1954
static PyObject *
 
1955
is_frozen_package(char *name)
 
1956
{
 
1957
        struct _frozen *p = find_frozen(name);
 
1958
        int size;
 
1959
 
 
1960
        if (p == NULL) {
 
1961
                PyErr_Format(PyExc_ImportError,
 
1962
                             "No such frozen object named %.200s",
 
1963
                             name);
 
1964
                return NULL;
 
1965
        }
 
1966
 
 
1967
        size = p->size;
 
1968
 
 
1969
        if (size < 0)
 
1970
                Py_RETURN_TRUE;
 
1971
        else
 
1972
                Py_RETURN_FALSE;
 
1973
}
 
1974
 
 
1975
 
 
1976
/* Initialize a frozen module.
 
1977
   Return 1 for success, 0 if the module is not found, and -1 with
 
1978
   an exception set if the initialization failed.
 
1979
   This function is also used from frozenmain.c */
 
1980
 
 
1981
int
 
1982
PyImport_ImportFrozenModule(char *name)
 
1983
{
 
1984
        struct _frozen *p = find_frozen(name);
 
1985
        PyObject *co;
 
1986
        PyObject *m;
 
1987
        int ispackage;
 
1988
        int size;
 
1989
 
 
1990
        if (p == NULL)
 
1991
                return 0;
 
1992
        if (p->code == NULL) {
 
1993
                PyErr_Format(PyExc_ImportError,
 
1994
                             "Excluded frozen object named %.200s",
 
1995
                             name);
 
1996
                return -1;
 
1997
        }
 
1998
        size = p->size;
 
1999
        ispackage = (size < 0);
 
2000
        if (ispackage)
 
2001
                size = -size;
 
2002
        if (Py_VerboseFlag)
 
2003
                PySys_WriteStderr("import %s # frozen%s\n",
 
2004
                        name, ispackage ? " package" : "");
 
2005
        co = PyMarshal_ReadObjectFromString((char *)p->code, size);
 
2006
        if (co == NULL)
 
2007
                return -1;
 
2008
        if (!PyCode_Check(co)) {
 
2009
                PyErr_Format(PyExc_TypeError,
 
2010
                             "frozen object %.200s is not a code object",
 
2011
                             name);
 
2012
                goto err_return;
 
2013
        }
 
2014
        if (ispackage) {
 
2015
                /* Set __path__ to the package name */
 
2016
                PyObject *d, *s, *l;
 
2017
                int err;
 
2018
                m = PyImport_AddModule(name);
 
2019
                if (m == NULL)
 
2020
                        goto err_return;
 
2021
                d = PyModule_GetDict(m);
 
2022
                s = PyUnicode_InternFromString(name);
 
2023
                if (s == NULL)
 
2024
                        goto err_return;
 
2025
                l = PyList_New(1);
 
2026
                if (l == NULL) {
 
2027
                        Py_DECREF(s);
 
2028
                        goto err_return;
 
2029
                }
 
2030
                PyList_SET_ITEM(l, 0, s);
 
2031
                err = PyDict_SetItemString(d, "__path__", l);
 
2032
                Py_DECREF(l);
 
2033
                if (err != 0)
 
2034
                        goto err_return;
 
2035
        }
 
2036
        m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
 
2037
        if (m == NULL)
 
2038
                goto err_return;
 
2039
        Py_DECREF(co);
 
2040
        Py_DECREF(m);
 
2041
        return 1;
 
2042
err_return:
 
2043
        Py_DECREF(co);
 
2044
        return -1;
 
2045
}
 
2046
 
 
2047
 
 
2048
/* Import a module, either built-in, frozen, or external, and return
 
2049
   its module object WITH INCREMENTED REFERENCE COUNT */
 
2050
 
 
2051
PyObject *
 
2052
PyImport_ImportModule(const char *name)
 
2053
{
 
2054
        PyObject *pname;
 
2055
        PyObject *result;
 
2056
 
 
2057
        pname = PyUnicode_FromString(name);
 
2058
        if (pname == NULL)
 
2059
                return NULL;
 
2060
        result = PyImport_Import(pname);
 
2061
        Py_DECREF(pname);
 
2062
        return result;
 
2063
}
 
2064
 
 
2065
/* Import a module without blocking
 
2066
 *
 
2067
 * At first it tries to fetch the module from sys.modules. If the module was
 
2068
 * never loaded before it loads it with PyImport_ImportModule() unless another
 
2069
 * thread holds the import lock. In the latter case the function raises an
 
2070
 * ImportError instead of blocking.
 
2071
 *
 
2072
 * Returns the module object with incremented ref count.
 
2073
 */
 
2074
PyObject *
 
2075
PyImport_ImportModuleNoBlock(const char *name)
 
2076
{
 
2077
        PyObject *result;
 
2078
        PyObject *modules;
 
2079
        long me;
 
2080
 
 
2081
        /* Try to get the module from sys.modules[name] */
 
2082
        modules = PyImport_GetModuleDict();
 
2083
        if (modules == NULL)
 
2084
                return NULL;
 
2085
 
 
2086
        result = PyDict_GetItemString(modules, name);
 
2087
        if (result != NULL) {
 
2088
                Py_INCREF(result);
 
2089
                return result;
 
2090
        }
 
2091
        else {
 
2092
                PyErr_Clear();
 
2093
        }
 
2094
#ifdef WITH_THREAD
 
2095
        /* check the import lock
 
2096
         * me might be -1 but I ignore the error here, the lock function
 
2097
         * takes care of the problem */
 
2098
        me = PyThread_get_thread_ident();
 
2099
        if (import_lock_thread == -1 || import_lock_thread == me) {
 
2100
                /* no thread or me is holding the lock */
 
2101
                return PyImport_ImportModule(name);
 
2102
        }
 
2103
        else {
 
2104
                PyErr_Format(PyExc_ImportError,
 
2105
                             "Failed to import %.200s because the import lock"
 
2106
                             "is held by another thread.",
 
2107
                             name);
 
2108
                return NULL;
 
2109
        }
 
2110
#else
 
2111
        return PyImport_ImportModule(name);
 
2112
#endif
 
2113
}
 
2114
 
 
2115
/* Forward declarations for helper routines */
 
2116
static PyObject *get_parent(PyObject *globals, char *buf,
 
2117
                            Py_ssize_t *p_buflen, int level);
 
2118
static PyObject *load_next(PyObject *mod, PyObject *altmod,
 
2119
                           char **p_name, char *buf, Py_ssize_t *p_buflen);
 
2120
static int mark_miss(char *name);
 
2121
static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
 
2122
                           char *buf, Py_ssize_t buflen, int recursive);
 
2123
static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
 
2124
 
 
2125
/* The Magnum Opus of dotted-name import :-) */
 
2126
 
 
2127
static PyObject *
 
2128
import_module_level(char *name, PyObject *globals, PyObject *locals,
 
2129
                    PyObject *fromlist, int level)
 
2130
{
 
2131
        char buf[MAXPATHLEN+1];
 
2132
        Py_ssize_t buflen = 0;
 
2133
        PyObject *parent, *head, *next, *tail;
 
2134
 
 
2135
        if (strchr(name, '/') != NULL
 
2136
#ifdef MS_WINDOWS
 
2137
            || strchr(name, '\\') != NULL
 
2138
#endif
 
2139
                ) {
 
2140
                PyErr_SetString(PyExc_ImportError,
 
2141
                                "Import by filename is not supported.");
 
2142
                return NULL;
 
2143
        }
 
2144
 
 
2145
        parent = get_parent(globals, buf, &buflen, level);
 
2146
        if (parent == NULL)
 
2147
                return NULL;
 
2148
 
 
2149
        head = load_next(parent, Py_None, &name, buf, &buflen);
 
2150
        if (head == NULL)
 
2151
                return NULL;
 
2152
 
 
2153
        tail = head;
 
2154
        Py_INCREF(tail);
 
2155
        while (name) {
 
2156
                next = load_next(tail, tail, &name, buf, &buflen);
 
2157
                Py_DECREF(tail);
 
2158
                if (next == NULL) {
 
2159
                        Py_DECREF(head);
 
2160
                        return NULL;
 
2161
                }
 
2162
                tail = next;
 
2163
        }
 
2164
        if (tail == Py_None) {
 
2165
                /* If tail is Py_None, both get_parent and load_next found
 
2166
                   an empty module name: someone called __import__("") or
 
2167
                   doctored faulty bytecode */
 
2168
                Py_DECREF(tail);
 
2169
                Py_DECREF(head);
 
2170
                PyErr_SetString(PyExc_ValueError,
 
2171
                                "Empty module name");
 
2172
                return NULL;
 
2173
        }
 
2174
 
 
2175
        if (fromlist != NULL) {
 
2176
                if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
 
2177
                        fromlist = NULL;
 
2178
        }
 
2179
 
 
2180
        if (fromlist == NULL) {
 
2181
                Py_DECREF(tail);
 
2182
                return head;
 
2183
        }
 
2184
 
 
2185
        Py_DECREF(head);
 
2186
        if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
 
2187
                Py_DECREF(tail);
 
2188
                return NULL;
 
2189
        }
 
2190
 
 
2191
        return tail;
 
2192
}
 
2193
 
 
2194
PyObject *
 
2195
PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
 
2196
                         PyObject *fromlist, int level)
 
2197
{
 
2198
        PyObject *result;
 
2199
        lock_import();
 
2200
        result = import_module_level(name, globals, locals, fromlist, level);
 
2201
        if (unlock_import() < 0) {
 
2202
                Py_XDECREF(result);
 
2203
                PyErr_SetString(PyExc_RuntimeError,
 
2204
                                "not holding the import lock");
 
2205
                return NULL;
 
2206
        }
 
2207
        return result;
 
2208
}
 
2209
 
 
2210
/* Return the package that an import is being performed in.  If globals comes
 
2211
   from the module foo.bar.bat (not itself a package), this returns the
 
2212
   sys.modules entry for foo.bar.  If globals is from a package's __init__.py,
 
2213
   the package's entry in sys.modules is returned, as a borrowed reference.
 
2214
 
 
2215
   The *name* of the returned package is returned in buf, with the length of
 
2216
   the name in *p_buflen.
 
2217
 
 
2218
   If globals doesn't come from a package or a module in a package, or a
 
2219
   corresponding entry is not found in sys.modules, Py_None is returned.
 
2220
*/
 
2221
static PyObject *
 
2222
get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
 
2223
{
 
2224
        static PyObject *namestr = NULL;
 
2225
        static PyObject *pathstr = NULL;
 
2226
        static PyObject *pkgstr = NULL;
 
2227
        PyObject *pkgname, *modname, *modpath, *modules, *parent;
 
2228
        int orig_level = level;
 
2229
 
 
2230
        if (globals == NULL || !PyDict_Check(globals) || !level)
 
2231
                return Py_None;
 
2232
 
 
2233
        if (namestr == NULL) {
 
2234
                namestr = PyUnicode_InternFromString("__name__");
 
2235
                if (namestr == NULL)
 
2236
                        return NULL;
 
2237
        }
 
2238
        if (pathstr == NULL) {
 
2239
                pathstr = PyUnicode_InternFromString("__path__");
 
2240
                if (pathstr == NULL)
 
2241
                        return NULL;
 
2242
        }
 
2243
        if (pkgstr == NULL) {
 
2244
                pkgstr = PyUnicode_InternFromString("__package__");
 
2245
                if (pkgstr == NULL)
 
2246
                        return NULL;
 
2247
        }
 
2248
 
 
2249
        *buf = '\0';
 
2250
        *p_buflen = 0;
 
2251
        pkgname = PyDict_GetItem(globals, pkgstr);
 
2252
 
 
2253
        if ((pkgname != NULL) && (pkgname != Py_None)) {
 
2254
                /* __package__ is set, so use it */
 
2255
                char *pkgname_str;
 
2256
                Py_ssize_t len;
 
2257
 
 
2258
                if (!PyUnicode_Check(pkgname)) {
 
2259
                        PyErr_SetString(PyExc_ValueError,
 
2260
                                        "__package__ set to non-string");
 
2261
                        return NULL;
 
2262
                }
 
2263
                pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
 
2264
                if (len == 0) {
 
2265
                        if (level > 0) {
 
2266
                                PyErr_SetString(PyExc_ValueError,
 
2267
                                        "Attempted relative import in non-package");
 
2268
                                return NULL;
 
2269
                        }
 
2270
                        return Py_None;
 
2271
                }
 
2272
                if (len > MAXPATHLEN) {
 
2273
                        PyErr_SetString(PyExc_ValueError,
 
2274
                                        "Package name too long");
 
2275
                        return NULL;
 
2276
                }
 
2277
                strcpy(buf, pkgname_str);
 
2278
        } else {
 
2279
                /* __package__ not set, so figure it out and set it */
 
2280
                modname = PyDict_GetItem(globals, namestr);
 
2281
                if (modname == NULL || !PyUnicode_Check(modname))
 
2282
                        return Py_None;
 
2283
        
 
2284
                modpath = PyDict_GetItem(globals, pathstr);
 
2285
                if (modpath != NULL) {
 
2286
                        /* __path__ is set, so modname is already the package name */
 
2287
                        char *modname_str;
 
2288
                        Py_ssize_t len;
 
2289
                        int error;
 
2290
 
 
2291
                        modname_str = _PyUnicode_AsStringAndSize(modname, &len);
 
2292
                        if (len > MAXPATHLEN) {
 
2293
                                PyErr_SetString(PyExc_ValueError,
 
2294
                                                "Module name too long");
 
2295
                                return NULL;
 
2296
                        }
 
2297
                        strcpy(buf, modname_str);
 
2298
                        error = PyDict_SetItem(globals, pkgstr, modname);
 
2299
                        if (error) {
 
2300
                                PyErr_SetString(PyExc_ValueError,
 
2301
                                                "Could not set __package__");
 
2302
                                return NULL;
 
2303
                        }
 
2304
                } else {
 
2305
                        /* Normal module, so work out the package name if any */
 
2306
                        char *start = _PyUnicode_AsString(modname);
 
2307
                        char *lastdot = strrchr(start, '.');
 
2308
                        size_t len;
 
2309
                        int error;
 
2310
                        if (lastdot == NULL && level > 0) {
 
2311
                                PyErr_SetString(PyExc_ValueError,
 
2312
                                        "Attempted relative import in non-package");
 
2313
                                return NULL;
 
2314
                        }
 
2315
                        if (lastdot == NULL) {
 
2316
                                error = PyDict_SetItem(globals, pkgstr, Py_None);
 
2317
                                if (error) {
 
2318
                                        PyErr_SetString(PyExc_ValueError,
 
2319
                                                "Could not set __package__");
 
2320
                                        return NULL;
 
2321
                                }
 
2322
                                return Py_None;
 
2323
                        }
 
2324
                        len = lastdot - start;
 
2325
                        if (len >= MAXPATHLEN) {
 
2326
                                PyErr_SetString(PyExc_ValueError,
 
2327
                                                "Module name too long");
 
2328
                                return NULL;
 
2329
                        }
 
2330
                        strncpy(buf, start, len);
 
2331
                        buf[len] = '\0';
 
2332
                        pkgname = PyUnicode_FromString(buf);
 
2333
                        if (pkgname == NULL) {
 
2334
                                return NULL;
 
2335
                        }
 
2336
                        error = PyDict_SetItem(globals, pkgstr, pkgname);
 
2337
                        Py_DECREF(pkgname);
 
2338
                        if (error) {
 
2339
                                PyErr_SetString(PyExc_ValueError,
 
2340
                                                "Could not set __package__");
 
2341
                                return NULL;
 
2342
                        }
 
2343
                }
 
2344
        }
 
2345
        while (--level > 0) {
 
2346
                char *dot = strrchr(buf, '.');
 
2347
                if (dot == NULL) {
 
2348
                        PyErr_SetString(PyExc_ValueError,
 
2349
                                "Attempted relative import beyond "
 
2350
                                "toplevel package");
 
2351
                        return NULL;
 
2352
                }
 
2353
                *dot = '\0';
 
2354
        }
 
2355
        *p_buflen = strlen(buf);
 
2356
 
 
2357
        modules = PyImport_GetModuleDict();
 
2358
        parent = PyDict_GetItemString(modules, buf);
 
2359
        if (parent == NULL) {
 
2360
                if (orig_level < 1) {
 
2361
                        PyObject *err_msg = PyBytes_FromFormat(
 
2362
                                "Parent module '%.200s' not found "
 
2363
                                "while handling absolute import", buf);
 
2364
                        if (err_msg == NULL) {
 
2365
                                return NULL;
 
2366
                        }
 
2367
                        if (!PyErr_WarnEx(PyExc_RuntimeWarning,
 
2368
                                          PyBytes_AsString(err_msg), 1)) {
 
2369
                                *buf = '\0';
 
2370
                                *p_buflen = 0;
 
2371
                                parent = Py_None;
 
2372
                        }
 
2373
                        Py_DECREF(err_msg);
 
2374
                } else {
 
2375
                        PyErr_Format(PyExc_SystemError,
 
2376
                                "Parent module '%.200s' not loaded, "
 
2377
                                "cannot perform relative import", buf);
 
2378
                }
 
2379
        }
 
2380
        return parent;
 
2381
        /* We expect, but can't guarantee, if parent != None, that:
 
2382
           - parent.__name__ == buf
 
2383
           - parent.__dict__ is globals
 
2384
           If this is violated...  Who cares? */
 
2385
}
 
2386
 
 
2387
/* altmod is either None or same as mod */
 
2388
static PyObject *
 
2389
load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
 
2390
          Py_ssize_t *p_buflen)
 
2391
{
 
2392
        char *name = *p_name;
 
2393
        char *dot = strchr(name, '.');
 
2394
        size_t len;
 
2395
        char *p;
 
2396
        PyObject *result;
 
2397
 
 
2398
        if (strlen(name) == 0) {
 
2399
                /* completely empty module name should only happen in
 
2400
                   'from . import' (or '__import__("")')*/
 
2401
                Py_INCREF(mod);
 
2402
                *p_name = NULL;
 
2403
                return mod;
 
2404
        }
 
2405
 
 
2406
        if (dot == NULL) {
 
2407
                *p_name = NULL;
 
2408
                len = strlen(name);
 
2409
        }
 
2410
        else {
 
2411
                *p_name = dot+1;
 
2412
                len = dot-name;
 
2413
        }
 
2414
        if (len == 0) {
 
2415
                PyErr_SetString(PyExc_ValueError,
 
2416
                                "Empty module name");
 
2417
                return NULL;
 
2418
        }
 
2419
 
 
2420
        p = buf + *p_buflen;
 
2421
        if (p != buf)
 
2422
                *p++ = '.';
 
2423
        if (p+len-buf >= MAXPATHLEN) {
 
2424
                PyErr_SetString(PyExc_ValueError,
 
2425
                                "Module name too long");
 
2426
                return NULL;
 
2427
        }
 
2428
        strncpy(p, name, len);
 
2429
        p[len] = '\0';
 
2430
        *p_buflen = p+len-buf;
 
2431
 
 
2432
        result = import_submodule(mod, p, buf);
 
2433
        if (result == Py_None && altmod != mod) {
 
2434
                Py_DECREF(result);
 
2435
                /* Here, altmod must be None and mod must not be None */
 
2436
                result = import_submodule(altmod, p, p);
 
2437
                if (result != NULL && result != Py_None) {
 
2438
                        if (mark_miss(buf) != 0) {
 
2439
                                Py_DECREF(result);
 
2440
                                return NULL;
 
2441
                        }
 
2442
                        strncpy(buf, name, len);
 
2443
                        buf[len] = '\0';
 
2444
                        *p_buflen = len;
 
2445
                }
 
2446
        }
 
2447
        if (result == NULL)
 
2448
                return NULL;
 
2449
 
 
2450
        if (result == Py_None) {
 
2451
                Py_DECREF(result);
 
2452
                PyErr_Format(PyExc_ImportError,
 
2453
                             "No module named %.200s", name);
 
2454
                return NULL;
 
2455
        }
 
2456
 
 
2457
        return result;
 
2458
}
 
2459
 
 
2460
static int
 
2461
mark_miss(char *name)
 
2462
{
 
2463
        PyObject *modules = PyImport_GetModuleDict();
 
2464
        return PyDict_SetItemString(modules, name, Py_None);
 
2465
}
 
2466
 
 
2467
static int
 
2468
ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
 
2469
                int recursive)
 
2470
{
 
2471
        int i;
 
2472
 
 
2473
        if (!PyObject_HasAttrString(mod, "__path__"))
 
2474
                return 1;
 
2475
 
 
2476
        for (i = 0; ; i++) {
 
2477
                PyObject *item = PySequence_GetItem(fromlist, i);
 
2478
                int hasit;
 
2479
                if (item == NULL) {
 
2480
                        if (PyErr_ExceptionMatches(PyExc_IndexError)) {
 
2481
                                PyErr_Clear();
 
2482
                                return 1;
 
2483
                        }
 
2484
                        return 0;
 
2485
                }
 
2486
                if (!PyUnicode_Check(item)) {
 
2487
                        PyErr_SetString(PyExc_TypeError,
 
2488
                                        "Item in ``from list'' not a string");
 
2489
                        Py_DECREF(item);
 
2490
                        return 0;
 
2491
                }
 
2492
                if (PyUnicode_AS_UNICODE(item)[0] == '*') {
 
2493
                        PyObject *all;
 
2494
                        Py_DECREF(item);
 
2495
                        /* See if the package defines __all__ */
 
2496
                        if (recursive)
 
2497
                                continue; /* Avoid endless recursion */
 
2498
                        all = PyObject_GetAttrString(mod, "__all__");
 
2499
                        if (all == NULL)
 
2500
                                PyErr_Clear();
 
2501
                        else {
 
2502
                                int ret = ensure_fromlist(mod, all, buf, buflen, 1);
 
2503
                                Py_DECREF(all);
 
2504
                                if (!ret)
 
2505
                                        return 0;
 
2506
                        }
 
2507
                        continue;
 
2508
                }
 
2509
                hasit = PyObject_HasAttr(mod, item);
 
2510
                if (!hasit) {
 
2511
                        PyObject *item8;
 
2512
                        char *subname;
 
2513
                        PyObject *submod;
 
2514
                        char *p;
 
2515
                        if (!Py_FileSystemDefaultEncoding) {
 
2516
                                item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
 
2517
                                                              PyUnicode_GetSize(item),
 
2518
                                                              NULL);
 
2519
                        } else {
 
2520
                                item8 = PyUnicode_AsEncodedString(item,
 
2521
                                        Py_FileSystemDefaultEncoding, NULL);
 
2522
                        }
 
2523
                        if (!item8) {
 
2524
                                PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
 
2525
                                return 0;
 
2526
                        }
 
2527
                        subname = PyBytes_AS_STRING(item8);
 
2528
                        if (buflen + strlen(subname) >= MAXPATHLEN) {
 
2529
                                PyErr_SetString(PyExc_ValueError,
 
2530
                                                "Module name too long");
 
2531
                                Py_DECREF(item);
 
2532
                                return 0;
 
2533
                        }
 
2534
                        p = buf + buflen;
 
2535
                        *p++ = '.';
 
2536
                        strcpy(p, subname);
 
2537
                        submod = import_submodule(mod, subname, buf);
 
2538
                        Py_DECREF(item8);
 
2539
                        Py_XDECREF(submod);
 
2540
                        if (submod == NULL) {
 
2541
                                Py_DECREF(item);
 
2542
                                return 0;
 
2543
                        }
 
2544
                }
 
2545
                Py_DECREF(item);
 
2546
        }
 
2547
 
 
2548
        /* NOTREACHED */
 
2549
}
 
2550
 
 
2551
static int
 
2552
add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
 
2553
              PyObject *modules)
 
2554
{
 
2555
        if (mod == Py_None)
 
2556
                return 1;
 
2557
        /* Irrespective of the success of this load, make a
 
2558
           reference to it in the parent package module.  A copy gets
 
2559
           saved in the modules dictionary under the full name, so get a
 
2560
           reference from there, if need be.  (The exception is when the
 
2561
           load failed with a SyntaxError -- then there's no trace in
 
2562
           sys.modules.  In that case, of course, do nothing extra.) */
 
2563
        if (submod == NULL) {
 
2564
                submod = PyDict_GetItemString(modules, fullname);
 
2565
                if (submod == NULL)
 
2566
                        return 1;
 
2567
        }
 
2568
        if (PyModule_Check(mod)) {
 
2569
                /* We can't use setattr here since it can give a
 
2570
                 * spurious warning if the submodule name shadows a
 
2571
                 * builtin name */
 
2572
                PyObject *dict = PyModule_GetDict(mod);
 
2573
                if (!dict)
 
2574
                        return 0;
 
2575
                if (PyDict_SetItemString(dict, subname, submod) < 0)
 
2576
                        return 0;
 
2577
        }
 
2578
        else {
 
2579
                if (PyObject_SetAttrString(mod, subname, submod) < 0)
 
2580
                        return 0;
 
2581
        }
 
2582
        return 1;
 
2583
}
 
2584
 
 
2585
static PyObject *
 
2586
import_submodule(PyObject *mod, char *subname, char *fullname)
 
2587
{
 
2588
        PyObject *modules = PyImport_GetModuleDict();
 
2589
        PyObject *m = NULL;
 
2590
 
 
2591
        /* Require:
 
2592
           if mod == None: subname == fullname
 
2593
           else: mod.__name__ + "." + subname == fullname
 
2594
        */
 
2595
 
 
2596
        if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
 
2597
                Py_INCREF(m);
 
2598
        }
 
2599
        else {
 
2600
                PyObject *path, *loader = NULL;
 
2601
                char buf[MAXPATHLEN+1];
 
2602
                struct filedescr *fdp;
 
2603
                FILE *fp = NULL;
 
2604
 
 
2605
                if (mod == Py_None)
 
2606
                        path = NULL;
 
2607
                else {
 
2608
                        path = PyObject_GetAttrString(mod, "__path__");
 
2609
                        if (path == NULL) {
 
2610
                                PyErr_Clear();
 
2611
                                Py_INCREF(Py_None);
 
2612
                                return Py_None;
 
2613
                        }
 
2614
                }
 
2615
 
 
2616
                buf[0] = '\0';
 
2617
                fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
 
2618
                                  &fp, &loader);
 
2619
                Py_XDECREF(path);
 
2620
                if (fdp == NULL) {
 
2621
                        if (!PyErr_ExceptionMatches(PyExc_ImportError))
 
2622
                                return NULL;
 
2623
                        PyErr_Clear();
 
2624
                        Py_INCREF(Py_None);
 
2625
                        return Py_None;
 
2626
                }
 
2627
                m = load_module(fullname, fp, buf, fdp->type, loader);
 
2628
                Py_XDECREF(loader);
 
2629
                if (fp)
 
2630
                        fclose(fp);
 
2631
                if (!add_submodule(mod, m, fullname, subname, modules)) {
 
2632
                        Py_XDECREF(m);
 
2633
                        m = NULL;
 
2634
                }
 
2635
        }
 
2636
 
 
2637
        return m;
 
2638
}
 
2639
 
 
2640
 
 
2641
/* Re-import a module of any kind and return its module object, WITH
 
2642
   INCREMENTED REFERENCE COUNT */
 
2643
 
 
2644
PyObject *
 
2645
PyImport_ReloadModule(PyObject *m)
 
2646
{
 
2647
        PyInterpreterState *interp = PyThreadState_Get()->interp;
 
2648
        PyObject *modules_reloading = interp->modules_reloading;
 
2649
        PyObject *modules = PyImport_GetModuleDict();
 
2650
        PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
 
2651
        char *name, *subname;
 
2652
        char buf[MAXPATHLEN+1];
 
2653
        struct filedescr *fdp;
 
2654
        FILE *fp = NULL;
 
2655
        PyObject *newm;
 
2656
    
 
2657
        if (modules_reloading == NULL) {
 
2658
                Py_FatalError("PyImport_ReloadModule: "
 
2659
                              "no modules_reloading dictionary!");
 
2660
                return NULL;
 
2661
        }
 
2662
 
 
2663
        if (m == NULL || !PyModule_Check(m)) {
 
2664
                PyErr_SetString(PyExc_TypeError,
 
2665
                                "reload() argument must be module");
 
2666
                return NULL;
 
2667
        }
 
2668
        name = (char*)PyModule_GetName(m);
 
2669
        if (name == NULL)
 
2670
                return NULL;
 
2671
        if (m != PyDict_GetItemString(modules, name)) {
 
2672
                PyErr_Format(PyExc_ImportError,
 
2673
                             "reload(): module %.200s not in sys.modules",
 
2674
                             name);
 
2675
                return NULL;
 
2676
        }
 
2677
        existing_m = PyDict_GetItemString(modules_reloading, name);
 
2678
        if (existing_m != NULL) {
 
2679
                /* Due to a recursive reload, this module is already
 
2680
                   being reloaded. */
 
2681
                Py_INCREF(existing_m);
 
2682
                return existing_m;
 
2683
        }
 
2684
        if (PyDict_SetItemString(modules_reloading, name, m) < 0)
 
2685
                return NULL;
 
2686
 
 
2687
        subname = strrchr(name, '.');
 
2688
        if (subname == NULL)
 
2689
                subname = name;
 
2690
        else {
 
2691
                PyObject *parentname, *parent;
 
2692
                parentname = PyUnicode_FromStringAndSize(name, (subname-name));
 
2693
                if (parentname == NULL) {
 
2694
                        imp_modules_reloading_clear();
 
2695
                        return NULL;
 
2696
                }
 
2697
                parent = PyDict_GetItem(modules, parentname);
 
2698
                if (parent == NULL) {
 
2699
                        PyErr_Format(PyExc_ImportError,
 
2700
                            "reload(): parent %.200s not in sys.modules",
 
2701
                             _PyUnicode_AsString(parentname));
 
2702
                        Py_DECREF(parentname);
 
2703
                        imp_modules_reloading_clear();
 
2704
                        return NULL;
 
2705
                }
 
2706
                Py_DECREF(parentname);
 
2707
                subname++;
 
2708
                path = PyObject_GetAttrString(parent, "__path__");
 
2709
                if (path == NULL)
 
2710
                        PyErr_Clear();
 
2711
        }
 
2712
        buf[0] = '\0';
 
2713
        fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
 
2714
        Py_XDECREF(path);
 
2715
 
 
2716
        if (fdp == NULL) {
 
2717
                Py_XDECREF(loader);
 
2718
                imp_modules_reloading_clear();
 
2719
                return NULL;
 
2720
        }
 
2721
 
 
2722
        newm = load_module(name, fp, buf, fdp->type, loader);
 
2723
        Py_XDECREF(loader);
 
2724
 
 
2725
        if (fp)
 
2726
                fclose(fp);
 
2727
        if (newm == NULL) {
 
2728
                /* load_module probably removed name from modules because of
 
2729
                 * the error.  Put back the original module object.  We're
 
2730
                 * going to return NULL in this case regardless of whether
 
2731
                 * replacing name succeeds, so the return value is ignored.
 
2732
                 */
 
2733
                PyDict_SetItemString(modules, name, m);
 
2734
        }
 
2735
        imp_modules_reloading_clear();
 
2736
        return newm;
 
2737
}
 
2738
 
 
2739
 
 
2740
/* Higher-level import emulator which emulates the "import" statement
 
2741
   more accurately -- it invokes the __import__() function from the
 
2742
   builtins of the current globals.  This means that the import is
 
2743
   done using whatever import hooks are installed in the current
 
2744
   environment, e.g. by "rexec".
 
2745
   A dummy list ["__doc__"] is passed as the 4th argument so that
 
2746
   e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
 
2747
   will return <module "gencache"> instead of <module "win32com">. */
 
2748
 
 
2749
PyObject *
 
2750
PyImport_Import(PyObject *module_name)
 
2751
{
 
2752
        static PyObject *silly_list = NULL;
 
2753
        static PyObject *builtins_str = NULL;
 
2754
        static PyObject *import_str = NULL;
 
2755
        PyObject *globals = NULL;
 
2756
        PyObject *import = NULL;
 
2757
        PyObject *builtins = NULL;
 
2758
        PyObject *r = NULL;
 
2759
 
 
2760
        /* Initialize constant string objects */
 
2761
        if (silly_list == NULL) {
 
2762
                import_str = PyUnicode_InternFromString("__import__");
 
2763
                if (import_str == NULL)
 
2764
                        return NULL;
 
2765
                builtins_str = PyUnicode_InternFromString("__builtins__");
 
2766
                if (builtins_str == NULL)
 
2767
                        return NULL;
 
2768
                silly_list = Py_BuildValue("[s]", "__doc__");
 
2769
                if (silly_list == NULL)
 
2770
                        return NULL;
 
2771
        }
 
2772
 
 
2773
        /* Get the builtins from current globals */
 
2774
        globals = PyEval_GetGlobals();
 
2775
        if (globals != NULL) {
 
2776
                Py_INCREF(globals);
 
2777
                builtins = PyObject_GetItem(globals, builtins_str);
 
2778
                if (builtins == NULL)
 
2779
                        goto err;
 
2780
        }
 
2781
        else {
 
2782
                /* No globals -- use standard builtins, and fake globals */
 
2783
                PyErr_Clear();
 
2784
 
 
2785
                builtins = PyImport_ImportModuleLevel("builtins",
 
2786
                                                      NULL, NULL, NULL, 0);
 
2787
                if (builtins == NULL)
 
2788
                        return NULL;
 
2789
                globals = Py_BuildValue("{OO}", builtins_str, builtins);
 
2790
                if (globals == NULL)
 
2791
                        goto err;
 
2792
        }
 
2793
 
 
2794
        /* Get the __import__ function from the builtins */
 
2795
        if (PyDict_Check(builtins)) {
 
2796
                import = PyObject_GetItem(builtins, import_str);
 
2797
                if (import == NULL)
 
2798
                        PyErr_SetObject(PyExc_KeyError, import_str);
 
2799
        }
 
2800
        else
 
2801
                import = PyObject_GetAttr(builtins, import_str);
 
2802
        if (import == NULL)
 
2803
                goto err;
 
2804
 
 
2805
        /* Call the __import__ function with the proper argument list
 
2806
         * Always use absolute import here. */
 
2807
        r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
 
2808
                                  globals, silly_list, 0, NULL);
 
2809
 
 
2810
  err:
 
2811
        Py_XDECREF(globals);
 
2812
        Py_XDECREF(builtins);
 
2813
        Py_XDECREF(import);
 
2814
 
 
2815
        return r;
 
2816
}
 
2817
 
 
2818
 
 
2819
/* Module 'imp' provides Python access to the primitives used for
 
2820
   importing modules.
 
2821
*/
 
2822
 
 
2823
static PyObject *
 
2824
imp_get_magic(PyObject *self, PyObject *noargs)
 
2825
{
 
2826
        char buf[4];
 
2827
 
 
2828
        buf[0] = (char) ((pyc_magic >>  0) & 0xff);
 
2829
        buf[1] = (char) ((pyc_magic >>  8) & 0xff);
 
2830
        buf[2] = (char) ((pyc_magic >> 16) & 0xff);
 
2831
        buf[3] = (char) ((pyc_magic >> 24) & 0xff);
 
2832
 
 
2833
        return PyBytes_FromStringAndSize(buf, 4);
 
2834
}
 
2835
 
 
2836
static PyObject *
 
2837
imp_get_suffixes(PyObject *self, PyObject *noargs)
 
2838
{
 
2839
        PyObject *list;
 
2840
        struct filedescr *fdp;
 
2841
 
 
2842
        list = PyList_New(0);
 
2843
        if (list == NULL)
 
2844
                return NULL;
 
2845
        for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
 
2846
                PyObject *item = Py_BuildValue("ssi",
 
2847
                                       fdp->suffix, fdp->mode, fdp->type);
 
2848
                if (item == NULL) {
 
2849
                        Py_DECREF(list);
 
2850
                        return NULL;
 
2851
                }
 
2852
                if (PyList_Append(list, item) < 0) {
 
2853
                        Py_DECREF(list);
 
2854
                        Py_DECREF(item);
 
2855
                        return NULL;
 
2856
                }
 
2857
                Py_DECREF(item);
 
2858
        }
 
2859
        return list;
 
2860
}
 
2861
 
 
2862
static PyObject *
 
2863
call_find_module(char *name, PyObject *path)
 
2864
{
 
2865
        extern int fclose(FILE *);
 
2866
        PyObject *fob, *ret;
 
2867
        PyObject *pathobj;
 
2868
        struct filedescr *fdp;
 
2869
        char pathname[MAXPATHLEN+1];
 
2870
        FILE *fp = NULL;
 
2871
        int fd = -1;
 
2872
        char *found_encoding = NULL;
 
2873
        char *encoding = NULL;
 
2874
 
 
2875
        pathname[0] = '\0';
 
2876
        if (path == Py_None)
 
2877
                path = NULL;
 
2878
        fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
 
2879
        if (fdp == NULL)
 
2880
                return NULL;
 
2881
        if (fp != NULL) {
 
2882
                fd = fileno(fp);
 
2883
                if (fd != -1)
 
2884
                        fd = dup(fd);
 
2885
                fclose(fp);
 
2886
                fp = NULL;
 
2887
        }
 
2888
        if (fd != -1) {
 
2889
                if (strchr(fdp->mode, 'b') == NULL) {
 
2890
                        /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
 
2891
                           memory. */
 
2892
                        found_encoding = PyTokenizer_FindEncoding(fd);
 
2893
                        lseek(fd, 0, 0); /* Reset position */
 
2894
                        if (found_encoding == NULL && PyErr_Occurred())
 
2895
                                return NULL;
 
2896
                        encoding = (found_encoding != NULL) ? found_encoding :
 
2897
                                   (char*)PyUnicode_GetDefaultEncoding();
 
2898
                }
 
2899
                fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
 
2900
                                    (char*)encoding, NULL, NULL, 1);
 
2901
                if (fob == NULL) {
 
2902
                        close(fd);
 
2903
                        PyMem_FREE(found_encoding);
 
2904
                        return NULL;
 
2905
                }
 
2906
        }
 
2907
        else {
 
2908
                fob = Py_None;
 
2909
                Py_INCREF(fob);
 
2910
        }
 
2911
        pathobj = PyUnicode_DecodeFSDefault(pathname);
 
2912
        ret = Py_BuildValue("NN(ssi)",
 
2913
                      fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
 
2914
        PyMem_FREE(found_encoding);
 
2915
 
 
2916
        return ret;
 
2917
}
 
2918
 
 
2919
static PyObject *
 
2920
imp_find_module(PyObject *self, PyObject *args)
 
2921
{
 
2922
        char *name;
 
2923
        PyObject *ret, *path = NULL;
 
2924
        if (!PyArg_ParseTuple(args, "es|O:find_module",
 
2925
                              Py_FileSystemDefaultEncoding, &name,
 
2926
                              &path))
 
2927
                return NULL;
 
2928
        ret = call_find_module(name, path);
 
2929
        PyMem_Free(name);
 
2930
        return ret;
 
2931
}
 
2932
 
 
2933
static PyObject *
 
2934
imp_init_builtin(PyObject *self, PyObject *args)
 
2935
{
 
2936
        char *name;
 
2937
        int ret;
 
2938
        PyObject *m;
 
2939
        if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
 
2940
                return NULL;
 
2941
        ret = init_builtin(name);
 
2942
        if (ret < 0)
 
2943
                return NULL;
 
2944
        if (ret == 0) {
 
2945
                Py_INCREF(Py_None);
 
2946
                return Py_None;
 
2947
        }
 
2948
        m = PyImport_AddModule(name);
 
2949
        Py_XINCREF(m);
 
2950
        return m;
 
2951
}
 
2952
 
 
2953
static PyObject *
 
2954
imp_init_frozen(PyObject *self, PyObject *args)
 
2955
{
 
2956
        char *name;
 
2957
        int ret;
 
2958
        PyObject *m;
 
2959
        if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
 
2960
                return NULL;
 
2961
        ret = PyImport_ImportFrozenModule(name);
 
2962
        if (ret < 0)
 
2963
                return NULL;
 
2964
        if (ret == 0) {
 
2965
                Py_INCREF(Py_None);
 
2966
                return Py_None;
 
2967
        }
 
2968
        m = PyImport_AddModule(name);
 
2969
        Py_XINCREF(m);
 
2970
        return m;
 
2971
}
 
2972
 
 
2973
static PyObject *
 
2974
imp_get_frozen_object(PyObject *self, PyObject *args)
 
2975
{
 
2976
        char *name;
 
2977
 
 
2978
        if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
 
2979
                return NULL;
 
2980
        return get_frozen_object(name);
 
2981
}
 
2982
 
 
2983
static PyObject *
 
2984
imp_is_frozen_package(PyObject *self, PyObject *args)
 
2985
{
 
2986
        char *name;
 
2987
 
 
2988
        if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
 
2989
                return NULL;
 
2990
        return is_frozen_package(name);
 
2991
}
 
2992
 
 
2993
static PyObject *
 
2994
imp_is_builtin(PyObject *self, PyObject *args)
 
2995
{
 
2996
        char *name;
 
2997
        if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
 
2998
                return NULL;
 
2999
        return PyLong_FromLong(is_builtin(name));
 
3000
}
 
3001
 
 
3002
static PyObject *
 
3003
imp_is_frozen(PyObject *self, PyObject *args)
 
3004
{
 
3005
        char *name;
 
3006
        struct _frozen *p;
 
3007
        if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
 
3008
                return NULL;
 
3009
        p = find_frozen(name);
 
3010
        return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
 
3011
}
 
3012
 
 
3013
static FILE *
 
3014
get_file(char *pathname, PyObject *fob, char *mode)
 
3015
{
 
3016
        FILE *fp;
 
3017
        if (mode[0] == 'U')
 
3018
                mode = "r" PY_STDIOTEXTMODE;
 
3019
        if (fob == NULL) {
 
3020
                fp = fopen(pathname, mode);
 
3021
        }
 
3022
        else {
 
3023
                int fd = PyObject_AsFileDescriptor(fob);
 
3024
                if (fd == -1)
 
3025
                        return NULL;
 
3026
                /* XXX This will leak a FILE struct. Fix this!!!!
 
3027
                   (But it doesn't leak a file descrioptor!) */
 
3028
                fp = fdopen(fd, mode);
 
3029
        }
 
3030
        if (fp == NULL)
 
3031
                PyErr_SetFromErrno(PyExc_IOError);
 
3032
        return fp;
 
3033
}
 
3034
 
 
3035
static PyObject *
 
3036
imp_load_compiled(PyObject *self, PyObject *args)
 
3037
{
 
3038
        char *name;
 
3039
        char *pathname;
 
3040
        PyObject *fob = NULL;
 
3041
        PyObject *m;
 
3042
        FILE *fp;
 
3043
        if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
 
3044
                              &name, &pathname, &fob))
 
3045
                return NULL;
 
3046
        fp = get_file(pathname, fob, "rb");
 
3047
        if (fp == NULL)
 
3048
                return NULL;
 
3049
        m = load_compiled_module(name, pathname, fp);
 
3050
        if (fob == NULL)
 
3051
                fclose(fp);
 
3052
        return m;
 
3053
}
 
3054
 
 
3055
#ifdef HAVE_DYNAMIC_LOADING
 
3056
 
 
3057
static PyObject *
 
3058
imp_load_dynamic(PyObject *self, PyObject *args)
 
3059
{
 
3060
        char *name;
 
3061
        char *pathname;
 
3062
        PyObject *fob = NULL;
 
3063
        PyObject *m;
 
3064
        FILE *fp = NULL;
 
3065
        if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
 
3066
                              &name, &pathname, &fob))
 
3067
                return NULL;
 
3068
        if (fob) {
 
3069
                fp = get_file(pathname, fob, "r");
 
3070
                if (fp == NULL)
 
3071
                        return NULL;
 
3072
        }
 
3073
        m = _PyImport_LoadDynamicModule(name, pathname, fp);
 
3074
        return m;
 
3075
}
 
3076
 
 
3077
#endif /* HAVE_DYNAMIC_LOADING */
 
3078
 
 
3079
static PyObject *
 
3080
imp_load_source(PyObject *self, PyObject *args)
 
3081
{
 
3082
        char *name;
 
3083
        char *pathname;
 
3084
        PyObject *fob = NULL;
 
3085
        PyObject *m;
 
3086
        FILE *fp;
 
3087
        if (!PyArg_ParseTuple(args, "ss|O:load_source",
 
3088
                              &name, &pathname, &fob))
 
3089
                return NULL;
 
3090
        fp = get_file(pathname, fob, "r");
 
3091
        if (fp == NULL)
 
3092
                return NULL;
 
3093
        m = load_source_module(name, pathname, fp);
 
3094
        if (fob == NULL)
 
3095
                fclose(fp);
 
3096
        return m;
 
3097
}
 
3098
 
 
3099
static PyObject *
 
3100
imp_load_module(PyObject *self, PyObject *args)
 
3101
{
 
3102
        char *name;
 
3103
        PyObject *fob;
 
3104
        char *pathname;
 
3105
        char *suffix; /* Unused */
 
3106
        char *mode;
 
3107
        int type;
 
3108
        FILE *fp;
 
3109
 
 
3110
        if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
 
3111
                              &name, &fob, &pathname,
 
3112
                              &suffix, &mode, &type))
 
3113
                return NULL;
 
3114
        if (*mode) {
 
3115
                /* Mode must start with 'r' or 'U' and must not contain '+'.
 
3116
                   Implicit in this test is the assumption that the mode
 
3117
                   may contain other modifiers like 'b' or 't'. */
 
3118
 
 
3119
                if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
 
3120
                        PyErr_Format(PyExc_ValueError,
 
3121
                                     "invalid file open mode %.200s", mode);
 
3122
                        return NULL;
 
3123
                }
 
3124
        }
 
3125
        if (fob == Py_None)
 
3126
                fp = NULL;
 
3127
        else {
 
3128
                fp = get_file(NULL, fob, mode);
 
3129
                if (fp == NULL)
 
3130
                        return NULL;
 
3131
        }
 
3132
        return load_module(name, fp, pathname, type, NULL);
 
3133
}
 
3134
 
 
3135
static PyObject *
 
3136
imp_load_package(PyObject *self, PyObject *args)
 
3137
{
 
3138
        char *name;
 
3139
        char *pathname;
 
3140
        if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
 
3141
                return NULL;
 
3142
        return load_package(name, pathname);
 
3143
}
 
3144
 
 
3145
static PyObject *
 
3146
imp_new_module(PyObject *self, PyObject *args)
 
3147
{
 
3148
        char *name;
 
3149
        if (!PyArg_ParseTuple(args, "s:new_module", &name))
 
3150
                return NULL;
 
3151
        return PyModule_New(name);
 
3152
}
 
3153
 
 
3154
static PyObject *
 
3155
imp_reload(PyObject *self, PyObject *v)
 
3156
{
 
3157
        return PyImport_ReloadModule(v);
 
3158
}
 
3159
 
 
3160
PyDoc_STRVAR(doc_reload,
 
3161
"reload(module) -> module\n\
 
3162
\n\
 
3163
Reload the module.  The module must have been successfully imported before.");
 
3164
 
 
3165
/* Doc strings */
 
3166
 
 
3167
PyDoc_STRVAR(doc_imp,
 
3168
"This module provides the components needed to build your own\n\
 
3169
__import__ function.  Undocumented functions are obsolete.");
 
3170
 
 
3171
PyDoc_STRVAR(doc_find_module,
 
3172
"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
 
3173
Search for a module.  If path is omitted or None, search for a\n\
 
3174
built-in, frozen or special module and continue search in sys.path.\n\
 
3175
The module name cannot contain '.'; to search for a submodule of a\n\
 
3176
package, pass the submodule name and the package's __path__.");
 
3177
 
 
3178
PyDoc_STRVAR(doc_load_module,
 
3179
"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
 
3180
Load a module, given information returned by find_module().\n\
 
3181
The module name must include the full package name, if any.");
 
3182
 
 
3183
PyDoc_STRVAR(doc_get_magic,
 
3184
"get_magic() -> string\n\
 
3185
Return the magic number for .pyc or .pyo files.");
 
3186
 
 
3187
PyDoc_STRVAR(doc_get_suffixes,
 
3188
"get_suffixes() -> [(suffix, mode, type), ...]\n\
 
3189
Return a list of (suffix, mode, type) tuples describing the files\n\
 
3190
that find_module() looks for.");
 
3191
 
 
3192
PyDoc_STRVAR(doc_new_module,
 
3193
"new_module(name) -> module\n\
 
3194
Create a new module.  Do not enter it in sys.modules.\n\
 
3195
The module name must include the full package name, if any.");
 
3196
 
 
3197
PyDoc_STRVAR(doc_lock_held,
 
3198
"lock_held() -> boolean\n\
 
3199
Return True if the import lock is currently held, else False.\n\
 
3200
On platforms without threads, return False.");
 
3201
 
 
3202
PyDoc_STRVAR(doc_acquire_lock,
 
3203
"acquire_lock() -> None\n\
 
3204
Acquires the interpreter's import lock for the current thread.\n\
 
3205
This lock should be used by import hooks to ensure thread-safety\n\
 
3206
when importing modules.\n\
 
3207
On platforms without threads, this function does nothing.");
 
3208
 
 
3209
PyDoc_STRVAR(doc_release_lock,
 
3210
"release_lock() -> None\n\
 
3211
Release the interpreter's import lock.\n\
 
3212
On platforms without threads, this function does nothing.");
 
3213
 
 
3214
static PyMethodDef imp_methods[] = {
 
3215
        {"find_module",  imp_find_module,  METH_VARARGS, doc_find_module},
 
3216
        {"get_magic",    imp_get_magic,    METH_NOARGS,  doc_get_magic},
 
3217
        {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes},
 
3218
        {"load_module",  imp_load_module,  METH_VARARGS, doc_load_module},
 
3219
        {"new_module",   imp_new_module,   METH_VARARGS, doc_new_module},
 
3220
        {"lock_held",    imp_lock_held,    METH_NOARGS,  doc_lock_held},
 
3221
        {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock},
 
3222
        {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock},
 
3223
        {"reload",       imp_reload,       METH_O,       doc_reload},
 
3224
        /* The rest are obsolete */
 
3225
        {"get_frozen_object",   imp_get_frozen_object,  METH_VARARGS},
 
3226
        {"is_frozen_package",   imp_is_frozen_package,  METH_VARARGS},
 
3227
        {"init_builtin",        imp_init_builtin,       METH_VARARGS},
 
3228
        {"init_frozen",         imp_init_frozen,        METH_VARARGS},
 
3229
        {"is_builtin",          imp_is_builtin,         METH_VARARGS},
 
3230
        {"is_frozen",           imp_is_frozen,          METH_VARARGS},
 
3231
        {"load_compiled",       imp_load_compiled,      METH_VARARGS},
 
3232
#ifdef HAVE_DYNAMIC_LOADING
 
3233
        {"load_dynamic",        imp_load_dynamic,       METH_VARARGS},
 
3234
#endif
 
3235
        {"load_package",        imp_load_package,       METH_VARARGS},
 
3236
        {"load_source",         imp_load_source,        METH_VARARGS},
 
3237
        {NULL,                  NULL}           /* sentinel */
 
3238
};
 
3239
 
 
3240
static int
 
3241
setint(PyObject *d, char *name, int value)
 
3242
{
 
3243
        PyObject *v;
 
3244
        int err;
 
3245
 
 
3246
        v = PyLong_FromLong((long)value);
 
3247
        err = PyDict_SetItemString(d, name, v);
 
3248
        Py_XDECREF(v);
 
3249
        return err;
 
3250
}
 
3251
 
 
3252
typedef struct {
 
3253
    PyObject_HEAD
 
3254
} NullImporter;
 
3255
 
 
3256
static int
 
3257
NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
 
3258
{
 
3259
        char *path;
 
3260
        Py_ssize_t pathlen;
 
3261
 
 
3262
        if (!_PyArg_NoKeywords("NullImporter()", kwds))
 
3263
                return -1;
 
3264
 
 
3265
        if (!PyArg_ParseTuple(args, "es:NullImporter",
 
3266
                              Py_FileSystemDefaultEncoding, &path))
 
3267
                return -1;
 
3268
 
 
3269
        pathlen = strlen(path);
 
3270
        if (pathlen == 0) {
 
3271
                PyMem_Free(path);
 
3272
                PyErr_SetString(PyExc_ImportError, "empty pathname");
 
3273
                return -1;
 
3274
        } else {
 
3275
#ifndef MS_WINDOWS
 
3276
                struct stat statbuf;
 
3277
                int rv;
 
3278
 
 
3279
                rv = stat(path, &statbuf);
 
3280
                PyMem_Free(path);
 
3281
                if (rv == 0) {
 
3282
                        /* it exists */
 
3283
                        if (S_ISDIR(statbuf.st_mode)) {
 
3284
                                /* it's a directory */
 
3285
                                PyErr_SetString(PyExc_ImportError,
 
3286
                                                "existing directory");
 
3287
                                return -1;
 
3288
                        }
 
3289
                }
 
3290
#else /* MS_WINDOWS */
 
3291
                DWORD rv;
 
3292
                /* see issue1293 and issue3677:
 
3293
                 * stat() on Windows doesn't recognise paths like
 
3294
                 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
 
3295
                 */
 
3296
                rv = GetFileAttributesA(path);
 
3297
                PyMem_Free(path);
 
3298
                if (rv != INVALID_FILE_ATTRIBUTES) {
 
3299
                        /* it exists */
 
3300
                        if (rv & FILE_ATTRIBUTE_DIRECTORY) {
 
3301
                                /* it's a directory */
 
3302
                                PyErr_SetString(PyExc_ImportError,
 
3303
                                                "existing directory");
 
3304
                                return -1;
 
3305
                        }
 
3306
                }
 
3307
#endif
 
3308
        }
 
3309
        return 0;
 
3310
}
 
3311
 
 
3312
static PyObject *
 
3313
NullImporter_find_module(NullImporter *self, PyObject *args)
 
3314
{
 
3315
        Py_RETURN_NONE;
 
3316
}
 
3317
 
 
3318
static PyMethodDef NullImporter_methods[] = {
 
3319
        {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
 
3320
         "Always return None"
 
3321
        },
 
3322
        {NULL}  /* Sentinel */
 
3323
};
 
3324
 
 
3325
 
 
3326
PyTypeObject PyNullImporter_Type = {
 
3327
        PyVarObject_HEAD_INIT(NULL, 0)
 
3328
        "imp.NullImporter",        /*tp_name*/
 
3329
        sizeof(NullImporter),      /*tp_basicsize*/
 
3330
        0,                         /*tp_itemsize*/
 
3331
        0,                         /*tp_dealloc*/
 
3332
        0,                         /*tp_print*/
 
3333
        0,                         /*tp_getattr*/
 
3334
        0,                         /*tp_setattr*/
 
3335
        0,                         /*tp_reserved*/
 
3336
        0,                         /*tp_repr*/
 
3337
        0,                         /*tp_as_number*/
 
3338
        0,                         /*tp_as_sequence*/
 
3339
        0,                         /*tp_as_mapping*/
 
3340
        0,                         /*tp_hash */
 
3341
        0,                         /*tp_call*/
 
3342
        0,                         /*tp_str*/
 
3343
        0,                         /*tp_getattro*/
 
3344
        0,                         /*tp_setattro*/
 
3345
        0,                         /*tp_as_buffer*/
 
3346
        Py_TPFLAGS_DEFAULT,        /*tp_flags*/
 
3347
        "Null importer object",    /* tp_doc */
 
3348
        0,                         /* tp_traverse */
 
3349
        0,                         /* tp_clear */
 
3350
        0,                         /* tp_richcompare */
 
3351
        0,                         /* tp_weaklistoffset */
 
3352
        0,                         /* tp_iter */
 
3353
        0,                         /* tp_iternext */
 
3354
        NullImporter_methods,      /* tp_methods */
 
3355
        0,                         /* tp_members */
 
3356
        0,                         /* tp_getset */
 
3357
        0,                         /* tp_base */
 
3358
        0,                         /* tp_dict */
 
3359
        0,                         /* tp_descr_get */
 
3360
        0,                         /* tp_descr_set */
 
3361
        0,                         /* tp_dictoffset */
 
3362
        (initproc)NullImporter_init,      /* tp_init */
 
3363
        0,                         /* tp_alloc */
 
3364
        PyType_GenericNew          /* tp_new */
 
3365
};
 
3366
 
 
3367
static struct PyModuleDef impmodule = {
 
3368
        PyModuleDef_HEAD_INIT,
 
3369
        "imp",
 
3370
        doc_imp,
 
3371
        0,
 
3372
        imp_methods,
 
3373
        NULL,
 
3374
        NULL,
 
3375
        NULL,
 
3376
        NULL
 
3377
};
 
3378
 
 
3379
PyMODINIT_FUNC
 
3380
PyInit_imp(void)
 
3381
{
 
3382
        PyObject *m, *d;
 
3383
 
 
3384
        if (PyType_Ready(&PyNullImporter_Type) < 0)
 
3385
                return NULL;
 
3386
 
 
3387
        m = PyModule_Create(&impmodule);
 
3388
        if (m == NULL)
 
3389
                goto failure;
 
3390
        d = PyModule_GetDict(m);
 
3391
        if (d == NULL)
 
3392
                goto failure;
 
3393
 
 
3394
        if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
 
3395
        if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
 
3396
        if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
 
3397
        if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
 
3398
        if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
 
3399
        if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
 
3400
        if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
 
3401
        if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
 
3402
        if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
 
3403
        if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
 
3404
 
 
3405
        Py_INCREF(&PyNullImporter_Type);
 
3406
        PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
 
3407
        return m;
 
3408
  failure:
 
3409
        Py_XDECREF(m);
 
3410
        return NULL;
 
3411
 
 
3412
}
 
3413
 
 
3414
 
 
3415
/* API for embedding applications that want to add their own entries
 
3416
   to the table of built-in modules.  This should normally be called
 
3417
   *before* Py_Initialize().  When the table resize fails, -1 is
 
3418
   returned and the existing table is unchanged.
 
3419
 
 
3420
   After a similar function by Just van Rossum. */
 
3421
 
 
3422
int
 
3423
PyImport_ExtendInittab(struct _inittab *newtab)
 
3424
{
 
3425
        static struct _inittab *our_copy = NULL;
 
3426
        struct _inittab *p;
 
3427
        int i, n;
 
3428
 
 
3429
        /* Count the number of entries in both tables */
 
3430
        for (n = 0; newtab[n].name != NULL; n++)
 
3431
                ;
 
3432
        if (n == 0)
 
3433
                return 0; /* Nothing to do */
 
3434
        for (i = 0; PyImport_Inittab[i].name != NULL; i++)
 
3435
                ;
 
3436
 
 
3437
        /* Allocate new memory for the combined table */
 
3438
        p = our_copy;
 
3439
        PyMem_RESIZE(p, struct _inittab, i+n+1);
 
3440
        if (p == NULL)
 
3441
                return -1;
 
3442
 
 
3443
        /* Copy the tables into the new memory */
 
3444
        if (our_copy != PyImport_Inittab)
 
3445
                memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
 
3446
        PyImport_Inittab = our_copy = p;
 
3447
        memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
 
3448
 
 
3449
        return 0;
 
3450
}
 
3451
 
 
3452
/* Shorthand to add a single entry given a name and a function */
 
3453
 
 
3454
int
 
3455
PyImport_AppendInittab(char *name, PyObject* (*initfunc)(void))
 
3456
{
 
3457
        struct _inittab newtab[2];
 
3458
 
 
3459
        memset(newtab, '\0', sizeof newtab);
 
3460
 
 
3461
        newtab[0].name = name;
 
3462
        newtab[0].initfunc = initfunc;
 
3463
 
 
3464
        return PyImport_ExtendInittab(newtab);
 
3465
}
 
3466
 
 
3467
#ifdef __cplusplus
 
3468
}
 
3469
#endif