3333import static com .oracle .graal .python .nodes .BuiltinNames .T_STDERR ;
3434import static com .oracle .graal .python .nodes .BuiltinNames .T_SYS ;
3535import static com .oracle .graal .python .nodes .BuiltinNames .T__WEAKREF ;
36+ import static com .oracle .graal .python .nodes .BuiltinNames .T___BUILTINS__ ;
3637import static com .oracle .graal .python .nodes .BuiltinNames .T___IMPORT__ ;
3738import static com .oracle .graal .python .nodes .SpecialAttributeNames .T___PACKAGE__ ;
3839import static com .oracle .graal .python .nodes .SpecialMethodNames .T___REPR__ ;
112113import com .oracle .graal .python .builtins .modules .WarningsModuleBuiltins ;
113114import com .oracle .graal .python .builtins .modules .WeakRefModuleBuiltins ;
114115import com .oracle .graal .python .builtins .modules .WinregModuleBuiltins ;
115- import com .oracle .graal .python .builtins .modules .ZipImportModuleBuiltins ;
116116import com .oracle .graal .python .builtins .modules .ast .AstBuiltins ;
117117import com .oracle .graal .python .builtins .modules .ast .AstModuleBuiltins ;
118118import com .oracle .graal .python .builtins .modules .bz2 .BZ2CompressorBuiltins ;
221221import com .oracle .graal .python .builtins .modules .zlib .ZlibCompressBuiltins ;
222222import com .oracle .graal .python .builtins .modules .zlib .ZlibDecompressBuiltins ;
223223import com .oracle .graal .python .builtins .objects .NotImplementedBuiltins ;
224+ import com .oracle .graal .python .builtins .objects .PNone ;
224225import com .oracle .graal .python .builtins .objects .array .ArrayBuiltins ;
225226import com .oracle .graal .python .builtins .objects .bool .BoolBuiltins ;
226227import com .oracle .graal .python .builtins .objects .bytes .ByteArrayBuiltins ;
227228import com .oracle .graal .python .builtins .objects .bytes .BytesBuiltins ;
228229import com .oracle .graal .python .builtins .objects .cell .CellBuiltins ;
229230import com .oracle .graal .python .builtins .objects .code .CodeBuiltins ;
231+ import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes ;
230232import com .oracle .graal .python .builtins .objects .complex .ComplexBuiltins ;
231233import com .oracle .graal .python .builtins .objects .contextvars .ContextBuiltins ;
232234import com .oracle .graal .python .builtins .objects .contextvars .ContextVarBuiltins ;
296298import com .oracle .graal .python .builtins .objects .itertools .ZipLongestBuiltins ;
297299import com .oracle .graal .python .builtins .objects .keywrapper .KeyWrapperBuiltins ;
298300import com .oracle .graal .python .builtins .objects .list .ListBuiltins ;
301+ import com .oracle .graal .python .builtins .objects .list .PList ;
299302import com .oracle .graal .python .builtins .objects .map .MapBuiltins ;
300303import com .oracle .graal .python .builtins .objects .mappingproxy .MappingproxyBuiltins ;
301304import com .oracle .graal .python .builtins .objects .memoryview .BufferBuiltins ;
348351import com .oracle .graal .python .builtins .objects .type .SpecialMethodSlot ;
349352import com .oracle .graal .python .builtins .objects .type .TypeBuiltins ;
350353import com .oracle .graal .python .builtins .objects .types .GenericAliasBuiltins ;
351- import com .oracle .graal .python .builtins .objects .zipimporter .ZipImporterBuiltins ;
352354import com .oracle .graal .python .lib .PyDictSetItem ;
353355import com .oracle .graal .python .lib .PyObjectCallMethodObjArgs ;
354356import com .oracle .graal .python .lib .PyObjectLookupAttr ;
362364import com .oracle .graal .python .runtime .exception .PException ;
363365import com .oracle .graal .python .runtime .interop .PythonMapScope ;
364366import com .oracle .graal .python .runtime .object .PythonObjectSlowPathFactory ;
367+ import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
365368import com .oracle .graal .python .util .Supplier ;
366369import com .oracle .truffle .api .CallTarget ;
367370import com .oracle .truffle .api .CompilerDirectives ;
@@ -401,7 +404,6 @@ private static TruffleString[] initializeCoreFiles() {
401404 toTruffleStringUncached ("_sre" ),
402405 toTruffleStringUncached ("function" ),
403406 toTruffleStringUncached ("_sysconfig" ),
404- PythonOptions .WITHOUT_COMPRESSION_LIBRARIES ? null : toTruffleStringUncached ("zipimport" ),
405407 toTruffleStringUncached ("java" ),
406408 toTruffleStringUncached ("pip_hook" ),
407409 toTruffleStringUncached ("_struct" )));
@@ -652,8 +654,6 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
652654 PythonOptions .WITHOUT_PLATFORM_ACCESS ? null : new PosixSubprocessModuleBuiltins (),
653655 new ReadlineModuleBuiltins (),
654656 new OperatorModuleBuiltins (),
655- PythonOptions .WITHOUT_COMPRESSION_LIBRARIES ? null : new ZipImporterBuiltins (),
656- PythonOptions .WITHOUT_COMPRESSION_LIBRARIES ? null : new ZipImportModuleBuiltins (),
657657
658658 // hashlib
659659 PythonOptions .WITHOUT_DIGEST ? null : new Md5ModuleBuiltins (),
@@ -903,6 +903,8 @@ private void initializeImportlib() {
903903 loadFile (toTruffleStringUncached ("importlib/_bootstrap" ), getContext ().getStdlibHome (), bootstrap );
904904 } else {
905905 bootstrapExternal = ImpModuleBuiltins .importFrozenModuleObject (this , T__FROZEN_IMPORTLIB_EXTERNAL , true );
906+ setItem .execute (null , sysModules , T_IMPORTLIB_BOOTSTRAP , bootstrap );
907+ setItem .execute (null , sysModules , T_IMPORTLIB_BOOTSTRAP_EXTERNAL , bootstrapExternal );
906908 LOGGER .log (Level .FINE , () -> "import '" + T__FROZEN_IMPORTLIB + "' # <frozen>" );
907909 LOGGER .log (Level .FINE , () -> "import '" + T__FROZEN_IMPORTLIB_EXTERNAL + "' # <frozen>" );
908910 }
@@ -915,7 +917,51 @@ private void initializeImportlib() {
915917
916918 callNode .execute (null , bootstrap , toTruffleStringUncached ("_install" ), getSysModule (), lookupBuiltinModule (T__IMP ));
917919 writeNode .execute (getBuiltins (), T___IMPORT__ , readNode .execute (bootstrap , T___IMPORT__ ));
920+ // see CPython's init_importlib_external
918921 callNode .execute (null , bootstrap , toTruffleStringUncached ("_install_external_importers" ));
922+ if (!PythonOptions .WITHOUT_COMPRESSION_LIBRARIES ) {
923+ // see CPython's _PyImportZip_Init
924+ Object pathHooks = readNode .execute (sysModule , toTruffleStringUncached ("path_hooks" ));
925+ if (!(pathHooks instanceof PList pathHooksList )) {
926+ LOGGER .log (Level .FINE , () -> "unable to get sys.path_hooks" );
927+ LOGGER .log (Level .FINE , () -> "initializing zipimport failed" );
928+ } else {
929+ LOGGER .log (Level .FINE , () -> "# installing zipimport hook" );
930+ TruffleString t_zipimport = toTruffleStringUncached ("zipimport" );
931+ PythonModule zipimport = null ;
932+ if (!ImageInfo .inImageBuildtimeCode ()) {
933+ zipimport = ImpModuleBuiltins .importFrozenModuleObject (this , t_zipimport , false );
934+ }
935+ if (zipimport == null ) {
936+ // true when the frozen module is not available
937+ zipimport = createModule (t_zipimport );
938+ try {
939+ loadFile (t_zipimport , getContext ().getStdlibHome (), zipimport );
940+ } catch (PException e ) {
941+ zipimport = null ;
942+ removeBuiltinModule (t_zipimport );
943+ }
944+ } else {
945+ setItem .execute (null , sysModules , t_zipimport , zipimport );
946+ LOGGER .log (Level .FINE , () -> "import 'zipimport' # <frozen>" );
947+ }
948+ if (zipimport == null ) {
949+ LOGGER .log (Level .FINE , () -> "# can't import zipimport" );
950+ } else {
951+ writeNode .execute (zipimport , T___BUILTINS__ , getBuiltins ());
952+ Object zipimporter = readNode .execute (zipimport , toTruffleStringUncached ("zipimporter" ));
953+ if (zipimporter == PNone .NO_VALUE ) {
954+ LOGGER .log (Level .FINE , () -> "# can't import zipimport.zipimporter" );
955+ } else {
956+ SequenceStorageNodes .InsertItemNode insertItem = SequenceStorageNodes .InsertItemNode .getUncached ();
957+ SequenceStorage store = pathHooksList .getSequenceStorage ();
958+ pathHooksList .setSequenceStorage (insertItem .execute (store , 0 , zipimporter ));
959+ LOGGER .log (Level .FINE , () -> "# installed zipimport hook" );
960+ }
961+ }
962+ }
963+ }
964+
919965 importFunc = (PFunction ) readNode .execute (bootstrap , T___IMPORT__ );
920966 importlib = bootstrap ;
921967
0 commit comments