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